@nlabs/reaktor 1.9.0 → 1.9.1

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 (301) hide show
  1. package/README.md +58 -72
  2. package/docs/GENERATION.md +63 -0
  3. package/lib/actions/analytics.js +1 -1
  4. package/lib/actions/apps.d.ts +2 -2
  5. package/lib/actions/apps.js +1 -1
  6. package/lib/actions/connections.js +1 -1
  7. package/lib/actions/content.js +1 -1
  8. package/lib/actions/contentGeneration.d.ts +40 -0
  9. package/lib/actions/contentGeneration.js +206 -0
  10. package/lib/actions/conversations.js +1 -1
  11. package/lib/actions/crm.js +1 -1
  12. package/lib/actions/crud.d.ts +2 -2
  13. package/lib/actions/crud.js +1 -1
  14. package/lib/actions/dynamodb.js +1 -1
  15. package/lib/actions/email.js +1 -1
  16. package/lib/actions/files.d.ts +42 -4
  17. package/lib/actions/files.js +1 -1
  18. package/lib/actions/flags.js +1 -1
  19. package/lib/actions/geminiVideo.d.ts +19 -0
  20. package/lib/actions/geminiVideo.js +161 -0
  21. package/lib/actions/groups.js +1 -1
  22. package/lib/actions/higgsfield.d.ts +20 -0
  23. package/lib/actions/higgsfield.js +148 -0
  24. package/lib/actions/imageGeneration.d.ts +37 -0
  25. package/lib/actions/imageGeneration.js +121 -0
  26. package/lib/actions/images.js +1 -1
  27. package/lib/actions/index.d.ts +5 -0
  28. package/lib/actions/index.js +6 -1
  29. package/lib/actions/ios.js +1 -1
  30. package/lib/actions/locations.js +1 -1
  31. package/lib/actions/messages.js +1 -1
  32. package/lib/actions/notifications.js +1 -1
  33. package/lib/actions/payments.js +27 -26
  34. package/lib/actions/personas.d.ts +4 -4
  35. package/lib/actions/personas.js +1 -1
  36. package/lib/actions/posts.js +1 -1
  37. package/lib/actions/query.js +1 -1
  38. package/lib/actions/reactions.d.ts +6 -6
  39. package/lib/actions/reactions.js +1 -1
  40. package/lib/actions/rum.js +1 -1
  41. package/lib/actions/s3.d.ts +4 -4
  42. package/lib/actions/s3.js +22 -6
  43. package/lib/actions/search.js +1 -1
  44. package/lib/actions/sms.js +1 -1
  45. package/lib/actions/statistics.js +1 -1
  46. package/lib/actions/subscriptions.js +1 -1
  47. package/lib/actions/tags.d.ts +2 -2
  48. package/lib/actions/tags.js +1 -1
  49. package/lib/actions/users.d.ts +2 -2
  50. package/lib/actions/users.js +1 -1
  51. package/lib/actions/videoGeneration.d.ts +20 -0
  52. package/lib/actions/videoGeneration.js +32 -0
  53. package/lib/actions/videos.js +1 -1
  54. package/lib/adapters/arangoAdapter.js +1 -1
  55. package/lib/adapters/contentAdapter.js +1 -1
  56. package/lib/adapters/fileAdapter.js +1 -1
  57. package/lib/adapters/geminiGenerationAdapter.d.ts +34 -0
  58. package/lib/adapters/geminiGenerationAdapter.js +41 -0
  59. package/lib/adapters/higgsfieldAdapter.d.ts +120 -0
  60. package/lib/adapters/higgsfieldAdapter.js +131 -0
  61. package/lib/adapters/imageAdapter.js +1 -1
  62. package/lib/adapters/imageGenerationAdapter.d.ts +17 -0
  63. package/lib/adapters/imageGenerationAdapter.js +18 -0
  64. package/lib/adapters/index.d.ts +3 -0
  65. package/lib/adapters/index.js +4 -1
  66. package/lib/adapters/messageAdapter.js +1 -1
  67. package/lib/adapters/postAdapter.js +1 -1
  68. package/lib/adapters/reaktorAdapter.js +1 -1
  69. package/lib/adapters/tagAdapter.js +1 -1
  70. package/lib/adapters/userAdapter.d.ts +76 -1
  71. package/lib/adapters/userAdapter.js +1 -1
  72. package/lib/config.d.ts +19 -14
  73. package/lib/config.js +9 -1
  74. package/lib/constants/collections.js +1 -1
  75. package/lib/handlers/graphqlHandler.js +1 -1
  76. package/lib/index.d.ts +1 -1
  77. package/lib/index.js +2 -2
  78. package/lib/lambdas/actions/websockets.d.ts +5 -0
  79. package/lib/lambdas/actions/websockets.js +16 -1
  80. package/lib/lambdas/authorizer.js +1 -1
  81. package/lib/lambdas/connection.d.ts +2 -2
  82. package/lib/lambdas/connection.js +1 -1
  83. package/lib/lambdas/utils/message.js +1 -1
  84. package/lib/lambdas/utils/websocket.d.ts +4 -4
  85. package/lib/lambdas/utils/websocket.js +1 -1
  86. package/lib/mocks/conversation.js +1 -1
  87. package/lib/mocks/file.js +1 -1
  88. package/lib/mocks/group.js +1 -1
  89. package/lib/mocks/image.js +1 -1
  90. package/lib/mocks/post.js +1 -1
  91. package/lib/mocks/tag.js +1 -1
  92. package/lib/mocks/user.js +1 -1
  93. package/lib/mocks/video.js +1 -1
  94. package/lib/mutations/analytics/analytics.js +1 -1
  95. package/lib/mutations/content/content.js +15 -1
  96. package/lib/mutations/crm/crm.js +1 -1
  97. package/lib/mutations/events/events.js +1 -1
  98. package/lib/mutations/flags/flags.js +1 -1
  99. package/lib/mutations/groups/groups.js +1 -1
  100. package/lib/mutations/higgsfield/higgsfield.d.ts +1 -0
  101. package/lib/mutations/higgsfield/higgsfield.js +62 -0
  102. package/lib/mutations/images/images.js +10 -1
  103. package/lib/mutations/index.d.ts +2 -1
  104. package/lib/mutations/index.js +11 -2
  105. package/lib/mutations/locations/locations.js +1 -1
  106. package/lib/mutations/messages/messages.js +1 -1
  107. package/lib/mutations/personas/personas.js +1 -1
  108. package/lib/mutations/posts/posts.js +1 -1
  109. package/lib/mutations/reactions/reactions.js +1 -1
  110. package/lib/mutations/rum/rum.js +1 -1
  111. package/lib/mutations/statistics/statistics.js +1 -1
  112. package/lib/mutations/subscriptions/subscriptions.js +1 -1
  113. package/lib/mutations/tags/tags.js +1 -1
  114. package/lib/mutations/users/users.js +1 -1
  115. package/lib/mutations/videos/videos.js +24 -10
  116. package/lib/objectTypes/analytics.js +1 -1
  117. package/lib/objectTypes/app.js +1 -1
  118. package/lib/objectTypes/bankAccount.js +1 -1
  119. package/lib/objectTypes/connection.js +1 -1
  120. package/lib/objectTypes/content.js +1 -1
  121. package/lib/objectTypes/contentGeneration.d.ts +2 -0
  122. package/lib/objectTypes/contentGeneration.js +30 -0
  123. package/lib/objectTypes/conversation.js +1 -1
  124. package/lib/objectTypes/creditCard.js +1 -1
  125. package/lib/objectTypes/crm.js +1 -1
  126. package/lib/objectTypes/document.js +1 -1
  127. package/lib/objectTypes/error.js +1 -1
  128. package/lib/objectTypes/event.js +1 -1
  129. package/lib/objectTypes/external.js +1 -1
  130. package/lib/objectTypes/file.js +1 -1
  131. package/lib/objectTypes/filter.js +1 -1
  132. package/lib/objectTypes/flag.js +1 -1
  133. package/lib/objectTypes/group.js +1 -1
  134. package/lib/objectTypes/higgsfield.d.ts +5 -0
  135. package/lib/objectTypes/higgsfield.js +149 -0
  136. package/lib/objectTypes/iapSubscription.js +1 -1
  137. package/lib/objectTypes/image.js +1 -1
  138. package/lib/objectTypes/imageGeneration.d.ts +2 -0
  139. package/lib/objectTypes/imageGeneration.js +33 -0
  140. package/lib/objectTypes/index.d.ts +2 -0
  141. package/lib/objectTypes/index.js +3 -1
  142. package/lib/objectTypes/location.js +1 -1
  143. package/lib/objectTypes/message.js +1 -1
  144. package/lib/objectTypes/passcode.js +1 -1
  145. package/lib/objectTypes/persona.d.ts +37 -2
  146. package/lib/objectTypes/persona.js +1 -1
  147. package/lib/objectTypes/plan.js +1 -1
  148. package/lib/objectTypes/post.js +1 -1
  149. package/lib/objectTypes/query.js +1 -1
  150. package/lib/objectTypes/reaction.js +1 -1
  151. package/lib/objectTypes/relation.js +1 -1
  152. package/lib/objectTypes/rum.js +1 -1
  153. package/lib/objectTypes/search.js +1 -1
  154. package/lib/objectTypes/statistics.js +1 -1
  155. package/lib/objectTypes/subscription.js +1 -1
  156. package/lib/objectTypes/tag.js +1 -1
  157. package/lib/objectTypes/user.js +1 -1
  158. package/lib/objectTypes/video.js +1 -1
  159. package/lib/objectTypes/videoGeneration.d.ts +2 -0
  160. package/lib/objectTypes/videoGeneration.js +31 -0
  161. package/lib/queries/analytics/analytics.js +1 -1
  162. package/lib/queries/content/content.js +1 -1
  163. package/lib/queries/crm/crm.js +1 -1
  164. package/lib/queries/events/events.js +1 -1
  165. package/lib/queries/flags/flags.js +1 -1
  166. package/lib/queries/groups/groups.js +1 -1
  167. package/lib/queries/higgsfield/higgsfield.d.ts +1 -0
  168. package/lib/queries/higgsfield/higgsfield.js +22 -0
  169. package/lib/queries/images/images.js +1 -1
  170. package/lib/queries/index.d.ts +2 -1
  171. package/lib/queries/index.js +7 -2
  172. package/lib/queries/locations/locations.js +1 -1
  173. package/lib/queries/messages/messages.js +1 -1
  174. package/lib/queries/personas/personas.js +1 -1
  175. package/lib/queries/posts/posts.js +1 -1
  176. package/lib/queries/query/query.js +1 -1
  177. package/lib/queries/reactions/reactions.js +1 -1
  178. package/lib/queries/statistics/statistics.js +1 -1
  179. package/lib/queries/subscriptions/subscriptions.js +1 -1
  180. package/lib/queries/tags/tags.js +1 -1
  181. package/lib/queries/users/users.js +1 -1
  182. package/lib/queries/videos/videos.js +1 -1
  183. package/lib/templates/email/layout.js +1 -1
  184. package/lib/templates/email/passwordForgot.js +1 -1
  185. package/lib/templates/email/passwordRecovery.js +1 -1
  186. package/lib/templates/email/verifyEmail.js +1 -1
  187. package/lib/templates/email/welcome.js +1 -1
  188. package/lib/templates/sms/passwordForgot.js +1 -1
  189. package/lib/templates/sms/passwordRecovery.js +1 -1
  190. package/lib/templates/sms/verifyEmail.js +1 -1
  191. package/lib/templates/sms/verifyPhone.js +1 -1
  192. package/lib/templates/sms/welcome.js +1 -1
  193. package/lib/types/analytics.types.d.ts +16 -16
  194. package/lib/types/analytics.types.js +1 -1
  195. package/lib/types/apps.types.d.ts +4 -4
  196. package/lib/types/apps.types.js +1 -1
  197. package/lib/types/arangodb.types.d.ts +20 -20
  198. package/lib/types/arangodb.types.js +1 -1
  199. package/lib/types/auth.types.js +1 -1
  200. package/lib/types/connections.types.d.ts +2 -2
  201. package/lib/types/connections.types.js +1 -1
  202. package/lib/types/content.types.d.ts +6 -6
  203. package/lib/types/content.types.js +1 -1
  204. package/lib/types/conversations.types.d.ts +2 -2
  205. package/lib/types/conversations.types.js +1 -1
  206. package/lib/types/crm.types.d.ts +30 -30
  207. package/lib/types/crm.types.js +1 -1
  208. package/lib/types/email.types.d.ts +2 -2
  209. package/lib/types/email.types.js +1 -1
  210. package/lib/types/error.types.d.ts +1 -0
  211. package/lib/types/error.types.js +2 -1
  212. package/lib/types/files.types.d.ts +2 -2
  213. package/lib/types/files.types.js +1 -1
  214. package/lib/types/flags.types.d.ts +8 -8
  215. package/lib/types/flags.types.js +1 -1
  216. package/lib/types/google.types.js +1 -1
  217. package/lib/types/groups.types.d.ts +2 -2
  218. package/lib/types/groups.types.js +1 -1
  219. package/lib/types/images.types.d.ts +2 -2
  220. package/lib/types/images.types.js +1 -1
  221. package/lib/types/index.js +1 -1
  222. package/lib/types/locations.types.d.ts +2 -2
  223. package/lib/types/locations.types.js +1 -1
  224. package/lib/types/messages.types.d.ts +2 -2
  225. package/lib/types/messages.types.js +1 -1
  226. package/lib/types/notifications.types.js +1 -1
  227. package/lib/types/payments.types.d.ts +14 -14
  228. package/lib/types/payments.types.js +1 -1
  229. package/lib/types/personas.types.d.ts +2 -2
  230. package/lib/types/personas.types.js +1 -1
  231. package/lib/types/posts.types.d.ts +2 -2
  232. package/lib/types/posts.types.js +1 -1
  233. package/lib/types/rum.types.d.ts +6 -6
  234. package/lib/types/rum.types.js +1 -1
  235. package/lib/types/statistics.types.js +1 -1
  236. package/lib/types/tags.types.d.ts +4 -4
  237. package/lib/types/tags.types.js +1 -1
  238. package/lib/types/users.types.d.ts +2 -2
  239. package/lib/types/users.types.js +1 -1
  240. package/lib/types/videos.types.d.ts +2 -2
  241. package/lib/types/videos.types.js +1 -1
  242. package/lib/types/websockets.types.d.ts +4 -4
  243. package/lib/types/websockets.types.js +1 -1
  244. package/lib/upload.js +1 -1
  245. package/lib/utils/adapterUtils.js +1 -1
  246. package/lib/utils/analyticsUtils.js +1 -1
  247. package/lib/utils/appContext.js +1 -1
  248. package/lib/utils/aqlHelpers.js +1 -1
  249. package/lib/utils/arangodbUtils.js +1 -1
  250. package/lib/utils/authUtils.js +1 -1
  251. package/lib/utils/awsUtils.js +1 -1
  252. package/lib/utils/collectionRegistry.d.ts +2 -2
  253. package/lib/utils/collectionRegistry.js +1 -1
  254. package/lib/utils/contextUtils.js +1 -1
  255. package/lib/utils/dbI18n.example.js +1 -1
  256. package/lib/utils/dbI18n.js +1 -1
  257. package/lib/utils/googleTranslate.js +1 -1
  258. package/lib/utils/graphqlUtils.js +1 -1
  259. package/lib/utils/imageUtils.js +1 -1
  260. package/lib/utils/index.d.ts +3 -0
  261. package/lib/utils/index.js +4 -1
  262. package/lib/utils/languageDetection.js +1 -1
  263. package/lib/utils/localeUtils.example.js +1 -1
  264. package/lib/utils/localeUtils.js +1 -1
  265. package/lib/utils/mediaAccess.d.ts +5 -0
  266. package/lib/utils/mediaAccess.js +57 -0
  267. package/lib/utils/middlewareUtils.js +1 -1
  268. package/lib/utils/nodeRealtime.d.ts +14 -0
  269. package/lib/utils/nodeRealtime.js +84 -0
  270. package/lib/utils/opaqueToken.d.ts +4 -0
  271. package/lib/utils/opaqueToken.js +7 -0
  272. package/lib/utils/queryBuilder.js +1 -1
  273. package/lib/utils/schemaUtils.js +1 -1
  274. package/lib/utils/sessionUtils.js +1 -1
  275. package/lib/utils/stripeUtils.d.ts +1 -1
  276. package/lib/utils/stripeUtils.js +2 -3
  277. package/lib/utils/stripeUtils.ts.bak +12 -0
  278. package/lib/utils/templateUtils.js +1 -1
  279. package/lib/utils/testUtils.js +1 -1
  280. package/lib/utils/translationQueue.example.js +1 -1
  281. package/lib/utils/translationQueue.js +1 -1
  282. package/lib/videoProcessing.js +1 -1
  283. package/package.json +24 -23
  284. package/lib/durableChat/conversations.d.ts +0 -62
  285. package/lib/durableChat/conversations.js +0 -729
  286. package/lib/durableChat/errors.d.ts +0 -6
  287. package/lib/durableChat/errors.js +0 -11
  288. package/lib/durableChat/events.d.ts +0 -22
  289. package/lib/durableChat/events.js +0 -50
  290. package/lib/durableChat/index.d.ts +0 -8
  291. package/lib/durableChat/index.js +0 -10
  292. package/lib/durableChat/membership.d.ts +0 -24
  293. package/lib/durableChat/membership.js +0 -85
  294. package/lib/durableChat/messageTypes.d.ts +0 -76
  295. package/lib/durableChat/messageTypes.js +0 -3
  296. package/lib/durableChat/messages.d.ts +0 -16
  297. package/lib/durableChat/messages.js +0 -257
  298. package/lib/durableChat/transaction.d.ts +0 -10
  299. package/lib/durableChat/transaction.js +0 -53
  300. package/lib/durableChat/types.d.ts +0 -81
  301. package/lib/durableChat/types.js +0 -3
@@ -0,0 +1,121 @@
1
+ import { post } from '@nlabs/rip-hunter';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { validateGeminiImageInput } from '../adapters/geminiGenerationAdapter.js';
4
+ import { validateOpenAIImageInput } from '../adapters/imageGenerationAdapter.js';
5
+ import { Config } from '../config.js';
6
+ import { ContentGenerationRejectedError, generateContent } from './contentGeneration.js';
7
+ import { generateMarketingStudioImage, generateSoulImage } from './higgsfield.js';
8
+ /** Only an explicit provider rejection proves it is safe to release a reservation. */ export class ImageGenerationRejectedError extends Error {
9
+ }
10
+ export const generateOpenAIImage = async (_context, input, config)=>{
11
+ const validated = validateOpenAIImageInput(input);
12
+ const key = config?.key || Config.get('openai.apiKey');
13
+ if (!key) {
14
+ throw new Error('OpenAI image generation is not configured.');
15
+ }
16
+ const response = await post('https://api.openai.com/v1/images/generations', {
17
+ model: validated.model || config?.model || Config.get('openai.imageModel') || 'gpt-image-1.5',
18
+ n: 1,
19
+ output_format: 'png',
20
+ prompt: validated.prompt,
21
+ quality: validated.quality,
22
+ size: validated.size
23
+ }, {
24
+ cache: false,
25
+ headers: new Headers({
26
+ Authorization: `Bearer ${key}`
27
+ }),
28
+ timeout: 180_000
29
+ });
30
+ if (response.error && [
31
+ 'invalid_request_error',
32
+ 'authentication_error',
33
+ 'permission_error'
34
+ ].includes(response.error.type || '')) {
35
+ throw new ImageGenerationRejectedError('OpenAI rejected the image request. Check model access and prompt.');
36
+ }
37
+ const encoded = response.data?.[0]?.b64_json;
38
+ if (response.error || !encoded || encoded.length > 40 * 1024 * 1024 || !/^[A-Za-z0-9+/]+={0,2}$/.test(encoded)) {
39
+ throw new Error('OpenAI image output could not be verified.');
40
+ }
41
+ if (!Buffer.from(encoded, 'base64').subarray(0, 8).equals(Buffer.from([
42
+ 137,
43
+ 80,
44
+ 78,
45
+ 71,
46
+ 13,
47
+ 10,
48
+ 26,
49
+ 10
50
+ ]))) {
51
+ throw new Error('OpenAI did not return PNG image bytes.');
52
+ }
53
+ return {
54
+ imageBase64: encoded,
55
+ provider: 'openai',
56
+ requestId: `openai-${randomUUID()}`,
57
+ status: 'completed'
58
+ };
59
+ };
60
+ /** Provider selection is data; credentials and paid-job orchestration stay server-side. */ export const generateImage = async (context, input)=>{
61
+ const { provider, ...options } = input;
62
+ if (provider === 'gemini') {
63
+ return generateGeminiImage(context, options);
64
+ }
65
+ if (provider === 'openai') {
66
+ return generateOpenAIImage(context, options);
67
+ }
68
+ if (provider !== 'higgsfield') {
69
+ throw new Error('Unsupported image provider.');
70
+ }
71
+ const request = 'imageUrls' in options && options.imageUrls?.length ? await generateMarketingStudioImage(context, options) : await generateSoulImage(context, options);
72
+ return {
73
+ ...request,
74
+ provider,
75
+ status: 'queued'
76
+ };
77
+ };
78
+ /** Reuses the Gemini content protocol while preserving the generic image result shape. */ export const generateGeminiImage = async (_context, input, config)=>{
79
+ const validated = validateGeminiImageInput(input);
80
+ try {
81
+ const result = await generateContent({
82
+ ...validated,
83
+ modality: 'image',
84
+ provider: 'gemini'
85
+ }, {
86
+ geminiImageModel: config?.model || Config.get('contentGeneration.geminiImageModel'),
87
+ geminiKey: config?.key || Config.get('contentGeneration.geminiKey')
88
+ });
89
+ const { image } = result;
90
+ if (!image || !(image.mime === 'image/png' ? image.bytes.subarray(0, 8).equals(Buffer.from([
91
+ 137,
92
+ 80,
93
+ 78,
94
+ 71,
95
+ 13,
96
+ 10,
97
+ 26,
98
+ 10
99
+ ])) : image.bytes.subarray(0, 3).equals(Buffer.from([
100
+ 255,
101
+ 216,
102
+ 255
103
+ ])))) {
104
+ throw new Error('Gemini image output could not be verified.');
105
+ }
106
+ return {
107
+ imageBase64: image.bytes.toString('base64'),
108
+ mimeType: image.mime,
109
+ provider: 'gemini',
110
+ requestId: `gemini-${randomUUID()}`,
111
+ status: 'completed'
112
+ };
113
+ } catch (error) {
114
+ if (error instanceof ContentGenerationRejectedError) {
115
+ throw new ImageGenerationRejectedError(error.message);
116
+ }
117
+ throw error;
118
+ }
119
+ };
120
+
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9pbWFnZUdlbmVyYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtwb3N0fSBmcm9tICdAbmxhYnMvcmlwLWh1bnRlcic7XG5pbXBvcnQge3JhbmRvbVVVSUR9IGZyb20gJ25vZGU6Y3J5cHRvJztcblxuaW1wb3J0IHt2YWxpZGF0ZUdlbWluaUltYWdlSW5wdXR9IGZyb20gJy4uL2FkYXB0ZXJzL2dlbWluaUdlbmVyYXRpb25BZGFwdGVyLmpzJztcbmltcG9ydCB7dmFsaWRhdGVPcGVuQUlJbWFnZUlucHV0fSBmcm9tICcuLi9hZGFwdGVycy9pbWFnZUdlbmVyYXRpb25BZGFwdGVyLmpzJztcbmltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi9jb25maWcuanMnO1xuaW1wb3J0IHtDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IsIGdlbmVyYXRlQ29udGVudH0gZnJvbSAnLi9jb250ZW50R2VuZXJhdGlvbi5qcyc7XG5pbXBvcnQge2dlbmVyYXRlTWFya2V0aW5nU3R1ZGlvSW1hZ2UsIGdlbmVyYXRlU291bEltYWdlfSBmcm9tICcuL2hpZ2dzZmllbGQuanMnO1xuXG5pbXBvcnQgdHlwZSB7R2VtaW5pSW1hZ2VJbnB1dH0gZnJvbSAnLi4vYWRhcHRlcnMvZ2VtaW5pR2VuZXJhdGlvbkFkYXB0ZXIuanMnO1xuaW1wb3J0IHR5cGUge01hcmtldGluZ1N0dWRpb0ltYWdlSW5wdXQsIFNvdWxJbWFnZUlucHV0fSBmcm9tICcuLi9hZGFwdGVycy9oaWdnc2ZpZWxkQWRhcHRlci5qcyc7XG5pbXBvcnQgdHlwZSB7T3BlbkFJSW1hZ2VJbnB1dH0gZnJvbSAnLi4vYWRhcHRlcnMvaW1hZ2VHZW5lcmF0aW9uQWRhcHRlci5qcyc7XG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5cbi8qKiBPbmx5IGFuIGV4cGxpY2l0IHByb3ZpZGVyIHJlamVjdGlvbiBwcm92ZXMgaXQgaXMgc2FmZSB0byByZWxlYXNlIGEgcmVzZXJ2YXRpb24uICovXG5leHBvcnQgY2xhc3MgSW1hZ2VHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbmV4cG9ydCB0eXBlIEdlbmVyYXRlSW1hZ2VJbnB1dCA9XG4gIHwgKEdlbWluaUltYWdlSW5wdXQgJiB7cHJvdmlkZXI6ICdnZW1pbmknfSlcbiAgfCAoT3BlbkFJSW1hZ2VJbnB1dCAmIHtwcm92aWRlcjogJ29wZW5haSd9KVxuICB8IChTb3VsSW1hZ2VJbnB1dCAmIHtwcm92aWRlcjogJ2hpZ2dzZmllbGQnOyBpbWFnZVVybHM/OiB1bmRlZmluZWR9KVxuICB8IChNYXJrZXRpbmdTdHVkaW9JbWFnZUlucHV0ICYge3Byb3ZpZGVyOiAnaGlnZ3NmaWVsZCd9KTtcblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUdlbmVyYXRpb25SZXN1bHQge1xuICBjYW5jZWxVcmw/OiBzdHJpbmc7XG4gIGltYWdlQmFzZTY0Pzogc3RyaW5nO1xuICBtaW1lVHlwZT86ICdpbWFnZS9qcGVnJyB8ICdpbWFnZS9wbmcnO1xuICBwcm92aWRlcjogJ2dlbWluaScgfCAnaGlnZ3NmaWVsZCcgfCAnb3BlbmFpJztcbiAgcmVxdWVzdElkOiBzdHJpbmc7XG4gIHN0YXR1czogJ3F1ZXVlZCcgfCAnY29tcGxldGVkJztcbiAgc3RhdHVzVXJsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVPcGVuQUlJbWFnZSA9IGFzeW5jIChcbiAgX2NvbnRleHQ6IEFwaUNvbnRleHQsIGlucHV0OiBPcGVuQUlJbWFnZUlucHV0LCBjb25maWc/OiB7a2V5Pzogc3RyaW5nOyBtb2RlbD86IHN0cmluZ31cbik6IFByb21pc2U8SW1hZ2VHZW5lcmF0aW9uUmVzdWx0PiA9PiB7XG4gIGNvbnN0IHZhbGlkYXRlZCA9IHZhbGlkYXRlT3BlbkFJSW1hZ2VJbnB1dChpbnB1dCk7XG4gIGNvbnN0IGtleSA9IGNvbmZpZz8ua2V5IHx8IENvbmZpZy5nZXQ8c3RyaW5nPignb3BlbmFpLmFwaUtleScpO1xuICBpZigha2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdPcGVuQUkgaW1hZ2UgZ2VuZXJhdGlvbiBpcyBub3QgY29uZmlndXJlZC4nKTtcbiAgfVxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3QoJ2h0dHBzOi8vYXBpLm9wZW5haS5jb20vdjEvaW1hZ2VzL2dlbmVyYXRpb25zJywge1xuICAgIG1vZGVsOiB2YWxpZGF0ZWQubW9kZWwgfHwgY29uZmlnPy5tb2RlbCB8fCBDb25maWcuZ2V0PHN0cmluZz4oJ29wZW5haS5pbWFnZU1vZGVsJykgfHwgJ2dwdC1pbWFnZS0xLjUnLFxuICAgIG46IDEsXG4gICAgb3V0cHV0X2Zvcm1hdDogJ3BuZycsXG4gICAgcHJvbXB0OiB2YWxpZGF0ZWQucHJvbXB0LFxuICAgIHF1YWxpdHk6IHZhbGlkYXRlZC5xdWFsaXR5LFxuICAgIHNpemU6IHZhbGlkYXRlZC5zaXplXG4gIH0sIHtjYWNoZTogZmFsc2UsIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHtBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7a2V5fWB9KSwgdGltZW91dDogMTgwXzAwMH0pIGFzIHtcbiAgICBkYXRhPzoge2I2NF9qc29uPzogc3RyaW5nfVtdO1xuICAgIGVycm9yPzoge3R5cGU/OiBzdHJpbmd9O1xuICB9O1xuICBpZihyZXNwb25zZS5lcnJvciAmJiBbJ2ludmFsaWRfcmVxdWVzdF9lcnJvcicsICdhdXRoZW50aWNhdGlvbl9lcnJvcicsICdwZXJtaXNzaW9uX2Vycm9yJ10uaW5jbHVkZXMocmVzcG9uc2UuZXJyb3IudHlwZSB8fCAnJykpIHtcbiAgICB0aHJvdyBuZXcgSW1hZ2VHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignT3BlbkFJIHJlamVjdGVkIHRoZSBpbWFnZSByZXF1ZXN0LiBDaGVjayBtb2RlbCBhY2Nlc3MgYW5kIHByb21wdC4nKTtcbiAgfVxuICBjb25zdCBlbmNvZGVkID0gcmVzcG9uc2UuZGF0YT8uWzBdPy5iNjRfanNvbjtcbiAgaWYocmVzcG9uc2UuZXJyb3IgfHwgIWVuY29kZWQgfHwgZW5jb2RlZC5sZW5ndGggPiA0MCAqIDEwMjQgKiAxMDI0IHx8ICEvXltBLVphLXowLTkrL10rPXswLDJ9JC8udGVzdChlbmNvZGVkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignT3BlbkFJIGltYWdlIG91dHB1dCBjb3VsZCBub3QgYmUgdmVyaWZpZWQuJyk7XG4gIH1cbiAgaWYoIUJ1ZmZlci5mcm9tKGVuY29kZWQsICdiYXNlNjQnKS5zdWJhcnJheSgwLCA4KS5lcXVhbHMoQnVmZmVyLmZyb20oWzEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTBdKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ09wZW5BSSBkaWQgbm90IHJldHVybiBQTkcgaW1hZ2UgYnl0ZXMuJyk7XG4gIH1cbiAgcmV0dXJuIHtpbWFnZUJhc2U2NDogZW5jb2RlZCwgcHJvdmlkZXI6ICdvcGVuYWknLCByZXF1ZXN0SWQ6IGBvcGVuYWktJHtyYW5kb21VVUlEKCl9YCwgc3RhdHVzOiAnY29tcGxldGVkJ307XG59O1xuXG4vKiogUHJvdmlkZXIgc2VsZWN0aW9uIGlzIGRhdGE7IGNyZWRlbnRpYWxzIGFuZCBwYWlkLWpvYiBvcmNoZXN0cmF0aW9uIHN0YXkgc2VydmVyLXNpZGUuICovXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVJbWFnZSA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCBpbnB1dDogR2VuZXJhdGVJbWFnZUlucHV0KTogUHJvbWlzZTxJbWFnZUdlbmVyYXRpb25SZXN1bHQ+ID0+IHtcbiAgY29uc3Qge3Byb3ZpZGVyLCAuLi5vcHRpb25zfSA9IGlucHV0O1xuICBpZihwcm92aWRlciA9PT0gJ2dlbWluaScpIHtcbiAgICByZXR1cm4gZ2VuZXJhdGVHZW1pbmlJbWFnZShjb250ZXh0LCBvcHRpb25zIGFzIEdlbWluaUltYWdlSW5wdXQpO1xuICB9XG4gIGlmKHByb3ZpZGVyID09PSAnb3BlbmFpJykge1xuICAgIHJldHVybiBnZW5lcmF0ZU9wZW5BSUltYWdlKGNvbnRleHQsIG9wdGlvbnMgYXMgT3BlbkFJSW1hZ2VJbnB1dCk7XG4gIH1cbiAgaWYocHJvdmlkZXIgIT09ICdoaWdnc2ZpZWxkJykge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgaW1hZ2UgcHJvdmlkZXIuJyk7XG4gIH1cbiAgY29uc3QgcmVxdWVzdCA9ICdpbWFnZVVybHMnIGluIG9wdGlvbnMgJiYgb3B0aW9ucy5pbWFnZVVybHM/Lmxlbmd0aFxuICAgID8gYXdhaXQgZ2VuZXJhdGVNYXJrZXRpbmdTdHVkaW9JbWFnZShjb250ZXh0LCBvcHRpb25zIGFzIE1hcmtldGluZ1N0dWRpb0ltYWdlSW5wdXQpXG4gICAgOiBhd2FpdCBnZW5lcmF0ZVNvdWxJbWFnZShjb250ZXh0LCBvcHRpb25zIGFzIFNvdWxJbWFnZUlucHV0KTtcbiAgcmV0dXJuIHsuLi5yZXF1ZXN0LCBwcm92aWRlciwgc3RhdHVzOiAncXVldWVkJ307XG59O1xuXG4vKiogUmV1c2VzIHRoZSBHZW1pbmkgY29udGVudCBwcm90b2NvbCB3aGlsZSBwcmVzZXJ2aW5nIHRoZSBnZW5lcmljIGltYWdlIHJlc3VsdCBzaGFwZS4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUdlbWluaUltYWdlID0gYXN5bmMgKFxuICBfY29udGV4dDogQXBpQ29udGV4dCwgaW5wdXQ6IEdlbWluaUltYWdlSW5wdXQsIGNvbmZpZz86IHtrZXk/OiBzdHJpbmc7IG1vZGVsPzogc3RyaW5nfVxuKTogUHJvbWlzZTxJbWFnZUdlbmVyYXRpb25SZXN1bHQ+ID0+IHtcbiAgY29uc3QgdmFsaWRhdGVkID0gdmFsaWRhdGVHZW1pbmlJbWFnZUlucHV0KGlucHV0KTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZW5lcmF0ZUNvbnRlbnQoey4uLnZhbGlkYXRlZCwgbW9kYWxpdHk6ICdpbWFnZScsIHByb3ZpZGVyOiAnZ2VtaW5pJ30sIHtcbiAgICAgIGdlbWluaUltYWdlTW9kZWw6IGNvbmZpZz8ubW9kZWwgfHwgQ29uZmlnLmdldDxzdHJpbmc+KCdjb250ZW50R2VuZXJhdGlvbi5nZW1pbmlJbWFnZU1vZGVsJyksXG4gICAgICBnZW1pbmlLZXk6IGNvbmZpZz8ua2V5IHx8IENvbmZpZy5nZXQ8c3RyaW5nPignY29udGVudEdlbmVyYXRpb24uZ2VtaW5pS2V5JylcbiAgICB9KTtcbiAgICBjb25zdCB7aW1hZ2V9ID0gcmVzdWx0O1xuICAgIGlmKCFpbWFnZSB8fCAhKGltYWdlLm1pbWUgPT09ICdpbWFnZS9wbmcnXG4gICAgICA/IGltYWdlLmJ5dGVzLnN1YmFycmF5KDAsIDgpLmVxdWFscyhCdWZmZXIuZnJvbShbMTM3LCA4MCwgNzgsIDcxLCAxMywgMTAsIDI2LCAxMF0pKVxuICAgICAgOiBpbWFnZS5ieXRlcy5zdWJhcnJheSgwLCAzKS5lcXVhbHMoQnVmZmVyLmZyb20oWzI1NSwgMjE2LCAyNTVdKSkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbWluaSBpbWFnZSBvdXRwdXQgY291bGQgbm90IGJlIHZlcmlmaWVkLicpO1xuICAgIH1cbiAgICByZXR1cm4ge2ltYWdlQmFzZTY0OiBpbWFnZS5ieXRlcy50b1N0cmluZygnYmFzZTY0JyksIG1pbWVUeXBlOiBpbWFnZS5taW1lLCBwcm92aWRlcjogJ2dlbWluaScsIHJlcXVlc3RJZDogYGdlbWluaS0ke3JhbmRvbVVVSUQoKX1gLCBzdGF0dXM6ICdjb21wbGV0ZWQnfTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGlmKGVycm9yIGluc3RhbmNlb2YgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgSW1hZ2VHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG4iXSwibmFtZXMiOlsicG9zdCIsInJhbmRvbVVVSUQiLCJ2YWxpZGF0ZUdlbWluaUltYWdlSW5wdXQiLCJ2YWxpZGF0ZU9wZW5BSUltYWdlSW5wdXQiLCJDb25maWciLCJDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IiLCJnZW5lcmF0ZUNvbnRlbnQiLCJnZW5lcmF0ZU1hcmtldGluZ1N0dWRpb0ltYWdlIiwiZ2VuZXJhdGVTb3VsSW1hZ2UiLCJJbWFnZUdlbmVyYXRpb25SZWplY3RlZEVycm9yIiwiRXJyb3IiLCJnZW5lcmF0ZU9wZW5BSUltYWdlIiwiX2NvbnRleHQiLCJpbnB1dCIsImNvbmZpZyIsInZhbGlkYXRlZCIsImtleSIsImdldCIsInJlc3BvbnNlIiwibW9kZWwiLCJuIiwib3V0cHV0X2Zvcm1hdCIsInByb21wdCIsInF1YWxpdHkiLCJzaXplIiwiY2FjaGUiLCJoZWFkZXJzIiwiSGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJ0aW1lb3V0IiwiZXJyb3IiLCJpbmNsdWRlcyIsInR5cGUiLCJlbmNvZGVkIiwiZGF0YSIsImI2NF9qc29uIiwibGVuZ3RoIiwidGVzdCIsIkJ1ZmZlciIsImZyb20iLCJzdWJhcnJheSIsImVxdWFscyIsImltYWdlQmFzZTY0IiwicHJvdmlkZXIiLCJyZXF1ZXN0SWQiLCJzdGF0dXMiLCJnZW5lcmF0ZUltYWdlIiwiY29udGV4dCIsIm9wdGlvbnMiLCJnZW5lcmF0ZUdlbWluaUltYWdlIiwicmVxdWVzdCIsImltYWdlVXJscyIsInJlc3VsdCIsIm1vZGFsaXR5IiwiZ2VtaW5pSW1hZ2VNb2RlbCIsImdlbWluaUtleSIsImltYWdlIiwibWltZSIsImJ5dGVzIiwidG9TdHJpbmciLCJtaW1lVHlwZSIsIm1lc3NhZ2UiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLElBQUksUUFBTyxvQkFBb0I7QUFDdkMsU0FBUUMsVUFBVSxRQUFPLGNBQWM7QUFFdkMsU0FBUUMsd0JBQXdCLFFBQU8seUNBQXlDO0FBQ2hGLFNBQVFDLHdCQUF3QixRQUFPLHdDQUF3QztBQUMvRSxTQUFRQyxNQUFNLFFBQU8sZUFBZTtBQUNwQyxTQUFRQyw4QkFBOEIsRUFBRUMsZUFBZSxRQUFPLHlCQUF5QjtBQUN2RixTQUFRQyw0QkFBNEIsRUFBRUMsaUJBQWlCLFFBQU8sa0JBQWtCO0FBT2hGLG9GQUFvRixHQUNwRixPQUFPLE1BQU1DLHFDQUFxQ0M7QUFBTztBQWtCekQsT0FBTyxNQUFNQyxzQkFBc0IsT0FDakNDLFVBQXNCQyxPQUF5QkM7SUFFL0MsTUFBTUMsWUFBWVoseUJBQXlCVTtJQUMzQyxNQUFNRyxNQUFNRixRQUFRRSxPQUFPWixPQUFPYSxHQUFHLENBQVM7SUFDOUMsSUFBRyxDQUFDRCxLQUFLO1FBQ1AsTUFBTSxJQUFJTixNQUFNO0lBQ2xCO0lBQ0EsTUFBTVEsV0FBVyxNQUFNbEIsS0FBSyxnREFBZ0Q7UUFDMUVtQixPQUFPSixVQUFVSSxLQUFLLElBQUlMLFFBQVFLLFNBQVNmLE9BQU9hLEdBQUcsQ0FBUyx3QkFBd0I7UUFDdEZHLEdBQUc7UUFDSEMsZUFBZTtRQUNmQyxRQUFRUCxVQUFVTyxNQUFNO1FBQ3hCQyxTQUFTUixVQUFVUSxPQUFPO1FBQzFCQyxNQUFNVCxVQUFVUyxJQUFJO0lBQ3RCLEdBQUc7UUFBQ0MsT0FBTztRQUFPQyxTQUFTLElBQUlDLFFBQVE7WUFBQ0MsZUFBZSxDQUFDLE9BQU8sRUFBRVosS0FBSztRQUFBO1FBQUlhLFNBQVM7SUFBTztJQUkxRixJQUFHWCxTQUFTWSxLQUFLLElBQUk7UUFBQztRQUF5QjtRQUF3QjtLQUFtQixDQUFDQyxRQUFRLENBQUNiLFNBQVNZLEtBQUssQ0FBQ0UsSUFBSSxJQUFJLEtBQUs7UUFDOUgsTUFBTSxJQUFJdkIsNkJBQTZCO0lBQ3pDO0lBQ0EsTUFBTXdCLFVBQVVmLFNBQVNnQixJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUVDO0lBQ3BDLElBQUdqQixTQUFTWSxLQUFLLElBQUksQ0FBQ0csV0FBV0EsUUFBUUcsTUFBTSxHQUFHLEtBQUssT0FBTyxRQUFRLENBQUMseUJBQXlCQyxJQUFJLENBQUNKLFVBQVU7UUFDN0csTUFBTSxJQUFJdkIsTUFBTTtJQUNsQjtJQUNBLElBQUcsQ0FBQzRCLE9BQU9DLElBQUksQ0FBQ04sU0FBUyxVQUFVTyxRQUFRLENBQUMsR0FBRyxHQUFHQyxNQUFNLENBQUNILE9BQU9DLElBQUksQ0FBQztRQUFDO1FBQUs7UUFBSTtRQUFJO1FBQUk7UUFBSTtRQUFJO1FBQUk7S0FBRyxJQUFJO1FBQ3hHLE1BQU0sSUFBSTdCLE1BQU07SUFDbEI7SUFDQSxPQUFPO1FBQUNnQyxhQUFhVDtRQUFTVSxVQUFVO1FBQVVDLFdBQVcsQ0FBQyxPQUFPLEVBQUUzQyxjQUFjO1FBQUU0QyxRQUFRO0lBQVc7QUFDNUcsRUFBRTtBQUVGLHlGQUF5RixHQUN6RixPQUFPLE1BQU1DLGdCQUFnQixPQUFPQyxTQUFxQmxDO0lBQ3ZELE1BQU0sRUFBQzhCLFFBQVEsRUFBRSxHQUFHSyxTQUFRLEdBQUduQztJQUMvQixJQUFHOEIsYUFBYSxVQUFVO1FBQ3hCLE9BQU9NLG9CQUFvQkYsU0FBU0M7SUFDdEM7SUFDQSxJQUFHTCxhQUFhLFVBQVU7UUFDeEIsT0FBT2hDLG9CQUFvQm9DLFNBQVNDO0lBQ3RDO0lBQ0EsSUFBR0wsYUFBYSxjQUFjO1FBQzVCLE1BQU0sSUFBSWpDLE1BQU07SUFDbEI7SUFDQSxNQUFNd0MsVUFBVSxlQUFlRixXQUFXQSxRQUFRRyxTQUFTLEVBQUVmLFNBQ3pELE1BQU03Qiw2QkFBNkJ3QyxTQUFTQyxXQUM1QyxNQUFNeEMsa0JBQWtCdUMsU0FBU0M7SUFDckMsT0FBTztRQUFDLEdBQUdFLE9BQU87UUFBRVA7UUFBVUUsUUFBUTtJQUFRO0FBQ2hELEVBQUU7QUFFRix3RkFBd0YsR0FDeEYsT0FBTyxNQUFNSSxzQkFBc0IsT0FDakNyQyxVQUFzQkMsT0FBeUJDO0lBRS9DLE1BQU1DLFlBQVliLHlCQUF5Qlc7SUFDM0MsSUFBSTtRQUNGLE1BQU11QyxTQUFTLE1BQU05QyxnQkFBZ0I7WUFBQyxHQUFHUyxTQUFTO1lBQUVzQyxVQUFVO1lBQVNWLFVBQVU7UUFBUSxHQUFHO1lBQzFGVyxrQkFBa0J4QyxRQUFRSyxTQUFTZixPQUFPYSxHQUFHLENBQVM7WUFDdERzQyxXQUFXekMsUUFBUUUsT0FBT1osT0FBT2EsR0FBRyxDQUFTO1FBQy9DO1FBQ0EsTUFBTSxFQUFDdUMsS0FBSyxFQUFDLEdBQUdKO1FBQ2hCLElBQUcsQ0FBQ0ksU0FBUyxDQUFFQSxDQUFBQSxNQUFNQyxJQUFJLEtBQUssY0FDMUJELE1BQU1FLEtBQUssQ0FBQ2xCLFFBQVEsQ0FBQyxHQUFHLEdBQUdDLE1BQU0sQ0FBQ0gsT0FBT0MsSUFBSSxDQUFDO1lBQUM7WUFBSztZQUFJO1lBQUk7WUFBSTtZQUFJO1lBQUk7WUFBSTtTQUFHLEtBQy9FaUIsTUFBTUUsS0FBSyxDQUFDbEIsUUFBUSxDQUFDLEdBQUcsR0FBR0MsTUFBTSxDQUFDSCxPQUFPQyxJQUFJLENBQUM7WUFBQztZQUFLO1lBQUs7U0FBSSxFQUFDLEdBQUk7WUFDcEUsTUFBTSxJQUFJN0IsTUFBTTtRQUNsQjtRQUNBLE9BQU87WUFBQ2dDLGFBQWFjLE1BQU1FLEtBQUssQ0FBQ0MsUUFBUSxDQUFDO1lBQVdDLFVBQVVKLE1BQU1DLElBQUk7WUFBRWQsVUFBVTtZQUFVQyxXQUFXLENBQUMsT0FBTyxFQUFFM0MsY0FBYztZQUFFNEMsUUFBUTtRQUFXO0lBQ3pKLEVBQUUsT0FBTWYsT0FBTztRQUNiLElBQUdBLGlCQUFpQnpCLGdDQUFnQztZQUNsRCxNQUFNLElBQUlJLDZCQUE2QnFCLE1BQU0rQixPQUFPO1FBQ3REO1FBQ0EsTUFBTS9CO0lBQ1I7QUFDRixFQUFFIn0=
@@ -870,4 +870,4 @@ export const deleteImage = async (context, imageId)=>{
870
870
  }
871
871
  };
872
872
 
873
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50Ly5jb2RleC13b3JrdHJlZXMvcmVha3Rvci1waGFudGF6ZS1jaGF0L3BhY2thZ2VzL3JlYWt0b3Ivc3JjL2FjdGlvbnMvaW1hZ2VzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBpcyBzdWJqZWN0IHRvIHRoZSBhY2NvbXBhbnlpbmcgY29tbWVyY2lhbCBMSUNFTlNFLlxuICovXG5pbXBvcnQge0RlbGV0ZU9iamVjdHNDb21tYW5kSW5wdXQsIFB1dE9iamVjdENvbW1hbmRJbnB1dH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXMzJztcbmltcG9ydCB7Z2V0IGFzIGh0dHBHZXR9IGZyb20gJ0BubGFicy9yaXAtaHVudGVyJztcbmltcG9ydCB7cGFyc2VOdW19IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL251bWJlcnMnO1xuaW1wb3J0IHtjcmVhdGVIYXNoLCBwYXJzZUFyYW5nb0lkLCBwYXJzZUNoYXIsIHBhcnNlSWQsIHBhcnNlU3RyaW5nfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9zdHJpbmdzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge0FxbFF1ZXJ5LCBsaXRlcmFsfSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuaW1wb3J0IGV4aWZSZWFkZXIgZnJvbSAnZXhpZi1yZWFkZXInO1xuaW1wb3J0IHNoYXJwIGZyb20gJ3NoYXJwJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5pbXBvcnQge0NPTExFQ1RJT05TLCBFREdFU30gZnJvbSAnLi4vY29uc3RhbnRzL2NvbGxlY3Rpb25zLmpzJztcbmltcG9ydCB7RXJyb3JUeXBlc30gZnJvbSAnLi4vdHlwZXMvZXJyb3IudHlwZXMuanMnO1xuaW1wb3J0IHtsb2dFcnJvciwgbG9nRXhjZXB0aW9ufSBmcm9tICcuLi91dGlscy9hbmFseXRpY3NVdGlscy5qcyc7XG5pbXBvcnQge2dldERvY0lkLCBnZXRMaW1pdCwgc2VsZWN0UmVhY3Rpb25Db3VudEJ5VHlwZSwgdXNlRGJ9IGZyb20gJy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMuanMnO1xuaW1wb3J0IHtnZXRJbWFnZUV4dGVuc2lvbn0gZnJvbSAnLi4vdXRpbHMvaW1hZ2VVdGlscy5qcyc7XG5pbXBvcnQge2FkZEl0ZW0sIGRlbGV0ZUl0ZW0sIGdldEl0ZW1CeSwgZ2V0TGlzdEJ5LCB1cGRhdGVJdGVtfSBmcm9tICcuL2NydWQuanMnO1xuaW1wb3J0IHtnZXRHcm91cERldGFpbHMsIGlzR3JvdXBlZH0gZnJvbSAnLi9ncm91cHMuanMnO1xuaW1wb3J0IHtnZXRQZXJzb25hUmVsYXRpb25zaGlwU3RhdGV9IGZyb20gJy4vcGVyc29uYXMuanMnO1xuaW1wb3J0IHtzM0RlbGV0ZUxpc3QsIHMzR2V0U2lnbmVkVXJsLCBzM1B1dH0gZnJvbSAnLi9zMy5qcyc7XG5pbXBvcnQge2hhc1N1YnNjcmlwdGlvblRvSXRlbX0gZnJvbSAnLi9zdWJzY3JpcHRpb25zLmpzJztcblxuaW1wb3J0IHR5cGUge1F1ZXJ5RmlsdGVyfSBmcm9tICcuLi90eXBlcy9hcHBzLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtBcmFuZ29EYkNvbGxlY3Rpb24sIEFyYW5nb0RiTGltaXR9IGZyb20gJy4uL3R5cGVzL2FyYW5nb2RiLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtHcm91cFR5cGUsIEdyb3VwVXNlcn0gZnJvbSAnLi4vdHlwZXMvZ3JvdXBzLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtJbWFnZUVkZ2VUeXBlLCBJbWFnZU9wdGlvbnMsIEltYWdlVHlwZSwgSW1hZ2VVcmxEYXRhfSBmcm9tICcuLi90eXBlcy9pbWFnZXMudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0ZpbHRlckdyb3VwfSBmcm9tICcuLi91dGlscy9hcWxIZWxwZXJzLmpzJztcblxuLy8gRGVmaW5lIGludGVyZmFjZSBmb3IgSFRUUCByZXNwb25zZSB3aXRoIGJ1ZmZlciBtZXRob2RcbmludGVyZmFjZSBIdHRwUmVzcG9uc2UgZXh0ZW5kcyBSZXNwb25zZSB7XG4gIGJ1ZmZlcigpOiBQcm9taXNlPEJ1ZmZlcj47XG59XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnkgPSAnaW1hZ2VzJztcbmNvbnN0IGhhc1JlYWN0aW9uQ29sbGVjdGlvbiA9IGxpdGVyYWwoRURHRVMuSEFTX1JFQUNUSU9OKTtcbmNvbnN0IGhhc01lZGlhQ29sbGVjdGlvbiA9IGxpdGVyYWwoRURHRVMuSEFTX01FRElBKTtcbmNvbnN0IHBlcnNvbmFzQ29sbGVjdGlvbiA9IGxpdGVyYWwoQ09MTEVDVElPTlMuUEVSU09OQVMpO1xuY29uc3QgTUVESUFfSVRFTV9DT0xMRUNUSU9OUzogcmVhZG9ubHkgQXJhbmdvRGJDb2xsZWN0aW9uW10gPSBbXG4gIENPTExFQ1RJT05TLlBFUlNPTkFTLFxuICBDT0xMRUNUSU9OUy5VU0VSUyxcbiAgQ09MTEVDVElPTlMuUE9TVFMsXG4gIENPTExFQ1RJT05TLkdST1VQU1xuXTtcblxudHlwZSBTaGFycEZvcm1hdCA9IEV4dHJhY3Q8UGFyYW1ldGVyczxSZXR1cm5UeXBlPHR5cGVvZiBzaGFycD5bJ3RvRm9ybWF0J10+WzBdLCBzdHJpbmc+O1xuXG5jb25zdCBnZXRNZWRpYUl0ZW1Eb2NJZHMgPSAoaXRlbUlkOiBzdHJpbmcsIGl0ZW1UeXBlPzogQXJhbmdvRGJDb2xsZWN0aW9uKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBkb2NJZCA9IHBhcnNlQXJhbmdvSWQoaXRlbUlkKTtcblxuICBpZihkb2NJZCkge1xuICAgIHJldHVybiBbZG9jSWRdO1xuICB9XG5cbiAgY29uc3QgaXRlbUtleSA9IHBhcnNlSWQoaXRlbUlkKTtcblxuICBpZighaXRlbUtleSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGlmKGl0ZW1UeXBlICYmIE1FRElBX0lURU1fQ09MTEVDVElPTlMuaW5jbHVkZXMoaXRlbVR5cGUpKSB7XG4gICAgcmV0dXJuIFtgJHtpdGVtVHlwZX0vJHtpdGVtS2V5fWBdO1xuICB9XG5cbiAgcmV0dXJuIE1FRElBX0lURU1fQ09MTEVDVElPTlMubWFwKChjb2xsZWN0aW9uKSA9PiBgJHtjb2xsZWN0aW9ufS8ke2l0ZW1LZXl9YCk7XG59O1xuXG5jb25zdCBub3JtYWxpemVJbWFnZUZvcm1hdCA9IChmb3JtYXQ6IHN0cmluZyk6IFNoYXJwRm9ybWF0ID0+XG4gIChmb3JtYXQgPT09ICdqcGcnID8gJ2pwZWcnIDogZm9ybWF0KSBhcyBTaGFycEZvcm1hdDtcblxuY29uc3QgaW1hZ2VFeGlmTWV0YWRhdGEgPSAoZXhpZj86IEJ1ZmZlcikgPT4ge1xuICBpZighZXhpZikgcmV0dXJuIHt9O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBleGlmUmVhZGVyKGV4aWYpO1xuICAgIGNvbnN0IHRha2VuID0gbWV0YWRhdGEuUGhvdG8/LkRhdGVUaW1lT3JpZ2luYWw7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ha2U6IG1ldGFkYXRhLkltYWdlPy5NYWtlLFxuICAgICAgbW9kZWw6IG1ldGFkYXRhLkltYWdlPy5Nb2RlbCxcbiAgICAgIHRha2VuOiB0YWtlbiBpbnN0YW5jZW9mIERhdGUgPyB0YWtlbi5nZXRUaW1lKCkgOiB1bmRlZmluZWRcbiAgICB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn07XG5cbmNvbnN0IG5vcm1hbGl6ZUltYWdlUHJpdmFjeSA9IChwcml2YWN5OiB1bmtub3duKTogJ2ZyaWVuZHMnIHwgJ3ByaXZhdGUnIHwgJ3B1YmxpYycgfCAndmlwJyA9PiB7XG4gIHN3aXRjaChTdHJpbmcocHJpdmFjeSB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdmcmllbmRzJzpcbiAgICAgIHJldHVybiAnZnJpZW5kcyc7XG4gICAgY2FzZSAncHJpdmF0ZSc6XG4gICAgICByZXR1cm4gJ3ByaXZhdGUnO1xuICAgIGNhc2UgJ3ZpcCc6XG4gICAgICByZXR1cm4gJ3ZpcCc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAncHVibGljJztcbiAgfVxufTtcblxuY29uc3QgY2FuVmlld0ltYWdlID0gKFxuICBpbWFnZTogSW1hZ2VUeXBlLFxuICB2aWV3ZXJVc2VySWQ6IHN0cmluZyxcbiAgYWNjZXNzOiB7XG4gICAgcmVhZG9ubHkgY2FuVmlld0ZyaWVuZHM6IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgY2FuVmlld1ZpcDogYm9vbGVhbjtcbiAgICByZWFkb25seSBpc093bmVyOiBib29sZWFuO1xuICB9XG4pID0+IHtcbiAgY29uc3QgcHJpdmFjeSA9IG5vcm1hbGl6ZUltYWdlUHJpdmFjeShpbWFnZT8ucHJpdmFjeSk7XG5cbiAgaWYoYWNjZXNzLmlzT3duZXIgfHwgU3RyaW5nKGltYWdlPy51c2VySWQgfHwgJycpID09PSB2aWV3ZXJVc2VySWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHN3aXRjaChwcml2YWN5KSB7XG4gICAgY2FzZSAncHJpdmF0ZSc6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY2FzZSAnZnJpZW5kcyc6XG4gICAgICByZXR1cm4gYWNjZXNzLmNhblZpZXdGcmllbmRzO1xuICAgIGNhc2UgJ3ZpcCc6XG4gICAgICByZXR1cm4gYWNjZXNzLmNhblZpZXdWaXA7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcGFyc2VJbWFnZU9wdGlvbnMgPSAob3B0aW9uczogSW1hZ2VPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGZyb20gPSAwLFxuICAgIHRvID0gMzAsXG4gICAgdHlwZSA9ICdkZWZhdWx0J1xuICB9ID0gb3B0aW9ucztcblxuICByZXR1cm4ge1xuICAgIGxpbWl0OiBnZXRMaW1pdChmcm9tLCB0bykgYXMgQXJhbmdvRGJMaW1pdCxcbiAgICB0eXBlOiBwYXJzZUNoYXIodHlwZSwgMzIpXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VPcHRpb25hbEZpZWxkcyA9IChmaWVsZHM6IHN0cmluZ1tdID0gW10pID0+XG4gIGZpZWxkcy5yZWR1Y2UoKHNlbGVjdHMsIGZpZWxkOiBzdHJpbmcpID0+IHtcbiAgICBpZihmaWVsZC5pbmNsdWRlcygnQ291bnQnKSkge1xuICAgICAgcmV0dXJuIHNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUoJ2ltYWdlcycsICdpJywgZmllbGQsIHNlbGVjdHMpO1xuICAgIH1cblxuICAgIHN3aXRjaChmaWVsZCkge1xuICAgICAgY2FzZSAncmVhY3Rpb25zJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHJlYWN0aW9ucyA9IChcbiAgICAgICAgICBGT1IgaW1hZ2UsIHIgSU4gSU5CT1VORCBpLl9pZCByZWFjdGlvbnNcbiAgICAgICAgICBDT0xMRUNUIHJlYWN0aW9uTmFtZSA9IHIudmFsdWUgSU5UTyByZWFjdGlvbkl0ZW1zXG4gICAgICAgICAgUkVUVVJOIHtuYW1lOiByZWFjdGlvbk5hbWUsIGNvdW50OiBMRU5HVEgocmVhY3Rpb25JdGVtc1sqXS5yLnZhbHVlKX1cbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgncmVhY3Rpb25zOnJlYWN0aW9ucycpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ3MnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgdGFncyA9IChcbiAgICAgICAgICBGT1IgdCwgcGwgSU4gSU5CT1VORCBpLl9pZCBpc1RhZ2dlZFxuICAgICAgICAgIFJFVFVSTiB0XG4gICAgICAgIClgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ3RhZ3M6dGFncycpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VzZXJzJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHVzZXJzID0gRklSU1QoXG4gICAgICAgICAgRk9SIHUgSU4gdXNlcnNcbiAgICAgICAgICBGSUxURVIgaS51c2VySWQgPT0gdS5fa2V5XG4gICAgICAgICAgTElNSVQgMVxuICAgICAgICAgIFJFVFVSTiB1XG4gICAgICAgIClgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ3VzZXJzOnVzZXJzJyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtvYmplY3RzOiBbXSwgcXVlcmllczogW119KTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlTGlzdEJ5VXNlciA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGZyb206IG51bWJlciA9IDAsXG4gIHRvOiBudW1iZXIgPSAzMFxuKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0SW1hZ2VzQnlVc2VyJztcbiAgY29uc3QgZm9ybWF0VXNlcklkID0gcGFyc2VJZCh1c2VySWQpO1xuXG4gIHJldHVybiBnZXRMaXN0Qnk8SW1hZ2VUeXBlPihjb250ZXh0LCAnaW1hZ2VzJywge3VzZXJJZDogZm9ybWF0VXNlcklkfSwge1xuICAgIHNvcnQ6IFt7ZmllbGQ6ICdhZGRlZCcsIGRpcmVjdGlvbjogJ0RFU0MnfV0sXG4gICAgbGltaXQ6IHtmcm9tLCB0b30sXG4gICAgY3VzdG9tUXVlcmllczogW1xuICAgICAgYExFVCB1c2VyID0gRklSU1QoRk9SIHUgSU4gdXNlcnMgRklMVEVSIHUuX2tleSA9PSBkb2MudXNlcklkIExJTUlUIDEgUkVUVVJOIHUpYFxuICAgIF0sXG4gICAgY3VzdG9tT2JqZWN0czogWyd1c2VyOnVzZXInXVxuICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge2Zyb20sIHRvLCB1c2VySWR9LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VDb3VudEJ5SXRlbSA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRJbWFnZUNvdW50QnlJdGVtJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCBpdGVtRG9jSWRzID0gZ2V0TWVkaWFJdGVtRG9jSWRzKGl0ZW1JZCk7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgTEVUIG1lZGlhID0gKFxuICAgICAgRk9SIGkgSU4gJHtoYXNNZWRpYUNvbGxlY3Rpb259XG4gICAgICAgIEZJTFRFUiBpLl9mcm9tIElOICR7aXRlbURvY0lkc31cbiAgICAgICAgRklMVEVSIGkudHlwZSA9PSBcImltYWdlXCJcbiAgICAgICAgUkVUVVJOIDFcbiAgICApXG4gICAgUkVUVVJOIHtjb3VudDogTEVOR1RIKG1lZGlhKX1cbiAgYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigoe2NvdW50fSkgPT4gY291bnQpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7aXRlbUlkfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZUxpc3RCeUl0ZW0gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGl0ZW1JZDogc3RyaW5nLFxuICBvcHRpb25zOiBJbWFnZU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0SW1hZ2VzQnlJdGVtJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgZmllbGRzID0gW10sIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25Vc2VySWQgPSAnJ30gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRJdGVtVHlwZSA9IG9wdGlvbnM/Lml0ZW1UeXBlID8gcGFyc2VDaGFyKFN0cmluZyhvcHRpb25zLml0ZW1UeXBlIHx8ICcnKSwgMzIpLnRvTG93ZXJDYXNlKCkgYXMgQXJhbmdvRGJDb2xsZWN0aW9uIDogdW5kZWZpbmVkO1xuICBjb25zdCBpdGVtRG9jSWRzID0gZ2V0TWVkaWFJdGVtRG9jSWRzKGl0ZW1JZCwgZm9ybWF0SXRlbVR5cGUpO1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VJbWFnZU9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldEltYWdlT3B0aW9uYWxGaWVsZHMoZmllbGRzKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBGT1IgbCBJTiAke2hhc01lZGlhQ29sbGVjdGlvbn1cbiAgICAgIEZJTFRFUiBsLl9mcm9tIElOICR7aXRlbURvY0lkc31cbiAgICAgIEZJTFRFUiBsLnR5cGUgPT0gXCJpbWFnZVwiXG4gICAgICBMRVQgaSA9IERPQ1VNRU5UKGwuX3RvKVxuICAgICAgRklMVEVSIE5PVCBJU19OVUxMKGkpXG4gICAgICBMRVQgb3duZXJQZXJzb25hID0gbC5pdGVtVHlwZSA9PSBcInBlcnNvbmFzXCIgPyBET0NVTUVOVCgke2xpdGVyYWwoQ09MTEVDVElPTlMuUEVSU09OQVMpfSwgUEFSU0VfSURFTlRJRklFUihsLl9mcm9tKS5rZXkpIDogbnVsbFxuICAgICAgJHtsaXRlcmFsKHNlbGVjdFF1ZXJpZXMuam9pbignXFxuJykpfVxuICAgICAgU09SVCBpLmFkZGVkIERFU0NcbiAgICAgICR7bGl0ZXJhbChsaW1pdC5hcWwpfVxuICAgICAgUkVUVVJOIE1FUkdFKFxuICAgICAgICAke3NlbGVjdE9iamVjdHMubGVuZ3RoID4gMCA/IGxpdGVyYWwoYE1FUkdFKGksIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWApIDogbGl0ZXJhbCgnaScpfSxcbiAgICAgICAge1xuICAgICAgICAgIF9tZWRpYUl0ZW1LZXk6IFBBUlNFX0lERU5USUZJRVIobC5fZnJvbSkua2V5LFxuICAgICAgICAgIF9tZWRpYUl0ZW1UeXBlOiBsLml0ZW1UeXBlIHx8IFBBUlNFX0lERU5USUZJRVIobC5fZnJvbSkuY29sbGVjdGlvbixcbiAgICAgICAgICBvd25lclBlcnNvbmFJZDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLl9rZXkgOiBudWxsLFxuICAgICAgICAgIG93bmVyUGVyc29uYUltYWdlSWQ6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5pbWFnZUlkIDogbnVsbCxcbiAgICAgICAgICBvd25lclBlcnNvbmFJbWFnZVVybDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLmltYWdlVXJsIDogbnVsbCxcbiAgICAgICAgICBvd25lclBlcnNvbmFOYW1lOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEubmFtZSA6IG51bGwsXG4gICAgICAgICAgb3duZXJQZXJzb25hVGh1bWJVcmw6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS50aHVtYlVybCA6IG51bGwsXG4gICAgICAgICAgb3duZXJQZXJzb25hVXNlcklkOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEudXNlcklkIDogbnVsbFxuICAgICAgICB9XG4gICAgICApXG4gIGA7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBsaXN0ID0gYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBJbWFnZVR5cGVbXSk7XG5cbiAgICBjb25zdCBvd25lclVzZXJJZCA9IFN0cmluZyhsaXN0WzBdPy51c2VySWQgfHwgJycpO1xuICAgIGNvbnN0IGlzT3duZXIgPSAhIXNlc3Npb25Vc2VySWQgJiYgISFvd25lclVzZXJJZCAmJiBzZXNzaW9uVXNlcklkID09PSBvd25lclVzZXJJZDtcblxuICAgIGlmKGlzT3duZXIpIHtcbiAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cblxuICAgIGlmKCFzZXNzaW9uVXNlcklkKSB7XG4gICAgICByZXR1cm4gbGlzdC5maWx0ZXIoKGltYWdlKSA9PiBub3JtYWxpemVJbWFnZVByaXZhY3koaW1hZ2U/LnByaXZhY3kpID09PSAncHVibGljJyk7XG4gICAgfVxuXG4gICAgbGV0IGNhblZpZXdGcmllbmRzID0gZmFsc2U7XG4gICAgbGV0IGNhblZpZXdWaXAgPSBmYWxzZTtcblxuICAgIGNvbnN0IG1lZGlhSXRlbUtleSA9IFN0cmluZygobGlzdFswXSBhcyBJbWFnZVR5cGUgJiB7X21lZGlhSXRlbUtleT86IHN0cmluZ30pPy5fbWVkaWFJdGVtS2V5IHx8ICcnKTtcbiAgICBjb25zdCBtZWRpYUl0ZW1UeXBlID0gU3RyaW5nKChsaXN0WzBdIGFzIEltYWdlVHlwZSAmIHtfbWVkaWFJdGVtVHlwZT86IHN0cmluZ30pPy5fbWVkaWFJdGVtVHlwZSB8fCAnJyk7XG5cbiAgICBpZihtZWRpYUl0ZW1UeXBlID09PSBDT0xMRUNUSU9OUy5QRVJTT05BUyAmJiBtZWRpYUl0ZW1LZXkpIHtcbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IGF3YWl0IGdldFBlcnNvbmFSZWxhdGlvbnNoaXBTdGF0ZShjb250ZXh0LCBtZWRpYUl0ZW1LZXkpO1xuICAgICAgY2FuVmlld0ZyaWVuZHMgPSAhIXJlbGF0aW9uc2hpcD8uaXNGcmllbmQ7XG4gICAgICBjYW5WaWV3VmlwID0gYXdhaXQgaGFzU3Vic2NyaXB0aW9uVG9JdGVtKGNvbnRleHQsIG1lZGlhSXRlbUtleSwgQ09MTEVDVElPTlMuUEVSU09OQVMpO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0LmZpbHRlcigoaW1hZ2UpID0+IGNhblZpZXdJbWFnZShpbWFnZSwgc2Vzc2lvblVzZXJJZCwge2NhblZpZXdGcmllbmRzLCBjYW5WaWV3VmlwLCBpc093bmVyfSkpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge2l0ZW1JZCwgb3B0aW9uczogey4uLm9wdGlvbnMsIGl0ZW1UeXBlOiBmb3JtYXRJdGVtVHlwZX19LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIFtdO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VMaXN0QnlHcm91cCA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgcGFyYW1zOiB7ZmlsdGVyczogUXVlcnlGaWx0ZXJbXSwgZ3JvdXBJZDogc3RyaW5nLCBmcm9tOiBudW1iZXIsIHRvOiBudW1iZXJ9XG4pOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRJbWFnZXNCeUdyb3VwJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7ZmlsdGVycywgZ3JvdXBJZCwgZnJvbSwgdG99ID0gcGFyYW1zO1xuICBjb25zdCBmb3JtYXRHcm91cElkID0gcGFyc2VJZChncm91cElkKTtcbiAgY29uc3QgbGltaXQ6IEFyYW5nb0RiTGltaXQgPSBnZXRMaW1pdChmcm9tLCB0byk7XG5cbiAgZmlsdGVyc1xuICAgIC5tYXAoKGZpbHRlcjogUXVlcnlGaWx0ZXIpID0+IHtcbiAgICAgIGNvbnN0IHtjb25kaXRpb25hbCwgbmFtZSwgdmFsdWV9ID0gZmlsdGVyO1xuICAgICAgbGV0IGZvcm1hdENvbmQgPSBjb25kaXRpb25hbDtcblxuICAgICAgaWYoY29uZGl0aW9uYWwgIT09ICc+PScgJiYgY29uZGl0aW9uYWwgIT09ICc8PScgJiYgY29uZGl0aW9uYWwgIT09ICc+JyAmJiBjb25kaXRpb25hbCAhPT0gJzwnKSB7XG4gICAgICAgIGZvcm1hdENvbmQgPSAnPT0nO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2gobmFtZSkge1xuICAgICAgICBjYXNlICdhZGRlZCc6XG4gICAgICAgICAgcmV0dXJuIGBwLmFkZGVkICR7Zm9ybWF0Q29uZH0gJHtwYXJzZU51bSh2YWx1ZSl9YDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgcmV0dXJuIGdldEdyb3VwRGV0YWlscyhjb250ZXh0LCBmb3JtYXRHcm91cElkKVxuICAgIC50aGVuKChncm91cDogR3JvdXBUeXBlKSA9PiB7XG4gICAgICBpZihncm91cC5wcml2YWN5ID09PSAncHVibGljJykge1xuICAgICAgICBmaWx0ZXJzLnB1c2goe2NvbmRpdGlvbmFsOiAnPT0nLCBuYW1lOiAnZ3JvdXBJZCcsIHZhbHVlOiBmb3JtYXRHcm91cElkfSk7XG4gICAgICAgIGNvbnN0IGZpbHRlclN0ciA9IGZpbHRlcnMuam9pbignICYmICcpO1xuICAgICAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgICAgICAgIEZPUiBpIElOIEZMQVRURU4oXG4gICAgICAgICAgICBGT1IgcCBJTiBwb3N0c1xuICAgICAgICAgICAgICBGSUxURVIgJHtsaXRlcmFsKGZpbHRlclN0cil9XG4gICAgICAgICAgICAgIExFVCBpbWFnZXMgPSAoXG4gICAgICAgICAgICAgICAgRk9SIGksIGUgSU4gT1VUQk9VTkQgcC5faWQgJHtoYXNNZWRpYUNvbGxlY3Rpb259XG4gICAgICAgICAgICAgICAgICBGSUxURVIgZS50eXBlID09IFwiaW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgUkVUVVJOIGlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBTT1JUIHAuYWRkZWQgREVTQ1xuICAgICAgICAgICAgICBSRVRVUk4gaW1hZ2VzXG4gICAgICAgICAgKVxuICAgICAgICAgICAgU09SVCBpLmFkZGVkIERFU0NcbiAgICAgICAgICAgICR7bGl0ZXJhbChsaW1pdC5hcWwpfVxuICAgICAgICAgICAgUkVUVVJOIGlcbiAgICAgICAgYDtcblxuICAgICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgSW1hZ2VUeXBlW10pXG4gICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgcGFyYW1zOiB7ZmlsdGVycywgZnJvbSwgZ3JvdXBJZCwgdG99LFxuICAgICAgICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzR3JvdXBlZChjb250ZXh0LCBzZXNzaW9uSWQsIGdyb3VwSWQpXG4gICAgICAgIC50aGVuKChncm91cGVkOiBHcm91cFVzZXIpID0+IHtcbiAgICAgICAgICBpZihncm91cGVkLmlzVmFsaWQpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7Y29uZGl0aW9uYWw6ICc9PScsIG5hbWU6ICdncm91cElkJywgdmFsdWU6IGdyb3VwZWQuZ3JvdXBJZH0pO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyTGlzdCA9IGZpbHRlcnMuam9pbignICYmICcpO1xuICAgICAgICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICAgICAgICAgICAgRk9SIHAgSU4gcG9zdFxuICAgICAgICAgICAgICAgIEZJTFRFUiAke2xpdGVyYWwoZmlsdGVyTGlzdCl9XG4gICAgICAgICAgICAgICAgRk9SIGYgSU4gcC5maWxlc1xuICAgICAgICAgICAgICAgICAgRklMVEVSIGYudHlwZSA9PSBcImltYWdlL2pwZWdcIiB8fCBmLnR5cGUgPT0gXCJpbWFnZS9wbmdcIlxuICAgICAgICAgICAgICAgICAgJHtsaXRlcmFsKGxpbWl0LmFxbCl9XG4gICAgICAgICAgICAgICAgICBTT1JUIHAuYWRkZWQgREVTQ1xuICAgICAgICAgICAgICAgICAgUkVUVVJOIGZcbiAgICAgICAgICAgIGA7XG5cbiAgICAgICAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgSW1hZ2VUeXBlW10pXG4gICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgICAgICAgICBwYXJhbXM6IHtmaWx0ZXJzLCBmcm9tLCBncm91cElkLCB0b30sXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgICAgICAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlTGlzdEJ5UmVhY3Rpb25zID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICByZWFjdGlvbnM6IHN0cmluZ1tdID0gW10sXG4gIG9wdGlvbnM/OiBJbWFnZU9wdGlvbnNcbik6IFByb21pc2U8SW1hZ2VUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEltYWdlTGlzdEJ5UmVhY3Rpb25zJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgZmllbGRzID0gW10sIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlSW1hZ2VPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRJbWFnZU9wdGlvbmFsRmllbGRzKGZpZWxkcyk7XG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZCA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuICBjb25zdCBmb3JtYXRSZWFjdGlvbnM6IHN0cmluZ1tdID0gcmVhY3Rpb25zLm1hcCgocmVhY3Rpb25OYW1lKSA9PiBwYXJzZUNoYXIocmVhY3Rpb25OYW1lLCAzMikpO1xuICBjb25zdCBmaWx0ZXJCeTogc3RyaW5nW10gPSBbXG4gICAgJ3IudHlwZSA9PSBcImltYWdlc1wiJyxcbiAgICBgUE9TSVRJT04oJHtKU09OLnN0cmluZ2lmeShmb3JtYXRSZWFjdGlvbnMpfSwgTE9XRVIoci5uYW1lKSlgXTtcblxuICAvLyBHZXQgZGF0YSBmcm9tIGRhdGFiYXNlXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgRk9SIGksIHIgSU4gT1VUQk9VTkQgJHtmb3JtYXRTZXNzaW9uSWR9IGhhc1JlYWN0aW9uXG4gICAgICBPUFRJT05TIHt2ZXJ0ZXhDb2xsZWN0aW9uczogXCJpbWFnZXNcIn1cbiAgICAgIExFVCBtZWRpYSA9IEZJUlNUKFxuICAgICAgICBGT1Igb3duZXIsIGwgSU4gSU5CT1VORCBpLl9pZCAke2hhc01lZGlhQ29sbGVjdGlvbn1cbiAgICAgICAgICBGSUxURVIgbC50eXBlID09IFwiaW1hZ2VcIlxuICAgICAgICAgIExJTUlUIDFcbiAgICAgICAgICBSRVRVUk4ge1xuICAgICAgICAgICAgaXRlbUtleTogUEFSU0VfSURFTlRJRklFUihsLl9mcm9tKS5rZXksXG4gICAgICAgICAgICBpdGVtVHlwZTogbC5pdGVtVHlwZSB8fCBQQVJTRV9JREVOVElGSUVSKGwuX2Zyb20pLmNvbGxlY3Rpb25cbiAgICAgICAgICB9XG4gICAgICApXG4gICAgICBMRVQgb3duZXJQZXJzb25hID0gbWVkaWEgJiYgbWVkaWEuaXRlbVR5cGUgPT0gXCJwZXJzb25hc1wiID8gRE9DVU1FTlQoJHtsaXRlcmFsKENPTExFQ1RJT05TLlBFUlNPTkFTKX0sIG1lZGlhLml0ZW1LZXkpIDogbnVsbFxuICAgICAgJHtsaXRlcmFsKHNlbGVjdFF1ZXJpZXMuam9pbignXFxuJykpfVxuICAgICAgRklMVEVSICR7bGl0ZXJhbChmaWx0ZXJCeS5qb2luKCcgJiYgJykpfVxuICAgICAgJHtsaXRlcmFsKGxpbWl0LmFxbCl9XG4gICAgICBSRVRVUk4gTUVSR0UoXG4gICAgICAgICR7c2VsZWN0T2JqZWN0cy5sZW5ndGggPiAwID8gbGl0ZXJhbChgTUVSR0UoaSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYCkgOiBsaXRlcmFsKCdpJyl9LFxuICAgICAgICB7XG4gICAgICAgICAgb3duZXJQZXJzb25hSWQ6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5fa2V5IDogbnVsbCxcbiAgICAgICAgICBvd25lclBlcnNvbmFJbWFnZUlkOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEuaW1hZ2VJZCA6IG51bGwsXG4gICAgICAgICAgb3duZXJQZXJzb25hSW1hZ2VVcmw6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5pbWFnZVVybCA6IG51bGwsXG4gICAgICAgICAgb3duZXJQZXJzb25hTmFtZTogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLm5hbWUgOiBudWxsLFxuICAgICAgICAgIG93bmVyUGVyc29uYVRodW1iVXJsOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEudGh1bWJVcmwgOiBudWxsLFxuICAgICAgICAgIG93bmVyUGVyc29uYVVzZXJJZDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLnVzZXJJZCA6IG51bGxcbiAgICAgICAgfVxuICAgICAgKVxuICBgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBJbWFnZVR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHtvcHRpb25zLCByZWFjdGlvbnN9LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pO1xufTtcblxuY29uc3QgZ2V0UGVyc29uYURvY0lkID0gKHBlcnNvbmFJZDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcGVyc29uYURvY0lkID0gcGFyc2VBcmFuZ29JZChwZXJzb25hSWQpO1xuXG4gIGlmKHBlcnNvbmFEb2NJZCkge1xuICAgIHJldHVybiBwZXJzb25hRG9jSWQ7XG4gIH1cblxuICBjb25zdCBwZXJzb25hS2V5ID0gcGFyc2VJZChwZXJzb25hSWQpO1xuICByZXR1cm4gcGVyc29uYUtleSA/IGAke0NPTExFQ1RJT05TLlBFUlNPTkFTfS8ke3BlcnNvbmFLZXl9YCA6ICcnO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlTGlzdEJ5UGVyc29uYVJlYWN0aW9ucyA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgcGVyc29uYUlkOiBzdHJpbmcgPSAnJyxcbiAgcmVhY3Rpb25zOiBzdHJpbmdbXSA9IFtdLFxuICBvcHRpb25zPzogSW1hZ2VPcHRpb25zXG4pOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRJbWFnZUxpc3RCeVBlcnNvbmFSZWFjdGlvbnMnO1xuICBjb25zdCBzZXNzaW9uUGVyc29uYUlkID0gU3RyaW5nKGNvbnRleHQ/LnNlc3Npb24/LnBlcnNvbmFJZCB8fCAnJyk7XG4gIGNvbnN0IHBlcnNvbmFEb2NJZCA9IGdldFBlcnNvbmFEb2NJZChwZXJzb25hSWQgfHwgc2Vzc2lvblBlcnNvbmFJZCk7XG4gIGNvbnN0IHJlYWN0aW9uTmFtZXMgPSBBcnJheS5pc0FycmF5KHJlYWN0aW9ucylcbiAgICA/IHJlYWN0aW9ucy5tYXAoKHJlYWN0aW9uTmFtZSkgPT4gcGFyc2VDaGFyKHJlYWN0aW9uTmFtZSwgMzIpLnRvTG93ZXJDYXNlKCkpLmZpbHRlcihCb29sZWFuKVxuICAgIDogW107XG4gIGNvbnN0IHtsaW1pdH0gPSBwYXJzZUltYWdlT3B0aW9ucyhvcHRpb25zKTtcblxuICBpZighcGVyc29uYURvY0lkIHx8ICFyZWFjdGlvbk5hbWVzLmxlbmd0aCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgRk9SIGltYWdlLCByZWFjdGlvbiBJTiBPVVRCT1VORCAke3BlcnNvbmFEb2NJZH0gJHtoYXNSZWFjdGlvbkNvbGxlY3Rpb259XG4gICAgICBPUFRJT05TIHt2ZXJ0ZXhDb2xsZWN0aW9uczogXCJpbWFnZXNcIn1cbiAgICAgIExFVCBtZWRpYSA9IEZJUlNUKFxuICAgICAgICBGT1Igb3duZXIsIGxpbmsgSU4gSU5CT1VORCBpbWFnZS5faWQgJHtoYXNNZWRpYUNvbGxlY3Rpb259XG4gICAgICAgICAgRklMVEVSIGxpbmsudHlwZSA9PSBcImltYWdlXCJcbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIHtcbiAgICAgICAgICAgIGl0ZW1LZXk6IFBBUlNFX0lERU5USUZJRVIobGluay5fZnJvbSkua2V5LFxuICAgICAgICAgICAgaXRlbVR5cGU6IGxpbmsuaXRlbVR5cGUgfHwgUEFSU0VfSURFTlRJRklFUihsaW5rLl9mcm9tKS5jb2xsZWN0aW9uXG4gICAgICAgICAgfVxuICAgICAgKVxuICAgICAgTEVUIG93bmVyUGVyc29uYSA9IG1lZGlhICYmIG1lZGlhLml0ZW1UeXBlID09IFwicGVyc29uYXNcIiA/IERPQ1VNRU5UKCR7cGVyc29uYXNDb2xsZWN0aW9ufSwgbWVkaWEuaXRlbUtleSkgOiBudWxsXG4gICAgICBGSUxURVIgTE9XRVIocmVhY3Rpb24udHlwZSB8fCBcIlwiKSBJTiBbXCJpbWFnZVwiLCBcImltYWdlc1wiXVxuICAgICAgRklMVEVSIFBPU0lUSU9OKCR7cmVhY3Rpb25OYW1lc30sIExPV0VSKHJlYWN0aW9uLm5hbWUgfHwgcmVhY3Rpb24udmFsdWUgfHwgXCJcIikpXG4gICAgICBTT1JUIHJlYWN0aW9uLmFkZGVkIERFU0NcbiAgICAgICR7bGl0ZXJhbChsaW1pdC5hcWwpfVxuICAgICAgUkVUVVJOIE1FUkdFKGltYWdlLCB7XG4gICAgICAgIG93bmVyUGVyc29uYUlkOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEuX2tleSA6IG51bGwsXG4gICAgICAgIG93bmVyUGVyc29uYUltYWdlSWQ6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5pbWFnZUlkIDogbnVsbCxcbiAgICAgICAgb3duZXJQZXJzb25hSW1hZ2VVcmw6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5pbWFnZVVybCA6IG51bGwsXG4gICAgICAgIG93bmVyUGVyc29uYU5hbWU6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5uYW1lIDogbnVsbCxcbiAgICAgICAgb3duZXJQZXJzb25hVGh1bWJVcmw6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS50aHVtYlVybCA6IG51bGwsXG4gICAgICAgIG93bmVyUGVyc29uYVVzZXJJZDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLnVzZXJJZCA6IG51bGxcbiAgICAgIH0pXG4gIGA7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIEltYWdlVHlwZVtdKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7b3B0aW9ucywgcGVyc29uYUlkLCByZWFjdGlvbnN9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciBhcyBFcnJvciwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gW107XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZUJ5SWQgPSAoY29udGV4dDogQXBpQ29udGV4dCwgaW1hZ2VJZDogc3RyaW5nKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgY29uc3QgZm9ybWF0SW1hZ2VJZCA9IHBhcnNlSWQoaW1hZ2VJZCk7XG4gIGNvbnN0IGZpbHRlcnM6IEZpbHRlckdyb3VwID0ge1xuICAgIG9wZXJhdG9yOiAnQU5EJyxcbiAgICBmaWx0ZXJzOiBbe2ZpZWxkOiAnX2tleScsIG9wZXJhdG9yOiAnPT0nLCB2YWx1ZTogZm9ybWF0SW1hZ2VJZH1dXG4gIH0gYXMgYW55O1xuXG4gIHJldHVybiBnZXRJdGVtQnk8SW1hZ2VUeXBlPihjb250ZXh0LCAnaW1hZ2VzJywgZmlsdGVycyk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlckltYWdlUGF0aCA9ICh1c2VySWQ6IHN0cmluZywgaW1hZ2VJZDogc3RyaW5nLCBpbWFnZVR5cGU6IHN0cmluZywgZGlyOiBzdHJpbmcgPSAnaW1hZ2VzJyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGZpbGVuYW1lID0gYCR7aW1hZ2VJZH0uJHtnZXRJbWFnZUV4dGVuc2lvbihpbWFnZVR5cGUpfWA7XG5cbiAgcmV0dXJuIGB1c2Vycy8ke3VzZXJJZH0vJHtkaXJ9LyR7ZmlsZW5hbWV9YDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBcHBJbWFnZVVybCA9ICh7XG4gIGJ1Y2tldCxcbiAgZGlyZWN0b3J5ID0gJ2ltYWdlcycsXG4gIGltYWdlSWQsXG4gIGltYWdlVHlwZSA9ICdqcGcnLFxuICBpc1RodW1iID0gZmFsc2UsXG4gIHR5cGUsXG4gIHR5cGVJZFxufTogSW1hZ2VVcmxEYXRhKTogc3RyaW5nID0+IHtcbiAgaWYoIXR5cGUpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZighaW1hZ2VJZCkge1xuICAgIGlmKGltYWdlVHlwZSA9PT0gJ3BlcnNvbmEnKSB7XG4gICAgICByZXR1cm4gYCR7Q29uZmlnLmdldCgnaW1hZ2UuZGVmYXVsdFVybCcpfS91c2Vyc19iay5qcGdgO1xuICAgIH1cbiAgICByZXR1cm4gYCR7Q29uZmlnLmdldCgnaW1hZ2UuZGVmYXVsdFVybCcpfS91c2Vyc193aC5qcGdgO1xuICB9XG5cbiAgY29uc3QgYnVja2V0TmFtZSA9IGJ1Y2tldCB8fCBDb25maWcuZ2V0KCdpbWFnZS5idWNrZXQnKSB8fCAnZGV2LnJlYWt0b3IuaW8nO1xuICBjb25zdCBpbWFnZU5hbWUgPSBpc1RodW1iID8gYCR7aW1hZ2VJZH0tdGguJHtpbWFnZVR5cGV9YCA6IGAke2ltYWdlSWR9LiR7aW1hZ2VUeXBlID09PSAncGVyc29uYScgfHwgaW1hZ2VUeXBlID09PSAnb3RoZXInID8gJ2pwZycgOiBpbWFnZVR5cGV9YDtcbiAgY29uc3QgaW1hZ2VVcmwgPSBDb25maWcuZ2V0KCdpbWFnZS51cmwnKSB8fCBgaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tLyR7YnVja2V0TmFtZX1gO1xuXG4gIGlmKHR5cGUgPT09ICdhcHBzJykge1xuICAgIHJldHVybiBgJHtpbWFnZVVybH0vJHt0eXBlfS8ke2RpcmVjdG9yeX0vJHtpbWFnZU5hbWV9YDtcbiAgfVxuXG4gIHJldHVybiBgJHtpbWFnZVVybH0vJHt0eXBlfS8ke3R5cGVJZH0vJHtkaXJlY3Rvcnl9LyR7aW1hZ2VOYW1lfWA7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VVcmwgPSBhc3luYyAoe1xuICBidWNrZXQsXG4gIGltYWdlRGlyID0gJ2ltYWdlcycsXG4gIGltYWdlSWQsXG4gIGltYWdlVHlwZSA9ICdqcGcnLFxuICBpc1RodW1iID0gZmFsc2UsXG4gIHR5cGUsXG4gIHR5cGVJZCxcbiAgdXJsVHlwZSA9ICdwdWJsaWMnXG59OiBJbWFnZVVybERhdGEpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBpZighaW1hZ2VJZCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IGJ1Y2tldE5hbWUgPSBidWNrZXQgfHwgQ29uZmlnLmdldCgnaW1hZ2UuYnVja2V0JykgfHwgJ2Rldi5yZWFrdG9yLmlvJztcbiAgY29uc3QgY29uZmlndXJlZEltYWdlVXJsID0gU3RyaW5nKENvbmZpZy5nZXQoJ2ltYWdlLnVybCcpIHx8ICcnKTtcbiAgY29uc3QgY29uZmlndXJlZEFwcFVybCA9IFN0cmluZyhDb25maWcuZ2V0KCdhcHAudXJsJykgfHwgJycpO1xuICBjb25zdCBwdWJsaWNCYXNlVXJsID0gY29uZmlndXJlZEFwcFVybFxuICAgID8gYGh0dHBzOi8vYm94LiR7Y29uZmlndXJlZEFwcFVybH1gXG4gICAgOiAoY29uZmlndXJlZEltYWdlVXJsIHx8IGBodHRwczovL3MzLmFtYXpvbmF3cy5jb20vJHtidWNrZXROYW1lfWApO1xuICBjb25zdCBkZXZCYXNlVXJsID0gY29uZmlndXJlZEFwcFVybFxuICAgID8gYGh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9kZXYuJHtjb25maWd1cmVkQXBwVXJsfWBcbiAgICA6IChjb25maWd1cmVkSW1hZ2VVcmwgfHwgYGh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS8ke2J1Y2tldE5hbWV9YCk7XG5cbiAgLy8gQWx3YXlzIHVzZSBzaWduZWQgVVJMcyBmb3IgdGh1bWJuYWlsc1xuICBpZihpc1RodW1iKSB7XG4gICAgdXJsVHlwZSA9ICdzaWduZWQnO1xuICB9XG5cbiAgY29uc3QgdGh1bWJTdWZmaXggPSBpc1RodW1iID8gJy10aCcgOiAnJztcbiAgY29uc3QgaW1hZ2VLZXkgPSBgJHt0eXBlfS8ke3R5cGVJZH0vJHtpbWFnZURpcn0vJHtpbWFnZUlkfSR7dGh1bWJTdWZmaXh9LiR7aW1hZ2VUeXBlfWA7XG5cbiAgc3dpdGNoKHVybFR5cGUpIHtcbiAgICBjYXNlICdzaWduZWQnOiB7XG4gICAgICByZXR1cm4gYXdhaXQgczNHZXRTaWduZWRVcmwoe0J1Y2tldDogYnVja2V0TmFtZSwgRXhwaXJlczogNjAgKiA2MCwgS2V5OiBpbWFnZUtleX0pO1xuICAgIH1cbiAgICBjYXNlICdwdWJsaWMnOiB7XG4gICAgICByZXR1cm4gYCR7cHVibGljQmFzZVVybH0vJHtpbWFnZUtleX1gO1xuICAgIH1cbiAgICBjYXNlICdkZXYnOiB7XG4gICAgICByZXR1cm4gYCR7ZGV2QmFzZVVybH0vJHtpbWFnZUtleX1gO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcmVzaXplQW5kU2F2ZUltYWdlID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbWFnZUlkOiBzdHJpbmcsXG4gIGJ1ZmZlcjogQnVmZmVyLFxuICBmaWxlVHlwZTogc3RyaW5nID0gJ2ltYWdlL2pwZWcnLCBzM09wdGlvbnM/OiBQdXRPYmplY3RDb21tYW5kSW5wdXRcbik6IFByb21pc2U8SW1hZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdyZXNpemVTYXZlSW1hZ2UnO1xuICBjb25zdCB7c2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBpbWdXID0gQ29uZmlnLmdldCgnaW1hZ2UuaW1nU2l6ZScpO1xuICBjb25zdCBpbWdRID0gQ29uZmlnLmdldCgnaW1hZ2UuaW1nUXVhbGl0eScpO1xuICBjb25zdCBmb3JtYXQgPSAoZmlsZVR5cGUuc3BsaXQoJy8nKSlbMV0gfHwgJ2pwZWcnO1xuICBjb25zdCBzaGFycEZvcm1hdCA9IG5vcm1hbGl6ZUltYWdlRm9ybWF0KGZvcm1hdCk7XG4gIGxldCBpbWFnZU9wdGltaXplZEJ1ZmZlcjogQnVmZmVyID0gYnVmZmVyO1xuICBsZXQgdGh1bWJPcHRpbWl6ZWRCdWZmZXI6IEJ1ZmZlciA9IGJ1ZmZlcjtcbiAgbGV0IGltYWdlSWRlbnRpdHk6IEltYWdlVHlwZSA9IHtcbiAgICBmaWxlU2l6ZTogYnVmZmVyLmxlbmd0aCxcbiAgICBmaWxlVHlwZTogZm9ybWF0LFxuICAgIGltYWdlSWRcbiAgfTtcblxuICB0cnkge1xuICAgIGltYWdlT3B0aW1pemVkQnVmZmVyID0gYXdhaXQgc2hhcnAoYnVmZmVyKVxuICAgICAgLnJvdGF0ZSgpXG4gICAgICAucmVzaXplKHtcbiAgICAgICAgZml0OiAnaW5zaWRlJyxcbiAgICAgICAgaGVpZ2h0OiBpbWdXLFxuICAgICAgICB3aWR0aDogaW1nVyxcbiAgICAgICAgd2l0aG91dEVubGFyZ2VtZW50OiB0cnVlXG4gICAgICB9KVxuICAgICAgLnRvRm9ybWF0KHNoYXJwRm9ybWF0LCB7cXVhbGl0eTogaW1nUX0pXG4gICAgICAudG9CdWZmZXIoKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2ZpbGVUeXBlLCBpbWFnZUlkfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklNQUdFX1NBVkVcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGltYWdlT2JqOiBQdXRPYmplY3RDb21tYW5kSW5wdXQgPSB7XG4gICAgICBCb2R5OiBpbWFnZU9wdGltaXplZEJ1ZmZlcixcbiAgICAgIEJ1Y2tldDogbnVsbCxcbiAgICAgIENvbnRlbnRUeXBlOiBmaWxlVHlwZSxcbiAgICAgIC4uLihzM09wdGlvbnMgfHwge30pLFxuICAgICAgS2V5OiBnZXRVc2VySW1hZ2VQYXRoKHNlc3Npb25JZCwgaW1hZ2VJZCwgZmlsZVR5cGUsICdpbWFnZXMnKVxuICAgIH07XG4gICAgYXdhaXQgczNQdXQoaW1hZ2VPYmopO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZmlsZVR5cGUsIGltYWdlSWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU1BR0VfU0FWRVxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgW2ltYWdlTWV0YWRhdGEsIGltYWdlU3RhdHMsIHNvdXJjZU1ldGFkYXRhXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHNoYXJwKGltYWdlT3B0aW1pemVkQnVmZmVyKS5tZXRhZGF0YSgpLFxuICAgICAgc2hhcnAoaW1hZ2VPcHRpbWl6ZWRCdWZmZXIpLnN0YXRzKCksXG4gICAgICBzaGFycChidWZmZXIpLm1ldGFkYXRhKClcbiAgICBdKTtcbiAgICBjb25zdCB7YiwgZywgcn0gPSBpbWFnZVN0YXRzLmRvbWluYW50O1xuICAgIGNvbnN0IGNvbG9yID0gW3IsIGcsIGJdLm1hcCgodmFsdWUpID0+IHZhbHVlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTtcbiAgICBjb25zdCBleGlmTWV0YWRhdGEgPSBpbWFnZUV4aWZNZXRhZGF0YShzb3VyY2VNZXRhZGF0YS5leGlmKTtcblxuICAgIGltYWdlSWRlbnRpdHkgPSB7XG4gICAgICBjb2xvcixcbiAgICAgIGZpbGVTaXplOiBpbWFnZU9wdGltaXplZEJ1ZmZlci5sZW5ndGgsXG4gICAgICBmaWxlVHlwZTogZm9ybWF0LFxuICAgICAgaGVpZ2h0OiBpbWFnZU1ldGFkYXRhLmhlaWdodCB8fCAwLFxuICAgICAgaW1hZ2VJZCxcbiAgICAgIC4uLmV4aWZNZXRhZGF0YSxcbiAgICAgIG9yaWVudGF0aW9uOiBpbWFnZU1ldGFkYXRhLm9yaWVudGF0aW9uID8gU3RyaW5nKGltYWdlTWV0YWRhdGEub3JpZW50YXRpb24pIDogdW5kZWZpbmVkLFxuICAgICAgcXVhbGl0eTogaW1nUSxcbiAgICAgIHJlc29sdXRpb246IGltYWdlTWV0YWRhdGEuZGVuc2l0eSA/IGAke2ltYWdlTWV0YWRhdGEuZGVuc2l0eX0gcHBpYCA6IHVuZGVmaW5lZCxcbiAgICAgIHdpZHRoOiBpbWFnZU1ldGFkYXRhLndpZHRoIHx8IDBcbiAgICB9O1xuXG4gICAgY29uc3QgdGhtVyA9IENvbmZpZy5nZXQoJ2ltYWdlLnRobVNpemUnKTtcbiAgICBjb25zdCB0aG1RID0gQ29uZmlnLmdldCgnaW1hZ2UudGhtUXVhbGl0eScpO1xuICAgIHRodW1iT3B0aW1pemVkQnVmZmVyID0gYXdhaXQgc2hhcnAoaW1hZ2VPcHRpbWl6ZWRCdWZmZXIpXG4gICAgICAucmVzaXplKHtcbiAgICAgICAgZml0OiAnY292ZXInLFxuICAgICAgICBoZWlnaHQ6IHRobVcsXG4gICAgICAgIHBvc2l0aW9uOiAnY2VudHJlJyxcbiAgICAgICAgd2lkdGg6IHRobVdcbiAgICAgIH0pXG4gICAgICAudG9Gb3JtYXQoc2hhcnBGb3JtYXQsIHtxdWFsaXR5OiB0aG1RfSlcbiAgICAgIC50b0J1ZmZlcigpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZmlsZVR5cGUsIGltYWdlSWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU1BR0VfU0FWRVxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgdGh1bWJPYmo6IFB1dE9iamVjdENvbW1hbmRJbnB1dCA9IHtcbiAgICAgIEJvZHk6IHRodW1iT3B0aW1pemVkQnVmZmVyLFxuICAgICAgQnVja2V0OiBudWxsLFxuICAgICAgQ29udGVudFR5cGU6IGZpbGVUeXBlLFxuICAgICAgLi4uKHMzT3B0aW9ucyB8fCB7fSksXG4gICAgICBLZXk6IGdldFVzZXJJbWFnZVBhdGgoc2Vzc2lvbklkLCBpbWFnZUlkLCBmaWxlVHlwZSwgJ3RodW1icycpXG4gICAgfTtcbiAgICBhd2FpdCBzM1B1dCh0aHVtYk9iaik7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICByZXR1cm4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTUFHRV9TQVZFXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG5cbiAgcmV0dXJuIGltYWdlSWRlbnRpdHk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkSW1hZ2UgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGltYWdlOiBJbWFnZVR5cGUsXG4gIHMzT3B0aW9ucz86IFB1dE9iamVjdENvbW1hbmRJbnB1dFxuKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2FkZEltYWdlJztcbiAgY29uc3Qge3Nlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2ltYWdlSWQsIGRlc2NyaXB0aW9uLCBidWZmZXIsIGZpbGVUeXBlLCBpdGVtSWQsIGl0ZW1UeXBlLCBwcml2YWN5ID0gJ3B1YmxpYyd9ID0gaW1hZ2U7XG5cbiAgcmV0dXJuIHJlc2l6ZUFuZFNhdmVJbWFnZShjb250ZXh0LCBpbWFnZUlkLCBidWZmZXIsIGZpbGVUeXBlLCBzM09wdGlvbnMpXG4gICAgLnRoZW4oKHJlc2l6ZWRJbWFnZTogSW1hZ2VUeXBlKSA9PiB7XG4gICAgICBjb25zdCBpbnNlcnQ6IEltYWdlVHlwZSA9IHtcbiAgICAgICAgLi4ucmVzaXplZEltYWdlLFxuICAgICAgICBfa2V5OiBpbWFnZUlkLFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgZmlsZVR5cGUsXG4gICAgICAgIHByaXZhY3k6IG5vcm1hbGl6ZUltYWdlUHJpdmFjeShwcml2YWN5KSxcbiAgICAgICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhZGRJdGVtPEltYWdlVHlwZT4oY29udGV4dCwgJ2ltYWdlcycsIGluc2VydClcbiAgICAgICAgLnRoZW4oKHNhdmVkSW1hZ2U6IEltYWdlVHlwZSkgPT4gYWRkSW1hZ2VFZGdlKGNvbnRleHQsIHtcbiAgICAgICAgICBpbWFnZUlkLFxuICAgICAgICAgIGl0ZW1JZDogaXRlbUlkIHx8IHNlc3Npb25JZCxcbiAgICAgICAgICBpdGVtVHlwZTogcGFyc2VTdHJpbmcoaXRlbVR5cGUgfHwgJ3VzZXJzJywgMzIpLnRvTG93ZXJDYXNlKCkgYXMgQXJhbmdvRGJDb2xsZWN0aW9uLFxuICAgICAgICAgIHR5cGU6ICdpbWFnZSdcbiAgICAgICAgfSkudGhlbigoKSA9PiBzYXZlZEltYWdlKSk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTUFHRV9SRVNJWkVcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZEltYWdlRWRnZSA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCBpbWFnZUVkZ2U6IEltYWdlRWRnZVR5cGUpOiBQcm9taXNlPG9iamVjdD4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnYWRkSW1hZ2VFZGdlJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7aW1hZ2VJZCwgaXRlbUlkLCBpdGVtVHlwZX0gPSBpbWFnZUVkZ2U7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IGVkZ2VJZCA9IGNyZWF0ZUhhc2goYGhhc01lZGlhLWltYWdlLSR7aW1hZ2VJZH0tJHtpdGVtSWR9LSR7c2Vzc2lvbklkfWApO1xuICBjb25zdCBmb3JtYXRJdGVtVHlwZTogQXJhbmdvRGJDb2xsZWN0aW9uID0gcGFyc2VDaGFyKGl0ZW1UeXBlKS50b0xvd2VyQ2FzZSgpIGFzIEFyYW5nb0RiQ29sbGVjdGlvbjtcbiAgY29uc3QgZm9ybWF0SXRlbUlkID0gcGFyc2VJZChpdGVtSWQpO1xuICBjb25zdCBpdGVtRG9jSWQgPSBnZXREb2NJZChmb3JtYXRJdGVtVHlwZSwge19rZXk6IGZvcm1hdEl0ZW1JZH0pO1xuICBjb25zdCBmb3JtYXRJbWFnZUlkID0gcGFyc2VJZChpbWFnZUlkKTtcbiAgY29uc3QgZmlsZURvY0lkID0gYGltYWdlcy8ke2Zvcm1hdEltYWdlSWR9YDtcblxuICBjb25zdCBlZGdlOiBJbWFnZUVkZ2VUeXBlID0ge1xuICAgIF9mcm9tOiBpdGVtRG9jSWQsXG4gICAgX2tleTogZWRnZUlkLFxuICAgIF90bzogZmlsZURvY0lkLFxuICAgIGFkZGVkOiBub3csXG4gICAgaXRlbVR5cGUsXG4gICAgdHlwZTogJ2ltYWdlJ1xuICB9O1xuXG4gIGlmKGl0ZW1Eb2NJZCkge1xuICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLmNvbGxlY3Rpb24oRURHRVMuSEFTX01FRElBKS5zYXZlKGVkZ2UsIHtyZXR1cm5OZXc6IHRydWV9KVxuICAgICAgLnRoZW4oKGZpbGVFZGdlKSA9PiB1c2VEYihkYXRhYmFzZU5hbWUpLmNvbGxlY3Rpb24oRURHRVMuSEFTX01FRElBKS5kb2N1bWVudChmaWxlRWRnZSkpXG4gICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBlZGdlLFxuICAgICAgICAgIGZpbGVEb2NJZCxcbiAgICAgICAgICBpbWFnZUlkLFxuICAgICAgICAgIGl0ZW1Eb2NJZCxcbiAgICAgICAgICBpdGVtSWQsXG4gICAgICAgICAgaXRlbVR5cGVcbiAgICAgICAgfSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVJbWFnZSA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW1hZ2U6IEltYWdlVHlwZSxcbiAgczNPcHRpb25zPzogUHV0T2JqZWN0Q29tbWFuZElucHV0XG4pOiBQcm9taXNlPEltYWdlVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAndXBkYXRlSW1hZ2UnO1xuICBjb25zdCB7c2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgYmFzZTY0ID0gJycsXG4gICAgYnVmZmVyOiBpbWFnZUJ1ZmZlcixcbiAgICBkZXNjcmlwdGlvbixcbiAgICBpbWFnZUlkLFxuICAgIGl0ZW1JZCxcbiAgICBpdGVtVHlwZSxcbiAgICBmaWxlVHlwZSxcbiAgICBwcml2YWN5LFxuICAgIHVybCA9ICcnXG4gIH0gPSBpbWFnZTtcblxuICBjb25zdCBmb3JtYXRJbWFnZUlkID0gaW1hZ2VJZCB8fCBjcmVhdGVIYXNoKGBpbWFnZS0ke3Nlc3Npb25JZH1gKTtcbiAgY29uc3QgZm9ybWF0SXRlbUlkID0gcGFyc2VJZChpdGVtSWQpO1xuICBjb25zdCBmb3JtYXRJdGVtVHlwZTogQXJhbmdvRGJDb2xsZWN0aW9uID0gcGFyc2VDaGFyKGl0ZW1UeXBlLCAxNikudG9Mb3dlckNhc2UoKSBhcyBBcmFuZ29EYkNvbGxlY3Rpb247XG4gIGNvbnN0IGN1c3RvbVBhcmFtczogSW1hZ2VUeXBlID0ge1xuICAgIGRlc2NyaXB0aW9uLFxuICAgIGltYWdlSWQ6IGZvcm1hdEltYWdlSWQsXG4gICAgcHJpdmFjeTogbm9ybWFsaXplSW1hZ2VQcml2YWN5KHByaXZhY3kpLFxuICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gIH07XG5cbiAgaWYoYmFzZTY0IHx8IGltYWdlQnVmZmVyKSB7XG4gICAgbGV0IGJ1ZmZlcjogQnVmZmVyID0gaW1hZ2VCdWZmZXI7XG5cbiAgICBpZihiYXNlNjQpIHtcbiAgICAgIGNvbnN0IGZvcm1hdEJhc2U2NCA9IGJhc2U2NC5zdWJzdHIoYmFzZTY0LmluZGV4T2YoJywnKSArIDEpO1xuICAgICAgYnVmZmVyID0gQnVmZmVyLmZyb20oZm9ybWF0QmFzZTY0LCAnYmFzZTY0Jyk7XG4gICAgfVxuXG4gICAgbGV0IHVwZGF0ZWRGaWxlVHlwZSA9IGZpbGVUeXBlO1xuXG4gICAgaWYoIWZpbGVUeXBlKSB7XG4gICAgICBjb25zdCB7ZmlsZVR5cGVGcm9tQnVmZmVyfSA9IGF3YWl0IGltcG9ydCgnZmlsZS10eXBlJyk7XG4gICAgICBjb25zdCB7bWltZX0gPSBhd2FpdCBmaWxlVHlwZUZyb21CdWZmZXIoYnVmZmVyKTtcbiAgICAgIHVwZGF0ZWRGaWxlVHlwZSA9IG1pbWU7XG4gICAgfVxuXG4gICAgY29uc3QgaW1nUGFyYW1zOiBJbWFnZVR5cGUgPSB7XG4gICAgICAuLi5jdXN0b21QYXJhbXMsXG4gICAgICBidWZmZXIsXG4gICAgICBmaWxlVHlwZTogdXBkYXRlZEZpbGVUeXBlXG4gICAgfTtcblxuICAgIHJldHVybiBhZGRJbWFnZShjb250ZXh0LCBpbWdQYXJhbXMsIHMzT3B0aW9ucylcbiAgICAgIC50aGVuKChpbWFnZTogSW1hZ2VUeXBlKSA9PiB7XG4gICAgICAgIGlmKGZvcm1hdEl0ZW1JZCAmJiBmb3JtYXRJdGVtVHlwZSkge1xuICAgICAgICAgIGNvbnN0IGltYWdlRWRnZTogSW1hZ2VFZGdlVHlwZSA9IHtcbiAgICAgICAgICAgIGltYWdlSWQ6IGZvcm1hdEltYWdlSWQsXG4gICAgICAgICAgICBpdGVtSWQ6IGZvcm1hdEl0ZW1JZCxcbiAgICAgICAgICAgIGl0ZW1UeXBlOiBmb3JtYXRJdGVtVHlwZSxcbiAgICAgICAgICAgIHR5cGU6ICdpbWFnZSdcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBhZGRJbWFnZUVkZ2UoY29udGV4dCwgaW1hZ2VFZGdlKS50aGVuKCgpID0+IGltYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbWFnZTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklNQUdFX1NBVkVcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG4gIH0gZWxzZSBpZih1cmwgIT09ICcnKSB7XG4gICAgbGV0IGNvbnRlbnRUeXBlO1xuXG4gICAgcmV0dXJuIGh0dHBHZXQodXJsKVxuICAgICAgLnRoZW4oKHJlczogSHR0cFJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgICAgIHJldHVybiBsb2dFeGNlcHRpb24oe1xuICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTUFHRV9SRVFVRVNUXG4gICAgICAgICAgfSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZW50VHlwZSA9IHJlcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgICAudGhlbigocmVzKSA9PiAocmVzIGFzIEh0dHBSZXNwb25zZSkuYnVmZmVyKCkpXG4gICAgICAudGhlbigoYnVmZmVyOiBCdWZmZXIpID0+IHtcbiAgICAgICAgY29uc3QgaW1nUGFyYW1zOiBJbWFnZVR5cGUgPSB7XG4gICAgICAgICAgLi4uY3VzdG9tUGFyYW1zLFxuICAgICAgICAgIGJ1ZmZlcixcbiAgICAgICAgICBmaWxlVHlwZTogY29udGVudFR5cGVcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gYWRkSW1hZ2UoY29udGV4dCwgaW1nUGFyYW1zLCBzM09wdGlvbnMpXG4gICAgICAgICAgLnRoZW4oKGltYWdlOiBJbWFnZVR5cGUpID0+IHtcbiAgICAgICAgICAgIGlmKGZvcm1hdEl0ZW1JZCAmJiBmb3JtYXRJdGVtVHlwZSkge1xuICAgICAgICAgICAgICBjb25zdCBpbWFnZUVkZ2U6IEltYWdlRWRnZVR5cGUgPSB7aW1hZ2VJZDogZm9ybWF0SW1hZ2VJZCwgaXRlbUlkOiBmb3JtYXRJdGVtSWQsIGl0ZW1UeXBlOiBmb3JtYXRJdGVtVHlwZSwgdHlwZTogJ2ltYWdlJ307XG4gICAgICAgICAgICAgIHJldHVybiBhZGRJbWFnZUVkZ2UoY29udGV4dCwgaW1hZ2VFZGdlKS50aGVuKCgpID0+IGltYWdlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGltYWdlO1xuICAgICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiAnZmV0Y2hfZXJyb3InXG4gICAgICB9LCBlcnJvciwgY29udGV4dCkpO1xuICB9IGVsc2UgaWYoaW1hZ2VJZCkge1xuICAgIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICAgIC4uLihkZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkID8ge2Rlc2NyaXB0aW9ufSA6IHt9KSxcbiAgICAgIC4uLihwcml2YWN5ICE9PSB1bmRlZmluZWQgPyB7cHJpdmFjeTogbm9ybWFsaXplSW1hZ2VQcml2YWN5KHByaXZhY3kpfSA6IHt9KVxuICAgIH07XG5cbiAgICByZXR1cm4gdXBkYXRlSXRlbTxJbWFnZVR5cGU+KGNvbnRleHQsICdpbWFnZXMnLCBmb3JtYXRJbWFnZUlkLCB1cGRhdGUpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlSW1hZ2UgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgaW1hZ2VJZDogc3RyaW5nKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2RlbGV0ZSc7XG4gIGNvbnN0IHtzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdEltYWdlSWQgPSBwYXJzZUlkKGltYWdlSWQpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgaW1hZ2UgPSBhd2FpdCBkZWxldGVJdGVtPEltYWdlVHlwZT4oY29udGV4dCwgJ2ltYWdlcycsIGZvcm1hdEltYWdlSWQsIHtcbiAgICAgIGNhc2NhZGU6IFtFREdFUy5IQVNfTUVESUFdLFxuICAgICAgb3duZXJzaGlwOiB0cnVlXG4gICAgfSk7XG5cbiAgICBpZighaW1hZ2UpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIERlbGV0ZSBTMyBmaWxlc1xuICAgIGNvbnN0IHtfa2V5OiBpbWFnZUtleX0gPSBpbWFnZTtcbiAgICBjb25zdCBwYXJhbXM6IERlbGV0ZU9iamVjdHNDb21tYW5kSW5wdXQgPSB7XG4gICAgICBCdWNrZXQ6IG51bGwsXG4gICAgICBEZWxldGU6IHtcbiAgICAgICAgT2JqZWN0czogW1xuICAgICAgICAgIHtLZXk6IGB1c2Vycy8ke3Nlc3Npb25JZH0vaW1hZ2VzLyR7aW1hZ2VLZXl9LmpwZ2B9LFxuICAgICAgICAgIHtLZXk6IGB1c2Vycy8ke3Nlc3Npb25JZH0vdGh1bWJzLyR7aW1hZ2VLZXl9LmpwZ2B9XG4gICAgICAgIF0sXG4gICAgICAgIFF1aWV0OiB0cnVlXG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBzM0RlbGV0ZUxpc3QocGFyYW1zKS50aGVuKCgpID0+IGltYWdlKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2ltYWdlSWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gIH1cbn07XG4iXSwibmFtZXMiOlsiZ2V0IiwiaHR0cEdldCIsInBhcnNlTnVtIiwiY3JlYXRlSGFzaCIsInBhcnNlQXJhbmdvSWQiLCJwYXJzZUNoYXIiLCJwYXJzZUlkIiwicGFyc2VTdHJpbmciLCJhcWwiLCJsaXRlcmFsIiwiZXhpZlJlYWRlciIsInNoYXJwIiwiQ29uZmlnIiwiQ09MTEVDVElPTlMiLCJFREdFUyIsIkVycm9yVHlwZXMiLCJsb2dFcnJvciIsImxvZ0V4Y2VwdGlvbiIsImdldERvY0lkIiwiZ2V0TGltaXQiLCJzZWxlY3RSZWFjdGlvbkNvdW50QnlUeXBlIiwidXNlRGIiLCJnZXRJbWFnZUV4dGVuc2lvbiIsImFkZEl0ZW0iLCJkZWxldGVJdGVtIiwiZ2V0SXRlbUJ5IiwiZ2V0TGlzdEJ5IiwidXBkYXRlSXRlbSIsImdldEdyb3VwRGV0YWlscyIsImlzR3JvdXBlZCIsImdldFBlcnNvbmFSZWxhdGlvbnNoaXBTdGF0ZSIsInMzRGVsZXRlTGlzdCIsInMzR2V0U2lnbmVkVXJsIiwiczNQdXQiLCJoYXNTdWJzY3JpcHRpb25Ub0l0ZW0iLCJldmVudENhdGVnb3J5IiwiaGFzUmVhY3Rpb25Db2xsZWN0aW9uIiwiSEFTX1JFQUNUSU9OIiwiaGFzTWVkaWFDb2xsZWN0aW9uIiwiSEFTX01FRElBIiwicGVyc29uYXNDb2xsZWN0aW9uIiwiUEVSU09OQVMiLCJNRURJQV9JVEVNX0NPTExFQ1RJT05TIiwiVVNFUlMiLCJQT1NUUyIsIkdST1VQUyIsImdldE1lZGlhSXRlbURvY0lkcyIsIml0ZW1JZCIsIml0ZW1UeXBlIiwiZG9jSWQiLCJpdGVtS2V5IiwiaW5jbHVkZXMiLCJtYXAiLCJjb2xsZWN0aW9uIiwibm9ybWFsaXplSW1hZ2VGb3JtYXQiLCJmb3JtYXQiLCJpbWFnZUV4aWZNZXRhZGF0YSIsImV4aWYiLCJtZXRhZGF0YSIsInRha2VuIiwiUGhvdG8iLCJEYXRlVGltZU9yaWdpbmFsIiwibWFrZSIsIkltYWdlIiwiTWFrZSIsIm1vZGVsIiwiTW9kZWwiLCJEYXRlIiwiZ2V0VGltZSIsInVuZGVmaW5lZCIsIm5vcm1hbGl6ZUltYWdlUHJpdmFjeSIsInByaXZhY3kiLCJTdHJpbmciLCJ0cmltIiwidG9Mb3dlckNhc2UiLCJjYW5WaWV3SW1hZ2UiLCJpbWFnZSIsInZpZXdlclVzZXJJZCIsImFjY2VzcyIsImlzT3duZXIiLCJ1c2VySWQiLCJjYW5WaWV3RnJpZW5kcyIsImNhblZpZXdWaXAiLCJwYXJzZUltYWdlT3B0aW9ucyIsIm9wdGlvbnMiLCJmcm9tIiwidG8iLCJ0eXBlIiwibGltaXQiLCJnZXRJbWFnZU9wdGlvbmFsRmllbGRzIiwiZmllbGRzIiwicmVkdWNlIiwic2VsZWN0cyIsImZpZWxkIiwicXVlcmllcyIsInB1c2giLCJvYmplY3RzIiwiZ2V0SW1hZ2VMaXN0QnlVc2VyIiwiY29udGV4dCIsImFjdGlvbiIsImZvcm1hdFVzZXJJZCIsInNvcnQiLCJkaXJlY3Rpb24iLCJjdXN0b21RdWVyaWVzIiwiY3VzdG9tT2JqZWN0cyIsImNhdGNoIiwiZXJyb3IiLCJjYXRlZ29yeSIsInBhcmFtcyIsInZhbHVlIiwiREFUQUJBU0VfRVJST1IiLCJnZXRJbWFnZUNvdW50QnlJdGVtIiwiZGF0YWJhc2VOYW1lIiwiaXRlbURvY0lkcyIsImFxbFFyeSIsInF1ZXJ5IiwidGhlbiIsImN1cnNvciIsIm5leHQiLCJjb3VudCIsImdldEltYWdlTGlzdEJ5SXRlbSIsInNlc3Npb24iLCJzZXNzaW9uVXNlcklkIiwiZm9ybWF0SXRlbVR5cGUiLCJzZWxlY3RPYmplY3RzIiwic2VsZWN0UXVlcmllcyIsImpvaW4iLCJsZW5ndGgiLCJsaXN0IiwiYWxsIiwib3duZXJVc2VySWQiLCJmaWx0ZXIiLCJtZWRpYUl0ZW1LZXkiLCJfbWVkaWFJdGVtS2V5IiwibWVkaWFJdGVtVHlwZSIsIl9tZWRpYUl0ZW1UeXBlIiwicmVsYXRpb25zaGlwIiwiaXNGcmllbmQiLCJnZXRJbWFnZUxpc3RCeUdyb3VwIiwic2Vzc2lvbklkIiwiZmlsdGVycyIsImdyb3VwSWQiLCJmb3JtYXRHcm91cElkIiwiY29uZGl0aW9uYWwiLCJuYW1lIiwiZm9ybWF0Q29uZCIsImdyb3VwIiwiZmlsdGVyU3RyIiwiZ3JvdXBlZCIsImlzVmFsaWQiLCJmaWx0ZXJMaXN0IiwiZ2V0SW1hZ2VMaXN0QnlSZWFjdGlvbnMiLCJyZWFjdGlvbnMiLCJmb3JtYXRTZXNzaW9uSWQiLCJmb3JtYXRSZWFjdGlvbnMiLCJyZWFjdGlvbk5hbWUiLCJmaWx0ZXJCeSIsIkpTT04iLCJzdHJpbmdpZnkiLCJnZXRQZXJzb25hRG9jSWQiLCJwZXJzb25hSWQiLCJwZXJzb25hRG9jSWQiLCJwZXJzb25hS2V5IiwiZ2V0SW1hZ2VMaXN0QnlQZXJzb25hUmVhY3Rpb25zIiwic2Vzc2lvblBlcnNvbmFJZCIsInJlYWN0aW9uTmFtZXMiLCJBcnJheSIsImlzQXJyYXkiLCJCb29sZWFuIiwiZ2V0SW1hZ2VCeUlkIiwiaW1hZ2VJZCIsImZvcm1hdEltYWdlSWQiLCJvcGVyYXRvciIsImdldFVzZXJJbWFnZVBhdGgiLCJpbWFnZVR5cGUiLCJkaXIiLCJmaWxlbmFtZSIsImdldEFwcEltYWdlVXJsIiwiYnVja2V0IiwiZGlyZWN0b3J5IiwiaXNUaHVtYiIsInR5cGVJZCIsImJ1Y2tldE5hbWUiLCJpbWFnZU5hbWUiLCJpbWFnZVVybCIsImdldEltYWdlVXJsIiwiaW1hZ2VEaXIiLCJ1cmxUeXBlIiwiY29uZmlndXJlZEltYWdlVXJsIiwiY29uZmlndXJlZEFwcFVybCIsInB1YmxpY0Jhc2VVcmwiLCJkZXZCYXNlVXJsIiwidGh1bWJTdWZmaXgiLCJpbWFnZUtleSIsIkJ1Y2tldCIsIkV4cGlyZXMiLCJLZXkiLCJyZXNpemVBbmRTYXZlSW1hZ2UiLCJidWZmZXIiLCJmaWxlVHlwZSIsInMzT3B0aW9ucyIsImltZ1ciLCJpbWdRIiwic3BsaXQiLCJzaGFycEZvcm1hdCIsImltYWdlT3B0aW1pemVkQnVmZmVyIiwidGh1bWJPcHRpbWl6ZWRCdWZmZXIiLCJpbWFnZUlkZW50aXR5IiwiZmlsZVNpemUiLCJyb3RhdGUiLCJyZXNpemUiLCJmaXQiLCJoZWlnaHQiLCJ3aWR0aCIsIndpdGhvdXRFbmxhcmdlbWVudCIsInRvRm9ybWF0IiwicXVhbGl0eSIsInRvQnVmZmVyIiwiSU1BR0VfU0FWRSIsImltYWdlT2JqIiwiQm9keSIsIkNvbnRlbnRUeXBlIiwiaW1hZ2VNZXRhZGF0YSIsImltYWdlU3RhdHMiLCJzb3VyY2VNZXRhZGF0YSIsIlByb21pc2UiLCJzdGF0cyIsImIiLCJnIiwiciIsImRvbWluYW50IiwiY29sb3IiLCJ0b1N0cmluZyIsInBhZFN0YXJ0IiwiZXhpZk1ldGFkYXRhIiwib3JpZW50YXRpb24iLCJyZXNvbHV0aW9uIiwiZGVuc2l0eSIsInRobVciLCJ0aG1RIiwicG9zaXRpb24iLCJ0aHVtYk9iaiIsImFkZEltYWdlIiwiZGVzY3JpcHRpb24iLCJyZXNpemVkSW1hZ2UiLCJpbnNlcnQiLCJfa2V5Iiwic2F2ZWRJbWFnZSIsImFkZEltYWdlRWRnZSIsIklNQUdFX1JFU0laRSIsImltYWdlRWRnZSIsIm5vdyIsImVkZ2VJZCIsImZvcm1hdEl0ZW1JZCIsIml0ZW1Eb2NJZCIsImZpbGVEb2NJZCIsImVkZ2UiLCJfZnJvbSIsIl90byIsImFkZGVkIiwic2F2ZSIsInJldHVybk5ldyIsImZpbGVFZGdlIiwiZG9jdW1lbnQiLCJ1cGRhdGVJbWFnZSIsImJhc2U2NCIsImltYWdlQnVmZmVyIiwidXJsIiwiY3VzdG9tUGFyYW1zIiwiZm9ybWF0QmFzZTY0Iiwic3Vic3RyIiwiaW5kZXhPZiIsIkJ1ZmZlciIsInVwZGF0ZWRGaWxlVHlwZSIsImZpbGVUeXBlRnJvbUJ1ZmZlciIsIm1pbWUiLCJpbWdQYXJhbXMiLCJjb250ZW50VHlwZSIsInJlcyIsInN0YXR1cyIsIklNQUdFX1JFUVVFU1QiLCJoZWFkZXJzIiwidXBkYXRlIiwiZGVsZXRlSW1hZ2UiLCJjYXNjYWRlIiwib3duZXJzaGlwIiwiRGVsZXRlIiwiT2JqZWN0cyIsIlF1aWV0Il0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FFRCxTQUFRQSxPQUFPQyxPQUFPLFFBQU8sb0JBQW9CO0FBQ2pELFNBQVFDLFFBQVEsUUFBTywrQkFBK0I7QUFDdEQsU0FBUUMsVUFBVSxFQUFFQyxhQUFhLEVBQUVDLFNBQVMsRUFBRUMsT0FBTyxFQUFFQyxXQUFXLFFBQU8sK0JBQStCO0FBQ3hHLFNBQVFDLEdBQUcsUUFBTyxXQUFXO0FBQzdCLFNBQWtCQyxPQUFPLFFBQU8sZUFBZTtBQUMvQyxPQUFPQyxnQkFBZ0IsY0FBYztBQUNyQyxPQUFPQyxXQUFXLFFBQVE7QUFFMUIsU0FBUUMsTUFBTSxRQUFPLGVBQWU7QUFDcEMsU0FBUUMsV0FBVyxFQUFFQyxLQUFLLFFBQU8sOEJBQThCO0FBQy9ELFNBQVFDLFVBQVUsUUFBTywwQkFBMEI7QUFDbkQsU0FBUUMsUUFBUSxFQUFFQyxZQUFZ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
873
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9pbWFnZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIGlzIHN1YmplY3QgdG8gdGhlIGFjY29tcGFueWluZyBjb21tZXJjaWFsIExJQ0VOU0UuXG4gKi9cbmltcG9ydCB7RGVsZXRlT2JqZWN0c0NvbW1hbmRJbnB1dCwgUHV0T2JqZWN0Q29tbWFuZElucHV0fSBmcm9tICdAYXdzLXNkay9jbGllbnQtczMnO1xuaW1wb3J0IHtnZXQgYXMgaHR0cEdldH0gZnJvbSAnQG5sYWJzL3JpcC1odW50ZXInO1xuaW1wb3J0IHtwYXJzZU51bX0gZnJvbSAnQG5sYWJzL3V0aWxzL3BhcnNlcnMvbnVtYmVycyc7XG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlQXJhbmdvSWQsIHBhcnNlQ2hhciwgcGFyc2VJZCwgcGFyc2VTdHJpbmd9IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL3N0cmluZ3MnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnksIGxpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQgZXhpZlJlYWRlciBmcm9tICdleGlmLXJlYWRlcic7XG5pbXBvcnQgc2hhcnAgZnJvbSAnc2hhcnAnO1xuXG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7Q09MTEVDVElPTlMsIEVER0VTfSBmcm9tICcuLi9jb25zdGFudHMvY29sbGVjdGlvbnMuanMnO1xuaW1wb3J0IHtFcnJvclR5cGVzfSBmcm9tICcuLi90eXBlcy9lcnJvci50eXBlcy5qcyc7XG5pbXBvcnQge2xvZ0Vycm9yLCBsb2dFeGNlcHRpb259IGZyb20gJy4uL3V0aWxzL2FuYWx5dGljc1V0aWxzLmpzJztcbmltcG9ydCB7Z2V0RG9jSWQsIGdldExpbWl0LCBzZWxlY3RSZWFjdGlvbkNvdW50QnlUeXBlLCB1c2VEYn0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscy5qcyc7XG5pbXBvcnQge2dldEltYWdlRXh0ZW5zaW9ufSBmcm9tICcuLi91dGlscy9pbWFnZVV0aWxzLmpzJztcbmltcG9ydCB7YWRkSXRlbSwgZGVsZXRlSXRlbSwgZ2V0SXRlbUJ5LCBnZXRMaXN0QnksIHVwZGF0ZUl0ZW19IGZyb20gJy4vY3J1ZC5qcyc7XG5pbXBvcnQge2dldEdyb3VwRGV0YWlscywgaXNHcm91cGVkfSBmcm9tICcuL2dyb3Vwcy5qcyc7XG5pbXBvcnQge2dldFBlcnNvbmFSZWxhdGlvbnNoaXBTdGF0ZX0gZnJvbSAnLi9wZXJzb25hcy5qcyc7XG5pbXBvcnQge3MzRGVsZXRlTGlzdCwgczNHZXRTaWduZWRVcmwsIHMzUHV0fSBmcm9tICcuL3MzLmpzJztcbmltcG9ydCB7aGFzU3Vic2NyaXB0aW9uVG9JdGVtfSBmcm9tICcuL3N1YnNjcmlwdGlvbnMuanMnO1xuXG5pbXBvcnQgdHlwZSB7UXVlcnlGaWx0ZXJ9IGZyb20gJy4uL3R5cGVzL2FwcHMudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0FyYW5nb0RiQ29sbGVjdGlvbiwgQXJhbmdvRGJMaW1pdH0gZnJvbSAnLi4vdHlwZXMvYXJhbmdvZGIudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0dyb3VwVHlwZSwgR3JvdXBVc2VyfSBmcm9tICcuLi90eXBlcy9ncm91cHMudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0ltYWdlRWRnZVR5cGUsIEltYWdlT3B0aW9ucywgSW1hZ2VUeXBlLCBJbWFnZVVybERhdGF9IGZyb20gJy4uL3R5cGVzL2ltYWdlcy50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7RmlsdGVyR3JvdXB9IGZyb20gJy4uL3V0aWxzL2FxbEhlbHBlcnMuanMnO1xuXG4vLyBEZWZpbmUgaW50ZXJmYWNlIGZvciBIVFRQIHJlc3BvbnNlIHdpdGggYnVmZmVyIG1ldGhvZFxuaW50ZXJmYWNlIEh0dHBSZXNwb25zZSBleHRlbmRzIFJlc3BvbnNlIHtcbiAgYnVmZmVyKCk6IFByb21pc2U8QnVmZmVyPjtcbn1cblxuY29uc3QgZXZlbnRDYXRlZ29yeSA9ICdpbWFnZXMnO1xuY29uc3QgaGFzUmVhY3Rpb25Db2xsZWN0aW9uID0gbGl0ZXJhbChFREdFUy5IQVNfUkVBQ1RJT04pO1xuY29uc3QgaGFzTWVkaWFDb2xsZWN0aW9uID0gbGl0ZXJhbChFREdFUy5IQVNfTUVESUEpO1xuY29uc3QgcGVyc29uYXNDb2xsZWN0aW9uID0gbGl0ZXJhbChDT0xMRUNUSU9OUy5QRVJTT05BUyk7XG5jb25zdCBNRURJQV9JVEVNX0NPTExFQ1RJT05TOiByZWFkb25seSBBcmFuZ29EYkNvbGxlY3Rpb25bXSA9IFtcbiAgQ09MTEVDVElPTlMuUEVSU09OQVMsXG4gIENPTExFQ1RJT05TLlVTRVJTLFxuICBDT0xMRUNUSU9OUy5QT1NUUyxcbiAgQ09MTEVDVElPTlMuR1JPVVBTXG5dO1xuXG50eXBlIFNoYXJwRm9ybWF0ID0gRXh0cmFjdDxQYXJhbWV0ZXJzPFJldHVyblR5cGU8dHlwZW9mIHNoYXJwPlsndG9Gb3JtYXQnXT5bMF0sIHN0cmluZz47XG5cbmNvbnN0IGdldE1lZGlhSXRlbURvY0lkcyA9IChpdGVtSWQ6IHN0cmluZywgaXRlbVR5cGU/OiBBcmFuZ29EYkNvbGxlY3Rpb24pOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IGRvY0lkID0gcGFyc2VBcmFuZ29JZChpdGVtSWQpO1xuXG4gIGlmKGRvY0lkKSB7XG4gICAgcmV0dXJuIFtkb2NJZF07XG4gIH1cblxuICBjb25zdCBpdGVtS2V5ID0gcGFyc2VJZChpdGVtSWQpO1xuXG4gIGlmKCFpdGVtS2V5KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaWYoaXRlbVR5cGUgJiYgTUVESUFfSVRFTV9DT0xMRUNUSU9OUy5pbmNsdWRlcyhpdGVtVHlwZSkpIHtcbiAgICByZXR1cm4gW2Ake2l0ZW1UeXBlfS8ke2l0ZW1LZXl9YF07XG4gIH1cblxuICByZXR1cm4gTUVESUFfSVRFTV9DT0xMRUNUSU9OUy5tYXAoKGNvbGxlY3Rpb24pID0+IGAke2NvbGxlY3Rpb259LyR7aXRlbUtleX1gKTtcbn07XG5cbmNvbnN0IG5vcm1hbGl6ZUltYWdlRm9ybWF0ID0gKGZvcm1hdDogc3RyaW5nKTogU2hhcnBGb3JtYXQgPT5cbiAgKGZvcm1hdCA9PT0gJ2pwZycgPyAnanBlZycgOiBmb3JtYXQpIGFzIFNoYXJwRm9ybWF0O1xuXG5jb25zdCBpbWFnZUV4aWZNZXRhZGF0YSA9IChleGlmPzogQnVmZmVyKSA9PiB7XG4gIGlmKCFleGlmKSByZXR1cm4ge307XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGV4aWZSZWFkZXIoZXhpZik7XG4gICAgY29uc3QgdGFrZW4gPSBtZXRhZGF0YS5QaG90bz8uRGF0ZVRpbWVPcmlnaW5hbDtcbiAgICByZXR1cm4ge1xuICAgICAgbWFrZTogbWV0YWRhdGEuSW1hZ2U/Lk1ha2UsXG4gICAgICBtb2RlbDogbWV0YWRhdGEuSW1hZ2U/Lk1vZGVsLFxuICAgICAgdGFrZW46IHRha2VuIGluc3RhbmNlb2YgRGF0ZSA/IHRha2VuLmdldFRpbWUoKSA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufTtcblxuY29uc3Qgbm9ybWFsaXplSW1hZ2VQcml2YWN5ID0gKHByaXZhY3k6IHVua25vd24pOiAnZnJpZW5kcycgfCAncHJpdmF0ZScgfCAncHVibGljJyB8ICd2aXAnID0+IHtcbiAgc3dpdGNoKFN0cmluZyhwcml2YWN5IHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2ZyaWVuZHMnOlxuICAgICAgcmV0dXJuICdmcmllbmRzJztcbiAgICBjYXNlICdwcml2YXRlJzpcbiAgICAgIHJldHVybiAncHJpdmF0ZSc7XG4gICAgY2FzZSAndmlwJzpcbiAgICAgIHJldHVybiAndmlwJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICdwdWJsaWMnO1xuICB9XG59O1xuXG5jb25zdCBjYW5WaWV3SW1hZ2UgPSAoXG4gIGltYWdlOiBJbWFnZVR5cGUsXG4gIHZpZXdlclVzZXJJZDogc3RyaW5nLFxuICBhY2Nlc3M6IHtcbiAgICByZWFkb25seSBjYW5WaWV3RnJpZW5kczogYm9vbGVhbjtcbiAgICByZWFkb25seSBjYW5WaWV3VmlwOiBib29sZWFuO1xuICAgIHJlYWRvbmx5IGlzT3duZXI6IGJvb2xlYW47XG4gIH1cbikgPT4ge1xuICBjb25zdCBwcml2YWN5ID0gbm9ybWFsaXplSW1hZ2VQcml2YWN5KGltYWdlPy5wcml2YWN5KTtcblxuICBpZihhY2Nlc3MuaXNPd25lciB8fCBTdHJpbmcoaW1hZ2U/LnVzZXJJZCB8fCAnJykgPT09IHZpZXdlclVzZXJJZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3dpdGNoKHByaXZhY3kpIHtcbiAgICBjYXNlICdwcml2YXRlJzpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjYXNlICdmcmllbmRzJzpcbiAgICAgIHJldHVybiBhY2Nlc3MuY2FuVmlld0ZyaWVuZHM7XG4gICAgY2FzZSAndmlwJzpcbiAgICAgIHJldHVybiBhY2Nlc3MuY2FuVmlld1ZpcDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBwYXJzZUltYWdlT3B0aW9ucyA9IChvcHRpb25zOiBJbWFnZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZnJvbSA9IDAsXG4gICAgdG8gPSAzMCxcbiAgICB0eXBlID0gJ2RlZmF1bHQnXG4gIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiB7XG4gICAgbGltaXQ6IGdldExpbWl0KGZyb20sIHRvKSBhcyBBcmFuZ29EYkxpbWl0LFxuICAgIHR5cGU6IHBhcnNlQ2hhcih0eXBlLCAzMilcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZU9wdGlvbmFsRmllbGRzID0gKGZpZWxkczogc3RyaW5nW10gPSBbXSkgPT5cbiAgZmllbGRzLnJlZHVjZSgoc2VsZWN0cywgZmllbGQ6IHN0cmluZykgPT4ge1xuICAgIGlmKGZpZWxkLmluY2x1ZGVzKCdDb3VudCcpKSB7XG4gICAgICByZXR1cm4gc2VsZWN0UmVhY3Rpb25Db3VudEJ5VHlwZSgnaW1hZ2VzJywgJ2knLCBmaWVsZCwgc2VsZWN0cyk7XG4gICAgfVxuXG4gICAgc3dpdGNoKGZpZWxkKSB7XG4gICAgICBjYXNlICdyZWFjdGlvbnMnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgICAgIEZPUiBpbWFnZSwgciBJTiBJTkJPVU5EIGkuX2lkIHJlYWN0aW9uc1xuICAgICAgICAgIENPTExFQ1QgcmVhY3Rpb25OYW1lID0gci52YWx1ZSBJTlRPIHJlYWN0aW9uSXRlbXNcbiAgICAgICAgICBSRVRVUk4ge25hbWU6IHJlYWN0aW9uTmFtZSwgY291bnQ6IExFTkdUSChyZWFjdGlvbkl0ZW1zWypdLnIudmFsdWUpfVxuICAgICAgICApYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCdyZWFjdGlvbnM6cmVhY3Rpb25zJyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFncyc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCB0YWdzID0gKFxuICAgICAgICAgIEZPUiB0LCBwbCBJTiBJTkJPVU5EIGkuX2lkIGlzVGFnZ2VkXG4gICAgICAgICAgUkVUVVJOIHRcbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgndGFnczp0YWdzJyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgY2FzZSAndXNlcnMnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgdXNlcnMgPSBGSVJTVChcbiAgICAgICAgICBGT1IgdSBJTiB1c2Vyc1xuICAgICAgICAgIEZJTFRFUiBpLnVzZXJJZCA9PSB1Ll9rZXlcbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIHVcbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgndXNlcnM6dXNlcnMnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgIH1cbiAgfSwge29iamVjdHM6IFtdLCBxdWVyaWVzOiBbXX0pO1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VMaXN0QnlVc2VyID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB1c2VySWQ6IHN0cmluZyxcbiAgZnJvbTogbnVtYmVyID0gMCxcbiAgdG86IG51bWJlciA9IDMwXG4pOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRJbWFnZXNCeVVzZXInO1xuICBjb25zdCBmb3JtYXRVc2VySWQgPSBwYXJzZUlkKHVzZXJJZCk7XG5cbiAgcmV0dXJuIGdldExpc3RCeTxJbWFnZVR5cGU+KGNvbnRleHQsICdpbWFnZXMnLCB7dXNlcklkOiBmb3JtYXRVc2VySWR9LCB7XG4gICAgc29ydDogW3tmaWVsZDogJ2FkZGVkJywgZGlyZWN0aW9uOiAnREVTQyd9XSxcbiAgICBsaW1pdDoge2Zyb20sIHRvfSxcbiAgICBjdXN0b21RdWVyaWVzOiBbXG4gICAgICBgTEVUIHVzZXIgPSBGSVJTVChGT1IgdSBJTiB1c2VycyBGSUxURVIgdS5fa2V5ID09IGRvYy51c2VySWQgTElNSVQgMSBSRVRVUk4gdSlgXG4gICAgXSxcbiAgICBjdXN0b21PYmplY3RzOiBbJ3VzZXI6dXNlciddXG4gIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgcGFyYW1zOiB7ZnJvbSwgdG8sIHVzZXJJZH0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZUNvdW50QnlJdGVtID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEltYWdlQ291bnRCeUl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGl0ZW1Eb2NJZHMgPSBnZXRNZWRpYUl0ZW1Eb2NJZHMoaXRlbUlkKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBMRVQgbWVkaWEgPSAoXG4gICAgICBGT1IgaSBJTiAke2hhc01lZGlhQ29sbGVjdGlvbn1cbiAgICAgICAgRklMVEVSIGkuX2Zyb20gSU4gJHtpdGVtRG9jSWRzfVxuICAgICAgICBGSUxURVIgaS50eXBlID09IFwiaW1hZ2VcIlxuICAgICAgICBSRVRVUk4gMVxuICAgIClcbiAgICBSRVRVUk4ge2NvdW50OiBMRU5HVEgobWVkaWEpfVxuICBgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh7Y291bnR9KSA9PiBjb3VudClcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtpdGVtSWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlTGlzdEJ5SXRlbSA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaXRlbUlkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IEltYWdlT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRJbWFnZXNCeUl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMgPSBbXSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvblVzZXJJZCA9ICcnfSA9IHt9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdEl0ZW1UeXBlID0gb3B0aW9ucz8uaXRlbVR5cGUgPyBwYXJzZUNoYXIoU3RyaW5nKG9wdGlvbnMuaXRlbVR5cGUgfHwgJycpLCAzMikudG9Mb3dlckNhc2UoKSBhcyBBcmFuZ29EYkNvbGxlY3Rpb24gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGl0ZW1Eb2NJZHMgPSBnZXRNZWRpYUl0ZW1Eb2NJZHMoaXRlbUlkLCBmb3JtYXRJdGVtVHlwZSk7XG4gIGNvbnN0IHtsaW1pdH0gPSBwYXJzZUltYWdlT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0SW1hZ2VPcHRpb25hbEZpZWxkcyhmaWVsZHMpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBsIElOICR7aGFzTWVkaWFDb2xsZWN0aW9ufVxuICAgICAgRklMVEVSIGwuX2Zyb20gSU4gJHtpdGVtRG9jSWRzfVxuICAgICAgRklMVEVSIGwudHlwZSA9PSBcImltYWdlXCJcbiAgICAgIExFVCBpID0gRE9DVU1FTlQobC5fdG8pXG4gICAgICBGSUxURVIgTk9UIElTX05VTEwoaSlcbiAgICAgIExFVCBvd25lclBlcnNvbmEgPSBsLml0ZW1UeXBlID09IFwicGVyc29uYXNcIiA/IERPQ1VNRU5UKCR7bGl0ZXJhbChDT0xMRUNUSU9OUy5QRVJTT05BUyl9LCBQQVJTRV9JREVOVElGSUVSKGwuX2Zyb20pLmtleSkgOiBudWxsXG4gICAgICAke2xpdGVyYWwoc2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKSl9XG4gICAgICBTT1JUIGkuYWRkZWQgREVTQ1xuICAgICAgJHtsaXRlcmFsKGxpbWl0LmFxbCl9XG4gICAgICBSRVRVUk4gTUVSR0UoXG4gICAgICAgICR7c2VsZWN0T2JqZWN0cy5sZW5ndGggPiAwID8gbGl0ZXJhbChgTUVSR0UoaSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYCkgOiBsaXRlcmFsKCdpJyl9LFxuICAgICAgICB7XG4gICAgICAgICAgX21lZGlhSXRlbUtleTogUEFSU0VfSURFTlRJRklFUihsLl9mcm9tKS5rZXksXG4gICAgICAgICAgX21lZGlhSXRlbVR5cGU6IGwuaXRlbVR5cGUgfHwgUEFSU0VfSURFTlRJRklFUihsLl9mcm9tKS5jb2xsZWN0aW9uLFxuICAgICAgICAgIG93bmVyUGVyc29uYUlkOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEuX2tleSA6IG51bGwsXG4gICAgICAgICAgb3duZXJQZXJzb25hSW1hZ2VJZDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLmltYWdlSWQgOiBudWxsLFxuICAgICAgICAgIG93bmVyUGVyc29uYUltYWdlVXJsOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEuaW1hZ2VVcmwgOiBudWxsLFxuICAgICAgICAgIG93bmVyUGVyc29uYU5hbWU6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5uYW1lIDogbnVsbCxcbiAgICAgICAgICBvd25lclBlcnNvbmFUaHVtYlVybDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLnRodW1iVXJsIDogbnVsbCxcbiAgICAgICAgICBvd25lclBlcnNvbmFVc2VySWQ6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS51c2VySWQgOiBudWxsXG4gICAgICAgIH1cbiAgICAgIClcbiAgYDtcblxuICB0cnkge1xuICAgIGNvbnN0IGxpc3QgPSBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIEltYWdlVHlwZVtdKTtcblxuICAgIGNvbnN0IG93bmVyVXNlcklkID0gU3RyaW5nKGxpc3RbMF0/LnVzZXJJZCB8fCAnJyk7XG4gICAgY29uc3QgaXNPd25lciA9ICEhc2Vzc2lvblVzZXJJZCAmJiAhIW93bmVyVXNlcklkICYmIHNlc3Npb25Vc2VySWQgPT09IG93bmVyVXNlcklkO1xuXG4gICAgaWYoaXNPd25lcikge1xuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgaWYoIXNlc3Npb25Vc2VySWQpIHtcbiAgICAgIHJldHVybiBsaXN0LmZpbHRlcigoaW1hZ2UpID0+IG5vcm1hbGl6ZUltYWdlUHJpdmFjeShpbWFnZT8ucHJpdmFjeSkgPT09ICdwdWJsaWMnKTtcbiAgICB9XG5cbiAgICBsZXQgY2FuVmlld0ZyaWVuZHMgPSBmYWxzZTtcbiAgICBsZXQgY2FuVmlld1ZpcCA9IGZhbHNlO1xuXG4gICAgY29uc3QgbWVkaWFJdGVtS2V5ID0gU3RyaW5nKChsaXN0WzBdIGFzIEltYWdlVHlwZSAmIHtfbWVkaWFJdGVtS2V5Pzogc3RyaW5nfSk/Ll9tZWRpYUl0ZW1LZXkgfHwgJycpO1xuICAgIGNvbnN0IG1lZGlhSXRlbVR5cGUgPSBTdHJpbmcoKGxpc3RbMF0gYXMgSW1hZ2VUeXBlICYge19tZWRpYUl0ZW1UeXBlPzogc3RyaW5nfSk/Ll9tZWRpYUl0ZW1UeXBlIHx8ICcnKTtcblxuICAgIGlmKG1lZGlhSXRlbVR5cGUgPT09IENPTExFQ1RJT05TLlBFUlNPTkFTICYmIG1lZGlhSXRlbUtleSkge1xuICAgICAgY29uc3QgcmVsYXRpb25zaGlwID0gYXdhaXQgZ2V0UGVyc29uYVJlbGF0aW9uc2hpcFN0YXRlKGNvbnRleHQsIG1lZGlhSXRlbUtleSk7XG4gICAgICBjYW5WaWV3RnJpZW5kcyA9ICEhcmVsYXRpb25zaGlwPy5pc0ZyaWVuZDtcbiAgICAgIGNhblZpZXdWaXAgPSBhd2FpdCBoYXNTdWJzY3JpcHRpb25Ub0l0ZW0oY29udGV4dCwgbWVkaWFJdGVtS2V5LCBDT0xMRUNUSU9OUy5QRVJTT05BUyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpc3QuZmlsdGVyKChpbWFnZSkgPT4gY2FuVmlld0ltYWdlKGltYWdlLCBzZXNzaW9uVXNlcklkLCB7Y2FuVmlld0ZyaWVuZHMsIGNhblZpZXdWaXAsIGlzT3duZXJ9KSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgcGFyYW1zOiB7aXRlbUlkLCBvcHRpb25zOiB7Li4ub3B0aW9ucywgaXRlbVR5cGU6IGZvcm1hdEl0ZW1UeXBlfX0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgICByZXR1cm4gW107XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZUxpc3RCeUdyb3VwID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBwYXJhbXM6IHtmaWx0ZXJzOiBRdWVyeUZpbHRlcltdLCBncm91cElkOiBzdHJpbmcsIGZyb206IG51bWJlciwgdG86IG51bWJlcn1cbik6IFByb21pc2U8SW1hZ2VUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEltYWdlc0J5R3JvdXAnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtmaWx0ZXJzLCBncm91cElkLCBmcm9tLCB0b30gPSBwYXJhbXM7XG4gIGNvbnN0IGZvcm1hdEdyb3VwSWQgPSBwYXJzZUlkKGdyb3VwSWQpO1xuICBjb25zdCBsaW1pdDogQXJhbmdvRGJMaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcblxuICBmaWx0ZXJzXG4gICAgLm1hcCgoZmlsdGVyOiBRdWVyeUZpbHRlcikgPT4ge1xuICAgICAgY29uc3Qge2NvbmRpdGlvbmFsLCBuYW1lLCB2YWx1ZX0gPSBmaWx0ZXI7XG4gICAgICBsZXQgZm9ybWF0Q29uZCA9IGNvbmRpdGlvbmFsO1xuXG4gICAgICBpZihjb25kaXRpb25hbCAhPT0gJz49JyAmJiBjb25kaXRpb25hbCAhPT0gJzw9JyAmJiBjb25kaXRpb25hbCAhPT0gJz4nICYmIGNvbmRpdGlvbmFsICE9PSAnPCcpIHtcbiAgICAgICAgZm9ybWF0Q29uZCA9ICc9PSc7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaChuYW1lKSB7XG4gICAgICAgIGNhc2UgJ2FkZGVkJzpcbiAgICAgICAgICByZXR1cm4gYHAuYWRkZWQgJHtmb3JtYXRDb25kfSAke3BhcnNlTnVtKHZhbHVlKX1gO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICB9KTtcblxuICByZXR1cm4gZ2V0R3JvdXBEZXRhaWxzKGNvbnRleHQsIGZvcm1hdEdyb3VwSWQpXG4gICAgLnRoZW4oKGdyb3VwOiBHcm91cFR5cGUpID0+IHtcbiAgICAgIGlmKGdyb3VwLnByaXZhY3kgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIGZpbHRlcnMucHVzaCh7Y29uZGl0aW9uYWw6ICc9PScsIG5hbWU6ICdncm91cElkJywgdmFsdWU6IGZvcm1hdEdyb3VwSWR9KTtcbiAgICAgICAgY29uc3QgZmlsdGVyU3RyID0gZmlsdGVycy5qb2luKCcgJiYgJyk7XG4gICAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgICAgICAgRk9SIGkgSU4gRkxBVFRFTihcbiAgICAgICAgICAgIEZPUiBwIElOIHBvc3RzXG4gICAgICAgICAgICAgIEZJTFRFUiAke2xpdGVyYWwoZmlsdGVyU3RyKX1cbiAgICAgICAgICAgICAgTEVUIGltYWdlcyA9IChcbiAgICAgICAgICAgICAgICBGT1IgaSwgZSBJTiBPVVRCT1VORCBwLl9pZCAke2hhc01lZGlhQ29sbGVjdGlvbn1cbiAgICAgICAgICAgICAgICAgIEZJTFRFUiBlLnR5cGUgPT0gXCJpbWFnZVwiXG4gICAgICAgICAgICAgICAgICBSRVRVUk4gaVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIFNPUlQgcC5hZGRlZCBERVNDXG4gICAgICAgICAgICAgIFJFVFVSTiBpbWFnZXNcbiAgICAgICAgICApXG4gICAgICAgICAgICBTT1JUIGkuYWRkZWQgREVTQ1xuICAgICAgICAgICAgJHtsaXRlcmFsKGxpbWl0LmFxbCl9XG4gICAgICAgICAgICBSRVRVUk4gaVxuICAgICAgICBgO1xuXG4gICAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBJbWFnZVR5cGVbXSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgICBwYXJhbXM6IHtmaWx0ZXJzLCBmcm9tLCBncm91cElkLCB0b30sXG4gICAgICAgICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNHcm91cGVkKGNvbnRleHQsIHNlc3Npb25JZCwgZ3JvdXBJZClcbiAgICAgICAgLnRoZW4oKGdyb3VwZWQ6IEdyb3VwVXNlcikgPT4ge1xuICAgICAgICAgIGlmKGdyb3VwZWQuaXNWYWxpZCkge1xuICAgICAgICAgICAgZmlsdGVycy5wdXNoKHtjb25kaXRpb25hbDogJz09JywgbmFtZTogJ2dyb3VwSWQnLCB2YWx1ZTogZ3JvdXBlZC5ncm91cElkfSk7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gZmlsdGVycy5qb2luKCcgJiYgJyk7XG4gICAgICAgICAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgICAgICAgICAgICBGT1IgcCBJTiBwb3N0XG4gICAgICAgICAgICAgICAgRklMVEVSICR7bGl0ZXJhbChmaWx0ZXJMaXN0KX1cbiAgICAgICAgICAgICAgICBGT1IgZiBJTiBwLmZpbGVzXG4gICAgICAgICAgICAgICAgICBGSUxURVIgZi50eXBlID09IFwiaW1hZ2UvanBlZ1wiIHx8IGYudHlwZSA9PSBcImltYWdlL3BuZ1wiXG4gICAgICAgICAgICAgICAgICAke2xpdGVyYWwobGltaXQuYXFsKX1cbiAgICAgICAgICAgICAgICAgIFNPUlQgcC5hZGRlZCBERVNDXG4gICAgICAgICAgICAgICAgICBSRVRVUk4gZlxuICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBJbWFnZVR5cGVbXSlcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBsb2dFcnJvcih7XG4gICAgICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgICAgIHBhcmFtczoge2ZpbHRlcnMsIGZyb20sIGdyb3VwSWQsIHRvfSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICAgICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VMaXN0QnlSZWFjdGlvbnMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHJlYWN0aW9uczogc3RyaW5nW10gPSBbXSxcbiAgb3B0aW9ucz86IEltYWdlT3B0aW9uc1xuKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0SW1hZ2VMaXN0QnlSZWFjdGlvbnMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMgPSBbXSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VJbWFnZU9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldEltYWdlT3B0aW9uYWxGaWVsZHMoZmllbGRzKTtcbiAgY29uc3QgZm9ybWF0U2Vzc2lvbklkID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGZvcm1hdFJlYWN0aW9uczogc3RyaW5nW10gPSByZWFjdGlvbnMubWFwKChyZWFjdGlvbk5hbWUpID0+IHBhcnNlQ2hhcihyZWFjdGlvbk5hbWUsIDMyKSk7XG4gIGNvbnN0IGZpbHRlckJ5OiBzdHJpbmdbXSA9IFtcbiAgICAnci50eXBlID09IFwiaW1hZ2VzXCInLFxuICAgIGBQT1NJVElPTigke0pTT04uc3RyaW5naWZ5KGZvcm1hdFJlYWN0aW9ucyl9LCBMT1dFUihyLm5hbWUpKWBdO1xuXG4gIC8vIEdldCBkYXRhIGZyb20gZGF0YWJhc2VcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBGT1IgaSwgciBJTiBPVVRCT1VORCAke2Zvcm1hdFNlc3Npb25JZH0gaGFzUmVhY3Rpb25cbiAgICAgIE9QVElPTlMge3ZlcnRleENvbGxlY3Rpb25zOiBcImltYWdlc1wifVxuICAgICAgTEVUIG1lZGlhID0gRklSU1QoXG4gICAgICAgIEZPUiBvd25lciwgbCBJTiBJTkJPVU5EIGkuX2lkICR7aGFzTWVkaWFDb2xsZWN0aW9ufVxuICAgICAgICAgIEZJTFRFUiBsLnR5cGUgPT0gXCJpbWFnZVwiXG4gICAgICAgICAgTElNSVQgMVxuICAgICAgICAgIFJFVFVSTiB7XG4gICAgICAgICAgICBpdGVtS2V5OiBQQVJTRV9JREVOVElGSUVSKGwuX2Zyb20pLmtleSxcbiAgICAgICAgICAgIGl0ZW1UeXBlOiBsLml0ZW1UeXBlIHx8IFBBUlNFX0lERU5USUZJRVIobC5fZnJvbSkuY29sbGVjdGlvblxuICAgICAgICAgIH1cbiAgICAgIClcbiAgICAgIExFVCBvd25lclBlcnNvbmEgPSBtZWRpYSAmJiBtZWRpYS5pdGVtVHlwZSA9PSBcInBlcnNvbmFzXCIgPyBET0NVTUVOVCgke2xpdGVyYWwoQ09MTEVDVElPTlMuUEVSU09OQVMpfSwgbWVkaWEuaXRlbUtleSkgOiBudWxsXG4gICAgICAke2xpdGVyYWwoc2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKSl9XG4gICAgICBGSUxURVIgJHtsaXRlcmFsKGZpbHRlckJ5LmpvaW4oJyAmJiAnKSl9XG4gICAgICAke2xpdGVyYWwobGltaXQuYXFsKX1cbiAgICAgIFJFVFVSTiBNRVJHRShcbiAgICAgICAgJHtzZWxlY3RPYmplY3RzLmxlbmd0aCA+IDAgPyBsaXRlcmFsKGBNRVJHRShpLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgKSA6IGxpdGVyYWwoJ2knKX0sXG4gICAgICAgIHtcbiAgICAgICAgICBvd25lclBlcnNvbmFJZDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLl9rZXkgOiBudWxsLFxuICAgICAgICAgIG93bmVyUGVyc29uYUltYWdlSWQ6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5pbWFnZUlkIDogbnVsbCxcbiAgICAgICAgICBvd25lclBlcnNvbmFJbWFnZVVybDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLmltYWdlVXJsIDogbnVsbCxcbiAgICAgICAgICBvd25lclBlcnNvbmFOYW1lOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEubmFtZSA6IG51bGwsXG4gICAgICAgICAgb3duZXJQZXJzb25hVGh1bWJVcmw6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS50aHVtYlVybCA6IG51bGwsXG4gICAgICAgICAgb3duZXJQZXJzb25hVXNlcklkOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEudXNlcklkIDogbnVsbFxuICAgICAgICB9XG4gICAgICApXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIEltYWdlVHlwZVtdKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge29wdGlvbnMsIHJlYWN0aW9uc30sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfSk7XG59O1xuXG5jb25zdCBnZXRQZXJzb25hRG9jSWQgPSAocGVyc29uYUlkOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBwZXJzb25hRG9jSWQgPSBwYXJzZUFyYW5nb0lkKHBlcnNvbmFJZCk7XG5cbiAgaWYocGVyc29uYURvY0lkKSB7XG4gICAgcmV0dXJuIHBlcnNvbmFEb2NJZDtcbiAgfVxuXG4gIGNvbnN0IHBlcnNvbmFLZXkgPSBwYXJzZUlkKHBlcnNvbmFJZCk7XG4gIHJldHVybiBwZXJzb25hS2V5ID8gYCR7Q09MTEVDVElPTlMuUEVSU09OQVN9LyR7cGVyc29uYUtleX1gIDogJyc7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VMaXN0QnlQZXJzb25hUmVhY3Rpb25zID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBwZXJzb25hSWQ6IHN0cmluZyA9ICcnLFxuICByZWFjdGlvbnM6IHN0cmluZ1tdID0gW10sXG4gIG9wdGlvbnM/OiBJbWFnZU9wdGlvbnNcbik6IFByb21pc2U8SW1hZ2VUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEltYWdlTGlzdEJ5UGVyc29uYVJlYWN0aW9ucyc7XG4gIGNvbnN0IHNlc3Npb25QZXJzb25hSWQgPSBTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8ucGVyc29uYUlkIHx8ICcnKTtcbiAgY29uc3QgcGVyc29uYURvY0lkID0gZ2V0UGVyc29uYURvY0lkKHBlcnNvbmFJZCB8fCBzZXNzaW9uUGVyc29uYUlkKTtcbiAgY29uc3QgcmVhY3Rpb25OYW1lcyA9IEFycmF5LmlzQXJyYXkocmVhY3Rpb25zKVxuICAgID8gcmVhY3Rpb25zLm1hcCgocmVhY3Rpb25OYW1lKSA9PiBwYXJzZUNoYXIocmVhY3Rpb25OYW1lLCAzMikudG9Mb3dlckNhc2UoKSkuZmlsdGVyKEJvb2xlYW4pXG4gICAgOiBbXTtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlSW1hZ2VPcHRpb25zKG9wdGlvbnMpO1xuXG4gIGlmKCFwZXJzb25hRG9jSWQgfHwgIXJlYWN0aW9uTmFtZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBGT1IgaW1hZ2UsIHJlYWN0aW9uIElOIE9VVEJPVU5EICR7cGVyc29uYURvY0lkfSAke2hhc1JlYWN0aW9uQ29sbGVjdGlvbn1cbiAgICAgIE9QVElPTlMge3ZlcnRleENvbGxlY3Rpb25zOiBcImltYWdlc1wifVxuICAgICAgTEVUIG1lZGlhID0gRklSU1QoXG4gICAgICAgIEZPUiBvd25lciwgbGluayBJTiBJTkJPVU5EIGltYWdlLl9pZCAke2hhc01lZGlhQ29sbGVjdGlvbn1cbiAgICAgICAgICBGSUxURVIgbGluay50eXBlID09IFwiaW1hZ2VcIlxuICAgICAgICAgIExJTUlUIDFcbiAgICAgICAgICBSRVRVUk4ge1xuICAgICAgICAgICAgaXRlbUtleTogUEFSU0VfSURFTlRJRklFUihsaW5rLl9mcm9tKS5rZXksXG4gICAgICAgICAgICBpdGVtVHlwZTogbGluay5pdGVtVHlwZSB8fCBQQVJTRV9JREVOVElGSUVSKGxpbmsuX2Zyb20pLmNvbGxlY3Rpb25cbiAgICAgICAgICB9XG4gICAgICApXG4gICAgICBMRVQgb3duZXJQZXJzb25hID0gbWVkaWEgJiYgbWVkaWEuaXRlbVR5cGUgPT0gXCJwZXJzb25hc1wiID8gRE9DVU1FTlQoJHtwZXJzb25hc0NvbGxlY3Rpb259LCBtZWRpYS5pdGVtS2V5KSA6IG51bGxcbiAgICAgIEZJTFRFUiBMT1dFUihyZWFjdGlvbi50eXBlIHx8IFwiXCIpIElOIFtcImltYWdlXCIsIFwiaW1hZ2VzXCJdXG4gICAgICBGSUxURVIgUE9TSVRJT04oJHtyZWFjdGlvbk5hbWVzfSwgTE9XRVIocmVhY3Rpb24ubmFtZSB8fCByZWFjdGlvbi52YWx1ZSB8fCBcIlwiKSlcbiAgICAgIFNPUlQgcmVhY3Rpb24uYWRkZWQgREVTQ1xuICAgICAgJHtsaXRlcmFsKGxpbWl0LmFxbCl9XG4gICAgICBSRVRVUk4gTUVSR0UoaW1hZ2UsIHtcbiAgICAgICAgb3duZXJQZXJzb25hSWQ6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5fa2V5IDogbnVsbCxcbiAgICAgICAgb3duZXJQZXJzb25hSW1hZ2VJZDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLmltYWdlSWQgOiBudWxsLFxuICAgICAgICBvd25lclBlcnNvbmFJbWFnZVVybDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLmltYWdlVXJsIDogbnVsbCxcbiAgICAgICAgb3duZXJQZXJzb25hTmFtZTogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLm5hbWUgOiBudWxsLFxuICAgICAgICBvd25lclBlcnNvbmFUaHVtYlVybDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLnRodW1iVXJsIDogbnVsbCxcbiAgICAgICAgb3duZXJQZXJzb25hVXNlcklkOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEudXNlcklkIDogbnVsbFxuICAgICAgfSlcbiAgYDtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgSW1hZ2VUeXBlW10pO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtvcHRpb25zLCBwZXJzb25hSWQsIHJlYWN0aW9uc30sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yIGFzIEVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBbXTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlQnlJZCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpbWFnZUlkOiBzdHJpbmcpOiBQcm9taXNlPEltYWdlVHlwZT4gPT4ge1xuICBjb25zdCBmb3JtYXRJbWFnZUlkID0gcGFyc2VJZChpbWFnZUlkKTtcbiAgY29uc3QgZmlsdGVyczogRmlsdGVyR3JvdXAgPSB7XG4gICAgb3BlcmF0b3I6ICdBTkQnLFxuICAgIGZpbHRlcnM6IFt7ZmllbGQ6ICdfa2V5Jywgb3BlcmF0b3I6ICc9PScsIHZhbHVlOiBmb3JtYXRJbWFnZUlkfV1cbiAgfSBhcyBhbnk7XG5cbiAgcmV0dXJuIGdldEl0ZW1CeTxJbWFnZVR5cGU+KGNvbnRleHQsICdpbWFnZXMnLCBmaWx0ZXJzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VySW1hZ2VQYXRoID0gKHVzZXJJZDogc3RyaW5nLCBpbWFnZUlkOiBzdHJpbmcsIGltYWdlVHlwZTogc3RyaW5nLCBkaXI6IHN0cmluZyA9ICdpbWFnZXMnKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZmlsZW5hbWUgPSBgJHtpbWFnZUlkfS4ke2dldEltYWdlRXh0ZW5zaW9uKGltYWdlVHlwZSl9YDtcblxuICByZXR1cm4gYHVzZXJzLyR7dXNlcklkfS8ke2Rpcn0vJHtmaWxlbmFtZX1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcEltYWdlVXJsID0gKHtcbiAgYnVja2V0LFxuICBkaXJlY3RvcnkgPSAnaW1hZ2VzJyxcbiAgaW1hZ2VJZCxcbiAgaW1hZ2VUeXBlID0gJ2pwZycsXG4gIGlzVGh1bWIgPSBmYWxzZSxcbiAgdHlwZSxcbiAgdHlwZUlkXG59OiBJbWFnZVVybERhdGEpOiBzdHJpbmcgPT4ge1xuICBpZighdHlwZSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmKCFpbWFnZUlkKSB7XG4gICAgaWYoaW1hZ2VUeXBlID09PSAncGVyc29uYScpIHtcbiAgICAgIHJldHVybiBgJHtDb25maWcuZ2V0KCdpbWFnZS5kZWZhdWx0VXJsJyl9L3VzZXJzX2JrLmpwZ2A7XG4gICAgfVxuICAgIHJldHVybiBgJHtDb25maWcuZ2V0KCdpbWFnZS5kZWZhdWx0VXJsJyl9L3VzZXJzX3doLmpwZ2A7XG4gIH1cblxuICBjb25zdCBidWNrZXROYW1lID0gYnVja2V0IHx8IENvbmZpZy5nZXQoJ2ltYWdlLmJ1Y2tldCcpIHx8ICdkZXYucmVha3Rvci5pbyc7XG4gIGNvbnN0IGltYWdlTmFtZSA9IGlzVGh1bWIgPyBgJHtpbWFnZUlkfS10aC4ke2ltYWdlVHlwZX1gIDogYCR7aW1hZ2VJZH0uJHtpbWFnZVR5cGUgPT09ICdwZXJzb25hJyB8fCBpbWFnZVR5cGUgPT09ICdvdGhlcicgPyAnanBnJyA6IGltYWdlVHlwZX1gO1xuICBjb25zdCBpbWFnZVVybCA9IENvbmZpZy5nZXQoJ2ltYWdlLnVybCcpIHx8IGBodHRwczovL3MzLmFtYXpvbmF3cy5jb20vJHtidWNrZXROYW1lfWA7XG5cbiAgaWYodHlwZSA9PT0gJ2FwcHMnKSB7XG4gICAgcmV0dXJuIGAke2ltYWdlVXJsfS8ke3R5cGV9LyR7ZGlyZWN0b3J5fS8ke2ltYWdlTmFtZX1gO1xuICB9XG5cbiAgcmV0dXJuIGAke2ltYWdlVXJsfS8ke3R5cGV9LyR7dHlwZUlkfS8ke2RpcmVjdG9yeX0vJHtpbWFnZU5hbWV9YDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZVVybCA9IGFzeW5jICh7XG4gIGJ1Y2tldCxcbiAgaW1hZ2VEaXIgPSAnaW1hZ2VzJyxcbiAgaW1hZ2VJZCxcbiAgaW1hZ2VUeXBlID0gJ2pwZycsXG4gIGlzVGh1bWIgPSBmYWxzZSxcbiAgdHlwZSxcbiAgdHlwZUlkLFxuICB1cmxUeXBlID0gJ3B1YmxpYydcbn06IEltYWdlVXJsRGF0YSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGlmKCFpbWFnZUlkKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgYnVja2V0TmFtZSA9IGJ1Y2tldCB8fCBDb25maWcuZ2V0KCdpbWFnZS5idWNrZXQnKSB8fCAnZGV2LnJlYWt0b3IuaW8nO1xuICBjb25zdCBjb25maWd1cmVkSW1hZ2VVcmwgPSBTdHJpbmcoQ29uZmlnLmdldCgnaW1hZ2UudXJsJykgfHwgJycpO1xuICBjb25zdCBjb25maWd1cmVkQXBwVXJsID0gU3RyaW5nKENvbmZpZy5nZXQoJ2FwcC51cmwnKSB8fCAnJyk7XG4gIGNvbnN0IHB1YmxpY0Jhc2VVcmwgPSBjb25maWd1cmVkQXBwVXJsXG4gICAgPyBgaHR0cHM6Ly9ib3guJHtjb25maWd1cmVkQXBwVXJsfWBcbiAgICA6IChjb25maWd1cmVkSW1hZ2VVcmwgfHwgYGh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS8ke2J1Y2tldE5hbWV9YCk7XG4gIGNvbnN0IGRldkJhc2VVcmwgPSBjb25maWd1cmVkQXBwVXJsXG4gICAgPyBgaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2Rldi4ke2NvbmZpZ3VyZWRBcHBVcmx9YFxuICAgIDogKGNvbmZpZ3VyZWRJbWFnZVVybCB8fCBgaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tLyR7YnVja2V0TmFtZX1gKTtcblxuICAvLyBBbHdheXMgdXNlIHNpZ25lZCBVUkxzIGZvciB0aHVtYm5haWxzXG4gIGlmKGlzVGh1bWIpIHtcbiAgICB1cmxUeXBlID0gJ3NpZ25lZCc7XG4gIH1cblxuICBjb25zdCB0aHVtYlN1ZmZpeCA9IGlzVGh1bWIgPyAnLXRoJyA6ICcnO1xuICBjb25zdCBpbWFnZUtleSA9IGAke3R5cGV9LyR7dHlwZUlkfS8ke2ltYWdlRGlyfS8ke2ltYWdlSWR9JHt0aHVtYlN1ZmZpeH0uJHtpbWFnZVR5cGV9YDtcblxuICBzd2l0Y2godXJsVHlwZSkge1xuICAgIGNhc2UgJ3NpZ25lZCc6IHtcbiAgICAgIHJldHVybiBhd2FpdCBzM0dldFNpZ25lZFVybCh7QnVja2V0OiBidWNrZXROYW1lLCBFeHBpcmVzOiA2MCAqIDYwLCBLZXk6IGltYWdlS2V5fSk7XG4gICAgfVxuICAgIGNhc2UgJ3B1YmxpYyc6IHtcbiAgICAgIHJldHVybiBgJHtwdWJsaWNCYXNlVXJsfS8ke2ltYWdlS2V5fWA7XG4gICAgfVxuICAgIGNhc2UgJ2Rldic6IHtcbiAgICAgIHJldHVybiBgJHtkZXZCYXNlVXJsfS8ke2ltYWdlS2V5fWA7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCByZXNpemVBbmRTYXZlSW1hZ2UgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGltYWdlSWQ6IHN0cmluZyxcbiAgYnVmZmVyOiBCdWZmZXIsXG4gIGZpbGVUeXBlOiBzdHJpbmcgPSAnaW1hZ2UvanBlZycsIHMzT3B0aW9ucz86IFB1dE9iamVjdENvbW1hbmRJbnB1dFxuKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3Jlc2l6ZVNhdmVJbWFnZSc7XG4gIGNvbnN0IHtzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGltZ1cgPSBDb25maWcuZ2V0KCdpbWFnZS5pbWdTaXplJyk7XG4gIGNvbnN0IGltZ1EgPSBDb25maWcuZ2V0KCdpbWFnZS5pbWdRdWFsaXR5Jyk7XG4gIGNvbnN0IGZvcm1hdCA9IChmaWxlVHlwZS5zcGxpdCgnLycpKVsxXSB8fCAnanBlZyc7XG4gIGNvbnN0IHNoYXJwRm9ybWF0ID0gbm9ybWFsaXplSW1hZ2VGb3JtYXQoZm9ybWF0KTtcbiAgbGV0IGltYWdlT3B0aW1pemVkQnVmZmVyOiBCdWZmZXIgPSBidWZmZXI7XG4gIGxldCB0aHVtYk9wdGltaXplZEJ1ZmZlcjogQnVmZmVyID0gYnVmZmVyO1xuICBsZXQgaW1hZ2VJZGVudGl0eTogSW1hZ2VUeXBlID0ge1xuICAgIGZpbGVTaXplOiBidWZmZXIubGVuZ3RoLFxuICAgIGZpbGVUeXBlOiBmb3JtYXQsXG4gICAgaW1hZ2VJZFxuICB9O1xuXG4gIHRyeSB7XG4gICAgaW1hZ2VPcHRpbWl6ZWRCdWZmZXIgPSBhd2FpdCBzaGFycChidWZmZXIpXG4gICAgICAucm90YXRlKClcbiAgICAgIC5yZXNpemUoe1xuICAgICAgICBmaXQ6ICdpbnNpZGUnLFxuICAgICAgICBoZWlnaHQ6IGltZ1csXG4gICAgICAgIHdpZHRoOiBpbWdXLFxuICAgICAgICB3aXRob3V0RW5sYXJnZW1lbnQ6IHRydWVcbiAgICAgIH0pXG4gICAgICAudG9Gb3JtYXQoc2hhcnBGb3JtYXQsIHtxdWFsaXR5OiBpbWdRfSlcbiAgICAgIC50b0J1ZmZlcigpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZmlsZVR5cGUsIGltYWdlSWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU1BR0VfU0FWRVxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgaW1hZ2VPYmo6IFB1dE9iamVjdENvbW1hbmRJbnB1dCA9IHtcbiAgICAgIEJvZHk6IGltYWdlT3B0aW1pemVkQnVmZmVyLFxuICAgICAgQnVja2V0OiBudWxsLFxuICAgICAgQ29udGVudFR5cGU6IGZpbGVUeXBlLFxuICAgICAgLi4uKHMzT3B0aW9ucyB8fCB7fSksXG4gICAgICBLZXk6IGdldFVzZXJJbWFnZVBhdGgoc2Vzc2lvbklkLCBpbWFnZUlkLCBmaWxlVHlwZSwgJ2ltYWdlcycpXG4gICAgfTtcbiAgICBhd2FpdCBzM1B1dChpbWFnZU9iaik7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICByZXR1cm4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtmaWxlVHlwZSwgaW1hZ2VJZH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTUFHRV9TQVZFXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBbaW1hZ2VNZXRhZGF0YSwgaW1hZ2VTdGF0cywgc291cmNlTWV0YWRhdGFdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgc2hhcnAoaW1hZ2VPcHRpbWl6ZWRCdWZmZXIpLm1ldGFkYXRhKCksXG4gICAgICBzaGFycChpbWFnZU9wdGltaXplZEJ1ZmZlcikuc3RhdHMoKSxcbiAgICAgIHNoYXJwKGJ1ZmZlcikubWV0YWRhdGEoKVxuICAgIF0pO1xuICAgIGNvbnN0IHtiLCBnLCByfSA9IGltYWdlU3RhdHMuZG9taW5hbnQ7XG4gICAgY29uc3QgY29sb3IgPSBbciwgZywgYl0ubWFwKCh2YWx1ZSkgPT4gdmFsdWUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpO1xuICAgIGNvbnN0IGV4aWZNZXRhZGF0YSA9IGltYWdlRXhpZk1ldGFkYXRhKHNvdXJjZU1ldGFkYXRhLmV4aWYpO1xuXG4gICAgaW1hZ2VJZGVudGl0eSA9IHtcbiAgICAgIGNvbG9yLFxuICAgICAgZmlsZVNpemU6IGltYWdlT3B0aW1pemVkQnVmZmVyLmxlbmd0aCxcbiAgICAgIGZpbGVUeXBlOiBmb3JtYXQsXG4gICAgICBoZWlnaHQ6IGltYWdlTWV0YWRhdGEuaGVpZ2h0IHx8IDAsXG4gICAgICBpbWFnZUlkLFxuICAgICAgLi4uZXhpZk1ldGFkYXRhLFxuICAgICAgb3JpZW50YXRpb246IGltYWdlTWV0YWRhdGEub3JpZW50YXRpb24gPyBTdHJpbmcoaW1hZ2VNZXRhZGF0YS5vcmllbnRhdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICBxdWFsaXR5OiBpbWdRLFxuICAgICAgcmVzb2x1dGlvbjogaW1hZ2VNZXRhZGF0YS5kZW5zaXR5ID8gYCR7aW1hZ2VNZXRhZGF0YS5kZW5zaXR5fSBwcGlgIDogdW5kZWZpbmVkLFxuICAgICAgd2lkdGg6IGltYWdlTWV0YWRhdGEud2lkdGggfHwgMFxuICAgIH07XG5cbiAgICBjb25zdCB0aG1XID0gQ29uZmlnLmdldCgnaW1hZ2UudGhtU2l6ZScpO1xuICAgIGNvbnN0IHRobVEgPSBDb25maWcuZ2V0KCdpbWFnZS50aG1RdWFsaXR5Jyk7XG4gICAgdGh1bWJPcHRpbWl6ZWRCdWZmZXIgPSBhd2FpdCBzaGFycChpbWFnZU9wdGltaXplZEJ1ZmZlcilcbiAgICAgIC5yZXNpemUoe1xuICAgICAgICBmaXQ6ICdjb3ZlcicsXG4gICAgICAgIGhlaWdodDogdGhtVyxcbiAgICAgICAgcG9zaXRpb246ICdjZW50cmUnLFxuICAgICAgICB3aWR0aDogdGhtV1xuICAgICAgfSlcbiAgICAgIC50b0Zvcm1hdChzaGFycEZvcm1hdCwge3F1YWxpdHk6IHRobVF9KVxuICAgICAgLnRvQnVmZmVyKCk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICByZXR1cm4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtmaWxlVHlwZSwgaW1hZ2VJZH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTUFHRV9TQVZFXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB0aHVtYk9iajogUHV0T2JqZWN0Q29tbWFuZElucHV0ID0ge1xuICAgICAgQm9keTogdGh1bWJPcHRpbWl6ZWRCdWZmZXIsXG4gICAgICBCdWNrZXQ6IG51bGwsXG4gICAgICBDb250ZW50VHlwZTogZmlsZVR5cGUsXG4gICAgICAuLi4oczNPcHRpb25zIHx8IHt9KSxcbiAgICAgIEtleTogZ2V0VXNlckltYWdlUGF0aChzZXNzaW9uSWQsIGltYWdlSWQsIGZpbGVUeXBlLCAndGh1bWJzJylcbiAgICB9O1xuICAgIGF3YWl0IHMzUHV0KHRodW1iT2JqKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklNQUdFX1NBVkVcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gaW1hZ2VJZGVudGl0eTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRJbWFnZSA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW1hZ2U6IEltYWdlVHlwZSxcbiAgczNPcHRpb25zPzogUHV0T2JqZWN0Q29tbWFuZElucHV0XG4pOiBQcm9taXNlPEltYWdlVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnYWRkSW1hZ2UnO1xuICBjb25zdCB7c2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7aW1hZ2VJZCwgZGVzY3JpcHRpb24sIGJ1ZmZlciwgZmlsZVR5cGUsIGl0ZW1JZCwgaXRlbVR5cGUsIHByaXZhY3kgPSAncHVibGljJ30gPSBpbWFnZTtcblxuICByZXR1cm4gcmVzaXplQW5kU2F2ZUltYWdlKGNvbnRleHQsIGltYWdlSWQsIGJ1ZmZlciwgZmlsZVR5cGUsIHMzT3B0aW9ucylcbiAgICAudGhlbigocmVzaXplZEltYWdlOiBJbWFnZVR5cGUpID0+IHtcbiAgICAgIGNvbnN0IGluc2VydDogSW1hZ2VUeXBlID0ge1xuICAgICAgICAuLi5yZXNpemVkSW1hZ2UsXG4gICAgICAgIF9rZXk6IGltYWdlSWQsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBmaWxlVHlwZSxcbiAgICAgICAgcHJpdmFjeTogbm9ybWFsaXplSW1hZ2VQcml2YWN5KHByaXZhY3kpLFxuICAgICAgICB1c2VySWQ6IHNlc3Npb25JZFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGFkZEl0ZW08SW1hZ2VUeXBlPihjb250ZXh0LCAnaW1hZ2VzJywgaW5zZXJ0KVxuICAgICAgICAudGhlbigoc2F2ZWRJbWFnZTogSW1hZ2VUeXBlKSA9PiBhZGRJbWFnZUVkZ2UoY29udGV4dCwge1xuICAgICAgICAgIGltYWdlSWQsXG4gICAgICAgICAgaXRlbUlkOiBpdGVtSWQgfHwgc2Vzc2lvbklkLFxuICAgICAgICAgIGl0ZW1UeXBlOiBwYXJzZVN0cmluZyhpdGVtVHlwZSB8fCAndXNlcnMnLCAzMikudG9Mb3dlckNhc2UoKSBhcyBBcmFuZ29EYkNvbGxlY3Rpb24sXG4gICAgICAgICAgdHlwZTogJ2ltYWdlJ1xuICAgICAgICB9KS50aGVuKCgpID0+IHNhdmVkSW1hZ2UpKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklNQUdFX1JFU0laRVxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkSW1hZ2VFZGdlID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIGltYWdlRWRnZTogSW1hZ2VFZGdlVHlwZSk6IFByb21pc2U8b2JqZWN0PiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdhZGRJbWFnZUVkZ2UnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtpbWFnZUlkLCBpdGVtSWQsIGl0ZW1UeXBlfSA9IGltYWdlRWRnZTtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgZWRnZUlkID0gY3JlYXRlSGFzaChgaGFzTWVkaWEtaW1hZ2UtJHtpbWFnZUlkfS0ke2l0ZW1JZH0tJHtzZXNzaW9uSWR9YCk7XG4gIGNvbnN0IGZvcm1hdEl0ZW1UeXBlOiBBcmFuZ29EYkNvbGxlY3Rpb24gPSBwYXJzZUNoYXIoaXRlbVR5cGUpLnRvTG93ZXJDYXNlKCkgYXMgQXJhbmdvRGJDb2xsZWN0aW9uO1xuICBjb25zdCBmb3JtYXRJdGVtSWQgPSBwYXJzZUlkKGl0ZW1JZCk7XG4gIGNvbnN0IGl0ZW1Eb2NJZCA9IGdldERvY0lkKGZvcm1hdEl0ZW1UeXBlLCB7X2tleTogZm9ybWF0SXRlbUlkfSk7XG4gIGNvbnN0IGZvcm1hdEltYWdlSWQgPSBwYXJzZUlkKGltYWdlSWQpO1xuICBjb25zdCBmaWxlRG9jSWQgPSBgaW1hZ2VzLyR7Zm9ybWF0SW1hZ2VJZH1gO1xuXG4gIGNvbnN0IGVkZ2U6IEltYWdlRWRnZVR5cGUgPSB7XG4gICAgX2Zyb206IGl0ZW1Eb2NJZCxcbiAgICBfa2V5OiBlZGdlSWQsXG4gICAgX3RvOiBmaWxlRG9jSWQsXG4gICAgYWRkZWQ6IG5vdyxcbiAgICBpdGVtVHlwZSxcbiAgICB0eXBlOiAnaW1hZ2UnXG4gIH07XG5cbiAgaWYoaXRlbURvY0lkKSB7XG4gICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkuY29sbGVjdGlvbihFREdFUy5IQVNfTUVESUEpLnNhdmUoZWRnZSwge3JldHVybk5ldzogdHJ1ZX0pXG4gICAgICAudGhlbigoZmlsZUVkZ2UpID0+IHVzZURiKGRhdGFiYXNlTmFtZSkuY29sbGVjdGlvbihFREdFUy5IQVNfTUVESUEpLmRvY3VtZW50KGZpbGVFZGdlKSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGVkZ2UsXG4gICAgICAgICAgZmlsZURvY0lkLFxuICAgICAgICAgIGltYWdlSWQsXG4gICAgICAgICAgaXRlbURvY0lkLFxuICAgICAgICAgIGl0ZW1JZCxcbiAgICAgICAgICBpdGVtVHlwZVxuICAgICAgICB9LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUltYWdlID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbWFnZTogSW1hZ2VUeXBlLFxuICBzM09wdGlvbnM/OiBQdXRPYmplY3RDb21tYW5kSW5wdXRcbik6IFByb21pc2U8SW1hZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICd1cGRhdGVJbWFnZSc7XG4gIGNvbnN0IHtzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBiYXNlNjQgPSAnJyxcbiAgICBidWZmZXI6IGltYWdlQnVmZmVyLFxuICAgIGRlc2NyaXB0aW9uLFxuICAgIGltYWdlSWQsXG4gICAgaXRlbUlkLFxuICAgIGl0ZW1UeXBlLFxuICAgIGZpbGVUeXBlLFxuICAgIHByaXZhY3ksXG4gICAgdXJsID0gJydcbiAgfSA9IGltYWdlO1xuXG4gIGNvbnN0IGZvcm1hdEltYWdlSWQgPSBpbWFnZUlkIHx8IGNyZWF0ZUhhc2goYGltYWdlLSR7c2Vzc2lvbklkfWApO1xuICBjb25zdCBmb3JtYXRJdGVtSWQgPSBwYXJzZUlkKGl0ZW1JZCk7XG4gIGNvbnN0IGZvcm1hdEl0ZW1UeXBlOiBBcmFuZ29EYkNvbGxlY3Rpb24gPSBwYXJzZUNoYXIoaXRlbVR5cGUsIDE2KS50b0xvd2VyQ2FzZSgpIGFzIEFyYW5nb0RiQ29sbGVjdGlvbjtcbiAgY29uc3QgY3VzdG9tUGFyYW1zOiBJbWFnZVR5cGUgPSB7XG4gICAgZGVzY3JpcHRpb24sXG4gICAgaW1hZ2VJZDogZm9ybWF0SW1hZ2VJZCxcbiAgICBwcml2YWN5OiBub3JtYWxpemVJbWFnZVByaXZhY3kocHJpdmFjeSksXG4gICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgfTtcblxuICBpZihiYXNlNjQgfHwgaW1hZ2VCdWZmZXIpIHtcbiAgICBsZXQgYnVmZmVyOiBCdWZmZXIgPSBpbWFnZUJ1ZmZlcjtcblxuICAgIGlmKGJhc2U2NCkge1xuICAgICAgY29uc3QgZm9ybWF0QmFzZTY0ID0gYmFzZTY0LnN1YnN0cihiYXNlNjQuaW5kZXhPZignLCcpICsgMSk7XG4gICAgICBidWZmZXIgPSBCdWZmZXIuZnJvbShmb3JtYXRCYXNlNjQsICdiYXNlNjQnKTtcbiAgICB9XG5cbiAgICBsZXQgdXBkYXRlZEZpbGVUeXBlID0gZmlsZVR5cGU7XG5cbiAgICBpZighZmlsZVR5cGUpIHtcbiAgICAgIGNvbnN0IHtmaWxlVHlwZUZyb21CdWZmZXJ9ID0gYXdhaXQgaW1wb3J0KCdmaWxlLXR5cGUnKTtcbiAgICAgIGNvbnN0IHttaW1lfSA9IGF3YWl0IGZpbGVUeXBlRnJvbUJ1ZmZlcihidWZmZXIpO1xuICAgICAgdXBkYXRlZEZpbGVUeXBlID0gbWltZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbWdQYXJhbXM6IEltYWdlVHlwZSA9IHtcbiAgICAgIC4uLmN1c3RvbVBhcmFtcyxcbiAgICAgIGJ1ZmZlcixcbiAgICAgIGZpbGVUeXBlOiB1cGRhdGVkRmlsZVR5cGVcbiAgICB9O1xuXG4gICAgcmV0dXJuIGFkZEltYWdlKGNvbnRleHQsIGltZ1BhcmFtcywgczNPcHRpb25zKVxuICAgICAgLnRoZW4oKGltYWdlOiBJbWFnZVR5cGUpID0+IHtcbiAgICAgICAgaWYoZm9ybWF0SXRlbUlkICYmIGZvcm1hdEl0ZW1UeXBlKSB7XG4gICAgICAgICAgY29uc3QgaW1hZ2VFZGdlOiBJbWFnZUVkZ2VUeXBlID0ge1xuICAgICAgICAgICAgaW1hZ2VJZDogZm9ybWF0SW1hZ2VJZCxcbiAgICAgICAgICAgIGl0ZW1JZDogZm9ybWF0SXRlbUlkLFxuICAgICAgICAgICAgaXRlbVR5cGU6IGZvcm1hdEl0ZW1UeXBlLFxuICAgICAgICAgICAgdHlwZTogJ2ltYWdlJ1xuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFkZEltYWdlRWRnZShjb250ZXh0LCBpbWFnZUVkZ2UpLnRoZW4oKCkgPT4gaW1hZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGltYWdlO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU1BR0VfU0FWRVxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbiAgfSBlbHNlIGlmKHVybCAhPT0gJycpIHtcbiAgICBsZXQgY29udGVudFR5cGU7XG5cbiAgICByZXR1cm4gaHR0cEdldCh1cmwpXG4gICAgICAudGhlbigocmVzOiBIdHRwUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgICAgcmV0dXJuIGxvZ0V4Y2VwdGlvbih7XG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklNQUdFX1JFUVVFU1RcbiAgICAgICAgICB9LCBjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRlbnRUeXBlID0gcmVzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICAgIC50aGVuKChyZXMpID0+IChyZXMgYXMgSHR0cFJlc3BvbnNlKS5idWZmZXIoKSlcbiAgICAgIC50aGVuKChidWZmZXI6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBjb25zdCBpbWdQYXJhbXM6IEltYWdlVHlwZSA9IHtcbiAgICAgICAgICAuLi5jdXN0b21QYXJhbXMsXG4gICAgICAgICAgYnVmZmVyLFxuICAgICAgICAgIGZpbGVUeXBlOiBjb250ZW50VHlwZVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBhZGRJbWFnZShjb250ZXh0LCBpbWdQYXJhbXMsIHMzT3B0aW9ucylcbiAgICAgICAgICAudGhlbigoaW1hZ2U6IEltYWdlVHlwZSkgPT4ge1xuICAgICAgICAgICAgaWYoZm9ybWF0SXRlbUlkICYmIGZvcm1hdEl0ZW1UeXBlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGltYWdlRWRnZTogSW1hZ2VFZGdlVHlwZSA9IHtpbWFnZUlkOiBmb3JtYXRJbWFnZUlkLCBpdGVtSWQ6IGZvcm1hdEl0ZW1JZCwgaXRlbVR5cGU6IGZvcm1hdEl0ZW1UeXBlLCB0eXBlOiAnaW1hZ2UnfTtcbiAgICAgICAgICAgICAgcmV0dXJuIGFkZEltYWdlRWRnZShjb250ZXh0LCBpbWFnZUVkZ2UpLnRoZW4oKCkgPT4gaW1hZ2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gaW1hZ2U7XG4gICAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6ICdmZXRjaF9lcnJvcidcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG4gIH0gZWxzZSBpZihpbWFnZUlkKSB7XG4gICAgY29uc3QgdXBkYXRlID0ge1xuICAgICAgLi4uKGRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgPyB7ZGVzY3JpcHRpb259IDoge30pLFxuICAgICAgLi4uKHByaXZhY3kgIT09IHVuZGVmaW5lZCA/IHtwcml2YWN5OiBub3JtYWxpemVJbWFnZVByaXZhY3kocHJpdmFjeSl9IDoge30pXG4gICAgfTtcblxuICAgIHJldHVybiB1cGRhdGVJdGVtPEltYWdlVHlwZT4oY29udGV4dCwgJ2ltYWdlcycsIGZvcm1hdEltYWdlSWQsIHVwZGF0ZSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVJbWFnZSA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCBpbWFnZUlkOiBzdHJpbmcpOiBQcm9taXNlPEltYWdlVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZGVsZXRlJztcbiAgY29uc3Qge3Nlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SW1hZ2VJZCA9IHBhcnNlSWQoaW1hZ2VJZCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBpbWFnZSA9IGF3YWl0IGRlbGV0ZUl0ZW08SW1hZ2VUeXBlPihjb250ZXh0LCAnaW1hZ2VzJywgZm9ybWF0SW1hZ2VJZCwge1xuICAgICAgY2FzY2FkZTogW0VER0VTLkhBU19NRURJQV0sXG4gICAgICBvd25lcnNoaXA6IHRydWVcbiAgICB9KTtcblxuICAgIGlmKCFpbWFnZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRGVsZXRlIFMzIGZpbGVzXG4gICAgY29uc3Qge19rZXk6IGltYWdlS2V5fSA9IGltYWdlO1xuICAgIGNvbnN0IHBhcmFtczogRGVsZXRlT2JqZWN0c0NvbW1hbmRJbnB1dCA9IHtcbiAgICAgIEJ1Y2tldDogbnVsbCxcbiAgICAgIERlbGV0ZToge1xuICAgICAgICBPYmplY3RzOiBbXG4gICAgICAgICAge0tleTogYHVzZXJzLyR7c2Vzc2lvbklkfS9pbWFnZXMvJHtpbWFnZUtleX0uanBnYH0sXG4gICAgICAgICAge0tleTogYHVzZXJzLyR7c2Vzc2lvbklkfS90aHVtYnMvJHtpbWFnZUtleX0uanBnYH1cbiAgICAgICAgXSxcbiAgICAgICAgUXVpZXQ6IHRydWVcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHMzRGVsZXRlTGlzdChwYXJhbXMpLnRoZW4oKCkgPT4gaW1hZ2UpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7aW1hZ2VJZH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxufTtcbiJdLCJuYW1lcyI6WyJnZXQiLCJodHRwR2V0IiwicGFyc2VOdW0iLCJjcmVhdGVIYXNoIiwicGFyc2VBcmFuZ29JZCIsInBhcnNlQ2hhciIsInBhcnNlSWQiLCJwYXJzZVN0cmluZyIsImFxbCIsImxpdGVyYWwiLCJleGlmUmVhZGVyIiwic2hhcnAiLCJDb25maWciLCJDT0xMRUNUSU9OUyIsIkVER0VTIiwiRXJyb3JUeXBlcyIsImxvZ0Vycm9yIiwibG9nRXhjZXB0aW9uIiwiZ2V0RG9jSWQiLCJnZXRMaW1pdCIsInNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUiLCJ1c2VEYiIsImdldEltYWdlRXh0ZW5zaW9uIiwiYWRkSXRlbSIsImRlbGV0ZUl0ZW0iLCJnZXRJdGVtQnkiLCJnZXRMaXN0QnkiLCJ1cGRhdGVJdGVtIiwiZ2V0R3JvdXBEZXRhaWxzIiwiaXNHcm91cGVkIiwiZ2V0UGVyc29uYVJlbGF0aW9uc2hpcFN0YXRlIiwiczNEZWxldGVMaXN0IiwiczNHZXRTaWduZWRVcmwiLCJzM1B1dCIsImhhc1N1YnNjcmlwdGlvblRvSXRlbSIsImV2ZW50Q2F0ZWdvcnkiLCJoYXNSZWFjdGlvbkNvbGxlY3Rpb24iLCJIQVNfUkVBQ1RJT04iLCJoYXNNZWRpYUNvbGxlY3Rpb24iLCJIQVNfTUVESUEiLCJwZXJzb25hc0NvbGxlY3Rpb24iLCJQRVJTT05BUyIsIk1FRElBX0lURU1fQ09MTEVDVElPTlMiLCJVU0VSUyIsIlBPU1RTIiwiR1JPVVBTIiwiZ2V0TWVkaWFJdGVtRG9jSWRzIiwiaXRlbUlkIiwiaXRlbVR5cGUiLCJkb2NJZCIsIml0ZW1LZXkiLCJpbmNsdWRlcyIsIm1hcCIsImNvbGxlY3Rpb24iLCJub3JtYWxpemVJbWFnZUZvcm1hdCIsImZvcm1hdCIsImltYWdlRXhpZk1ldGFkYXRhIiwiZXhpZiIsIm1ldGFkYXRhIiwidGFrZW4iLCJQaG90byIsIkRhdGVUaW1lT3JpZ2luYWwiLCJtYWtlIiwiSW1hZ2UiLCJNYWtlIiwibW9kZWwiLCJNb2RlbCIsIkRhdGUiLCJnZXRUaW1lIiwidW5kZWZpbmVkIiwibm9ybWFsaXplSW1hZ2VQcml2YWN5IiwicHJpdmFjeSIsIlN0cmluZyIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsImNhblZpZXdJbWFnZSIsImltYWdlIiwidmlld2VyVXNlcklkIiwiYWNjZXNzIiwiaXNPd25lciIsInVzZXJJZCIsImNhblZpZXdGcmllbmRzIiwiY2FuVmlld1ZpcCIsInBhcnNlSW1hZ2VPcHRpb25zIiwib3B0aW9ucyIsImZyb20iLCJ0byIsInR5cGUiLCJsaW1pdCIsImdldEltYWdlT3B0aW9uYWxGaWVsZHMiLCJmaWVsZHMiLCJyZWR1Y2UiLCJzZWxlY3RzIiwiZmllbGQiLCJxdWVyaWVzIiwicHVzaCIsIm9iamVjdHMiLCJnZXRJbWFnZUxpc3RCeVVzZXIiLCJjb250ZXh0IiwiYWN0aW9uIiwiZm9ybWF0VXNlcklkIiwic29ydCIsImRpcmVjdGlvbiIsImN1c3RvbVF1ZXJpZXMiLCJjdXN0b21PYmplY3RzIiwiY2F0Y2giLCJlcnJvciIsImNhdGVnb3J5IiwicGFyYW1zIiwidmFsdWUiLCJEQVRBQkFTRV9FUlJPUiIsImdldEltYWdlQ291bnRCeUl0ZW0iLCJkYXRhYmFzZU5hbWUiLCJpdGVtRG9jSWRzIiwiYXFsUXJ5IiwicXVlcnkiLCJ0aGVuIiwiY3Vyc29yIiwibmV4dCIsImNvdW50IiwiZ2V0SW1hZ2VMaXN0QnlJdGVtIiwic2Vzc2lvbiIsInNlc3Npb25Vc2VySWQiLCJmb3JtYXRJdGVtVHlwZSIsInNlbGVjdE9iamVjdHMiLCJzZWxlY3RRdWVyaWVzIiwiam9pbiIsImxlbmd0aCIsImxpc3QiLCJhbGwiLCJvd25lclVzZXJJZCIsImZpbHRlciIsIm1lZGlhSXRlbUtleSIsIl9tZWRpYUl0ZW1LZXkiLCJtZWRpYUl0ZW1UeXBlIiwiX21lZGlhSXRlbVR5cGUiLCJyZWxhdGlvbnNoaXAiLCJpc0ZyaWVuZCIsImdldEltYWdlTGlzdEJ5R3JvdXAiLCJzZXNzaW9uSWQiLCJmaWx0ZXJzIiwiZ3JvdXBJZCIsImZvcm1hdEdyb3VwSWQiLCJjb25kaXRpb25hbCIsIm5hbWUiLCJmb3JtYXRDb25kIiwiZ3JvdXAiLCJmaWx0ZXJTdHIiLCJncm91cGVkIiwiaXNWYWxpZCIsImZpbHRlckxpc3QiLCJnZXRJbWFnZUxpc3RCeVJlYWN0aW9ucyIsInJlYWN0aW9ucyIsImZvcm1hdFNlc3Npb25JZCIsImZvcm1hdFJlYWN0aW9ucyIsInJlYWN0aW9uTmFtZSIsImZpbHRlckJ5IiwiSlNPTiIsInN0cmluZ2lmeSIsImdldFBlcnNvbmFEb2NJZCIsInBlcnNvbmFJZCIsInBlcnNvbmFEb2NJZCIsInBlcnNvbmFLZXkiLCJnZXRJbWFnZUxpc3RCeVBlcnNvbmFSZWFjdGlvbnMiLCJzZXNzaW9uUGVyc29uYUlkIiwicmVhY3Rpb25OYW1lcyIsIkFycmF5IiwiaXNBcnJheSIsIkJvb2xlYW4iLCJnZXRJbWFnZUJ5SWQiLCJpbWFnZUlkIiwiZm9ybWF0SW1hZ2VJZCIsIm9wZXJhdG9yIiwiZ2V0VXNlckltYWdlUGF0aCIsImltYWdlVHlwZSIsImRpciIsImZpbGVuYW1lIiwiZ2V0QXBwSW1hZ2VVcmwiLCJidWNrZXQiLCJkaXJlY3RvcnkiLCJpc1RodW1iIiwidHlwZUlkIiwiYnVja2V0TmFtZSIsImltYWdlTmFtZSIsImltYWdlVXJsIiwiZ2V0SW1hZ2VVcmwiLCJpbWFnZURpciIsInVybFR5cGUiLCJjb25maWd1cmVkSW1hZ2VVcmwiLCJjb25maWd1cmVkQXBwVXJsIiwicHVibGljQmFzZVVybCIsImRldkJhc2VVcmwiLCJ0aHVtYlN1ZmZpeCIsImltYWdlS2V5IiwiQnVja2V0IiwiRXhwaXJlcyIsIktleSIsInJlc2l6ZUFuZFNhdmVJbWFnZSIsImJ1ZmZlciIsImZpbGVUeXBlIiwiczNPcHRpb25zIiwiaW1nVyIsImltZ1EiLCJzcGxpdCIsInNoYXJwRm9ybWF0IiwiaW1hZ2VPcHRpbWl6ZWRCdWZmZXIiLCJ0aHVtYk9wdGltaXplZEJ1ZmZlciIsImltYWdlSWRlbnRpdHkiLCJmaWxlU2l6ZSIsInJvdGF0ZSIsInJlc2l6ZSIsImZpdCIsImhlaWdodCIsIndpZHRoIiwid2l0aG91dEVubGFyZ2VtZW50IiwidG9Gb3JtYXQiLCJxdWFsaXR5IiwidG9CdWZmZXIiLCJJTUFHRV9TQVZFIiwiaW1hZ2VPYmoiLCJCb2R5IiwiQ29udGVudFR5cGUiLCJpbWFnZU1ldGFkYXRhIiwiaW1hZ2VTdGF0cyIsInNvdXJjZU1ldGFkYXRhIiwiUHJvbWlzZSIsInN0YXRzIiwiYiIsImciLCJyIiwiZG9taW5hbnQiLCJjb2xvciIsInRvU3RyaW5nIiwicGFkU3RhcnQiLCJleGlmTWV0YWRhdGEiLCJvcmllbnRhdGlvbiIsInJlc29sdXRpb24iLCJkZW5zaXR5IiwidGhtVyIsInRobVEiLCJwb3NpdGlvbiIsInRodW1iT2JqIiwiYWRkSW1hZ2UiLCJkZXNjcmlwdGlvbiIsInJlc2l6ZWRJbWFnZSIsImluc2VydCIsIl9rZXkiLCJzYXZlZEltYWdlIiwiYWRkSW1hZ2VFZGdlIiwiSU1BR0VfUkVTSVpFIiwiaW1hZ2VFZGdlIiwibm93IiwiZWRnZUlkIiwiZm9ybWF0SXRlbUlkIiwiaXRlbURvY0lkIiwiZmlsZURvY0lkIiwiZWRnZSIsIl9mcm9tIiwiX3RvIiwiYWRkZWQiLCJzYXZlIiwicmV0dXJuTmV3IiwiZmlsZUVkZ2UiLCJkb2N1bWVudCIsInVwZGF0ZUltYWdlIiwiYmFzZTY0IiwiaW1hZ2VCdWZmZXIiLCJ1cmwiLCJjdXN0b21QYXJhbXMiLCJmb3JtYXRCYXNlNjQiLCJzdWJzdHIiLCJpbmRleE9mIiwiQnVmZmVyIiwidXBkYXRlZEZpbGVUeXBlIiwiZmlsZVR5cGVGcm9tQnVmZmVyIiwibWltZSIsImltZ1BhcmFtcyIsImNvbnRlbnRUeXBlIiwicmVzIiwic3RhdHVzIiwiSU1BR0VfUkVRVUVTVCIsImhlYWRlcnMiLCJ1cGRhdGUiLCJkZWxldGVJbWFnZSIsImNhc2NhZGUiLCJvd25lcnNoaXAiLCJEZWxldGUiLCJPYmplY3RzIiwiUXVpZXQiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUVELFNBQVFBLE9BQU9DLE9BQU8sUUFBTyxvQkFBb0I7QUFDakQsU0FBUUMsUUFBUSxRQUFPLCtCQUErQjtBQUN0RCxTQUFRQyxVQUFVLEVBQUVDLGFBQWEsRUFBRUMsU0FBUyxFQUFFQyxPQUFPLEVBQUVDLFdBQVcsUUFBTywrQkFBK0I7QUFDeEcsU0FBUUMsR0FBRyxRQUFPLFdBQVc7QUFDN0IsU0FBa0JDLE9BQU8sUUFBTyxlQUFlO0FBQy9DLE9BQU9DLGdCQUFnQixjQUFjO0FBQ3JDLE9BQU9DLFdBQVcsUUFBUTtBQUUxQixTQUFRQyxNQUFNLFFBQU8sZUFBZTtBQUNwQyxTQUFRQyxXQUFXLEVBQUVDLEtBQUssUUFBTyw4QkFBOEI7QUFDL0QsU0FBUUMsVUFBVSxRQUFPLDBCQUEwQjtBQUNuRCxTQUFRQyxRQUFRLEVBQUVDLFlBQVksUUFBTyw2QkFBNkI7QUFDbEUsU0FBUUMsUUFBUSxFQUFFQyxRQUFRLEVBQUVDLHlCQUF5QixFQUFFQyxLQUFLLFFBQU8sNEJBQTRCO0FBQy9GLFNBQVFDLGlCQUFpQixRQUFPLHlCQUF5QjtBQUN6RCxTQUFRQyxPQUFPLEVBQUVDLFVBQVUsRUFBRUMsU0FBUyxFQUFFQyxTQUFTLEVBQUVDLFVBQVUsUUFBTyxZQUFZO0FBQ2hGLFNBQVFDLGVBQWUsRUFBRUMsU0FBUyxRQUFPLGNBQWM7QUFDdkQsU0FBUUMsMkJBQTJCLFFBQU8sZ0JBQWdCO0FBQzFELFNBQVFDLFlBQVksRUFBRUMsY0FBYyxFQUFFQyxLQUFLLFFBQU8sVUFBVTtBQUM1RCxTQUFRQyxxQkFBcUIsUUFBTyxxQkFBcUI7QUFjekQsTUFBTUMsZ0JBQWdCO0FBQ3RCLE1BQU1DLHdCQUF3QjNCLFFBQVFLLE1BQU11QixZQUFZO0FBQ3hELE1BQU1DLHFCQUFxQjdCLFFBQVFLLE1BQU15QixTQUFTO0FBQ2xELE1BQU1DLHFCQUFxQi9CLFFBQVFJLFlBQVk0QixRQUFRO0FBQ3ZELE1BQU1DLHlCQUF3RDtJQUM1RDdCLFlBQVk0QixRQUFRO0lBQ3BCNUIsWUFBWThCLEtBQUs7SUFDakI5QixZQUFZK0IsS0FBSztJQUNqQi9CLFlBQVlnQyxNQUFNO0NBQ25CO0FBSUQsTUFBTUMscUJBQXFCLENBQUNDLFFBQWdCQztJQUMxQyxNQUFNQyxRQUFRN0MsY0FBYzJDO0lBRTVCLElBQUdFLE9BQU87UUFDUixPQUFPO1lBQUNBO1NBQU07SUFDaEI7SUFFQSxNQUFNQyxVQUFVNUMsUUFBUXlDO0lBRXhCLElBQUcsQ0FBQ0csU0FBUztRQUNYLE9BQU8sRUFBRTtJQUNYO0lBRUEsSUFBR0YsWUFBWU4sdUJBQXVCUyxRQUFRLENBQUNILFdBQVc7UUFDeEQsT0FBTztZQUFDLEdBQUdBLFNBQVMsQ0FBQyxFQUFFRSxTQUFTO1NBQUM7SUFDbkM7SUFFQSxPQUFPUix1QkFBdUJVLEdBQUcsQ0FBQyxDQUFDQyxhQUFlLEdBQUdBLFdBQVcsQ0FBQyxFQUFFSCxTQUFTO0FBQzlFO0FBRUEsTUFBTUksdUJBQXVCLENBQUNDLFNBQzNCQSxXQUFXLFFBQVEsU0FBU0E7QUFFL0IsTUFBTUMsb0JBQW9CLENBQUNDO0lBQ3pCLElBQUcsQ0FBQ0EsTUFBTSxPQUFPLENBQUM7SUFFbEIsSUFBSTtRQUNGLE1BQU1DLFdBQVdoRCxXQUFXK0M7UUFDNUIsTUFBTUUsUUFBUUQsU0FBU0UsS0FBSyxFQUFFQztRQUM5QixPQUFPO1lBQ0xDLE1BQU1KLFNBQVNLLEtBQUssRUFBRUM7WUFDdEJDLE9BQU9QLFNBQVNLLEtBQUssRUFBRUc7WUFDdkJQLE9BQU9BLGlCQUFpQlEsT0FBT1IsTUFBTVMsT0FBTyxLQUFLQztRQUNuRDtJQUNGLEVBQUUsT0FBTTtRQUNOLE9BQU8sQ0FBQztJQUNWO0FBQ0Y7QUFFQSxNQUFNQyx3QkFBd0IsQ0FBQ0M7SUFDN0IsT0FBT0MsT0FBT0QsV0FBVyxJQUFJRSxJQUFJLEdBQUdDLFdBQVc7UUFDN0MsS0FBSztZQUNILE9BQU87UUFDVCxLQUFLO1lBQ0gsT0FBTztRQUNULEtBQUs7WUFDSCxPQUFPO1FBQ1Q7WUFDRSxPQUFPO0lBQ1g7QUFDRjtBQUVBLE1BQU1DLGVBQWUsQ0FDbkJDLE9BQ0FDLGNBQ0FDO0lBTUEsTUFBTVAsVUFBVUQsc0JBQXNCTSxPQUFPTDtJQUU3QyxJQUFHTyxPQUFPQyxPQUFPLElBQUlQLE9BQU9JLE9BQU9JLFVBQVUsUUFBUUgsY0FBYztRQUNqRSxPQUFPO0lBQ1Q7SUFFQSxPQUFPTjtRQUNMLEtBQUs7WUFDSCxPQUFPO1FBQ1QsS0FBSztZQUNILE9BQU9PLE9BQU9HLGNBQWM7UUFDOUIsS0FBSztZQUNILE9BQU9ILE9BQU9JLFVBQVU7UUFDMUI7WUFDRSxPQUFPO0lBQ1g7QUFDRjtBQUVBLE9BQU8sTUFBTUMsb0JBQW9CLENBQUNDLFVBQXdCLENBQUMsQ0FBQztJQUMxRCxNQUFNLEVBQ0pDLE9BQU8sQ0FBQyxFQUNSQyxLQUFLLEVBQUUsRUFDUEMsT0FBTyxTQUFTLEVBQ2pCLEdBQUdIO0lBRUosT0FBTztRQUNMSSxPQUFPckUsU0FBU2tFLE1BQU1DO1FBQ3RCQyxNQUFNbEYsVUFBVWtGLE1BQU07SUFDeEI7QUFDRixFQUFFO0FBRUYsT0FBTyxNQUFNRSx5QkFBeUIsQ0FBQ0MsU0FBbUIsRUFBRSxHQUMxREEsT0FBT0MsTUFBTSxDQUFDLENBQUNDLFNBQVNDO1FBQ3RCLElBQUdBLE1BQU0xQyxRQUFRLENBQUMsVUFBVTtZQUMxQixPQUFPL0IsMEJBQTBCLFVBQVUsS0FBS3lFLE9BQU9EO1FBQ3pEO1FBRUEsT0FBT0M7WUFDTCxLQUFLO2dCQUFhO29CQUNoQkQsUUFBUUUsT0FBTyxDQUFDQyxJQUFJLENBQUMsQ0FBQzs7OztTQUlyQixDQUFDO29CQUNGSCxRQUFRSSxPQUFPLENBQUNELElBQUksQ0FBQztvQkFDckIsT0FBT0g7Z0JBQ1Q7WUFDQSxLQUFLO2dCQUFRO29CQUNYQSxRQUFRRSxPQUFPLENBQUNDLElBQUksQ0FBQyxDQUFDOzs7U0FHckIsQ0FBQztvQkFDRkgsUUFBUUksT0FBTyxDQUFDRCxJQUFJLENBQUM7b0JBQ3JCLE9BQU9IO2dCQUNUO1lBQ0EsS0FBSztnQkFBUztvQkFDWkEsUUFBUUUsT0FBTyxDQUFDQyxJQUFJLENBQUMsQ0FBQzs7Ozs7U0FLckIsQ0FBQztvQkFDRkgsUUFBUUksT0FBTyxDQUFDRCxJQUFJLENBQUM7b0JBQ3JCLE9BQU9IO2dCQUNUO1lBQ0E7Z0JBQVM7b0JBQ1AsT0FBT0E7Z0JBQ1Q7UUFDRjtJQUNGLEdBQUc7UUFBQ0ksU0FBUyxFQUFFO1FBQUVGLFNBQVMsRUFBRTtJQUFBLEdBQUc7QUFFakMsT0FBTyxNQUFNRyxxQkFBcUIsQ0FDaENDLFNBQ0FsQixRQUNBSyxPQUFlLENBQUMsRUFDaEJDLEtBQWEsRUFBRTtJQUVmLE1BQU1hLFNBQVM7SUFDZixNQUFNQyxlQUFlOUYsUUFBUTBFO0lBRTdCLE9BQU90RCxVQUFxQndFLFNBQVMsVUFBVTtRQUFDbEIsUUFBUW9CO0lBQVksR0FBRztRQUNyRUMsTUFBTTtZQUFDO2dCQUFDUixPQUFPO2dCQUFTUyxXQUFXO1lBQU07U0FBRTtRQUMzQ2QsT0FBTztZQUFDSDtZQUFNQztRQUFFO1FBQ2hCaUIsZUFBZTtZQUNiLENBQUMsNkVBQTZFLENBQUM7U0FDaEY7UUFDREMsZUFBZTtZQUFDO1NBQVk7SUFDOUIsR0FDR0MsS0FBSyxDQUFDLENBQUNDO1FBQ04xRixTQUFTO1lBQ1BtRjtZQUNBUSxVQUFVeEU7WUFDVnlFLFFBQVE7Z0JBQUN2QjtnQkFBTUM7Z0JBQUlOO1lBQU07WUFDekI2QixPQUFPOUYsV0FBVytGLGNBQWM7UUFDbEMsR0FBR0osT0FBT1I7UUFFVixPQUFPLEVBQUU7SUFDWDtBQUNKLEVBQUU7QUFFRixPQUFPLE1BQU1hLHNCQUFzQixDQUFDYixTQUFxQm5EO0lBQ3ZELE1BQU1vRCxTQUFTO0lBQ2YsTUFBTSxFQUFDYSxZQUFZLEVBQUMsR0FBR2Q7SUFDdkIsTUFBTWUsYUFBYW5FLG1CQUFtQkM7SUFDdEMsTUFBTW1FLFNBQW1CMUcsR0FBRyxDQUFDOztlQUVoQixFQUFFOEIsbUJBQW1COzBCQUNWLEVBQUUyRSxXQUFXOzs7OztFQUtyQyxDQUFDO0lBRUQsT0FBTzVGLE1BQU0yRixjQUFjRyxLQUFLLENBQUNELFFBQzlCRSxJQUFJLENBQUMsQ0FBQ0MsU0FBV0EsT0FBT0MsSUFBSSxJQUM1QkYsSUFBSSxDQUFDLENBQUMsRUFBQ0csS0FBSyxFQUFDLEdBQUtBLE9BQ2xCZCxLQUFLLENBQUMsQ0FBQ0MsUUFBaUIxRixTQUFTO1lBQ2hDbUY7WUFDQVEsVUFBVXhFO1lBQ1Z5RSxRQUFRO2dCQUFDN0Q7WUFBTTtZQUNmOEQsT0FBTzlGLFdBQVcrRixjQUFjO1FBQ2xDLEdBQUdKLE9BQU9SO0FBQ2QsRUFBRTtBQUVGLE9BQU8sTUFBTXNCLHFCQUFxQixPQUNoQ3RCLFNBQ0FuRCxRQUNBcUMsVUFBd0IsQ0FBQyxDQUFDO0lBRTFCLE1BQU1lLFNBQVM7SUFDZixNQUFNLEVBQUNhLFlBQVksRUFBRXRCLFNBQVMsRUFBRSxFQUFFK0IsU0FBUyxFQUFDekMsUUFBUTBDLGdCQUFnQixFQUFFLEVBQUMsR0FBRyxDQUFDLENBQUMsRUFBQyxHQUFHeEI7SUFDaEYsTUFBTXlCLGlCQUFpQnZDLFNBQVNwQyxXQUFXM0MsVUFBVW1FLE9BQU9ZLFFBQVFwQyxRQUFRLElBQUksS0FBSyxJQUFJMEIsV0FBVyxLQUEyQkw7SUFDL0gsTUFBTTRDLGFBQWFuRSxtQkFBbUJDLFFBQVE0RTtJQUM5QyxNQUFNLEVBQUNuQyxLQUFLLEVBQUMsR0FBR0wsa0JBQWtCQztJQUNsQyxNQUFNLEVBQUNZLFNBQVM0QixhQUFhLEVBQUU5QixTQUFTK0IsYUFBYSxFQUFDLEdBQUdwQyx1QkFBdUJDO0lBQ2hGLE1BQU13QixTQUFtQjFHLEdBQUcsQ0FBQzthQUNsQixFQUFFOEIsbUJBQW1CO3dCQUNWLEVBQUUyRSxXQUFXOzs7OzZEQUl3QixFQUFFeEcsUUFBUUksWUFBWTRCLFFBQVEsRUFBRTtNQUN2RixFQUFFaEMsUUFBUW9ILGNBQWNDLElBQUksQ0FBQyxPQUFPOztNQUVwQyxFQUFFckgsUUFBUStFLE1BQU1oRixHQUFHLEVBQUU7O1FBRW5CLEVBQUVvSCxjQUFjRyxNQUFNLEdBQUcsSUFBSXRILFFBQVEsQ0FBQyxVQUFVLEVBQUVtSCxjQUFjRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSXJILFFBQVEsS0FBSzs7Ozs7Ozs7Ozs7O0VBWXJHLENBQUM7SUFFRCxJQUFJO1FBQ0YsTUFBTXVILE9BQU8sTUFBTTNHLE1BQU0yRixjQUFjRyxLQUFLLENBQUNELFFBQzFDRSxJQUFJLENBQUMsQ0FBQ0MsU0FBV0EsT0FBT1ksR0FBRztRQUU5QixNQUFNQyxjQUFjMUQsT0FBT3dELElBQUksQ0FBQyxFQUFFLEVBQUVoRCxVQUFVO1FBQzlDLE1BQU1ELFVBQVUsQ0FBQyxDQUFDMkMsaUJBQWlCLENBQUMsQ0FBQ1EsZUFBZVIsa0JBQWtCUTtRQUV0RSxJQUFHbkQsU0FBUztZQUNWLE9BQU9pRDtRQUNUO1FBRUEsSUFBRyxDQUFDTixlQUFlO1lBQ2pCLE9BQU9NLEtBQUtHLE1BQU0sQ0FBQyxDQUFDdkQsUUFBVU4sc0JBQXNCTSxPQUFPTCxhQUFhO1FBQzFFO1FBRUEsSUFBSVUsaUJBQWlCO1FBQ3JCLElBQUlDLGFBQWE7UUFFakIsTUFBTWtELGVBQWU1RCxPQUFPLEFBQUN3RCxJQUFJLENBQUMsRUFBRSxFQUEyQ0ssaUJBQWlCO1FBQ2hHLE1BQU1DLGdCQUFnQjlELE9BQU8sQUFBQ3dELElBQUksQ0FBQyxFQUFFLEVBQTRDTyxrQkFBa0I7UUFFbkcsSUFBR0Qsa0JBQWtCekgsWUFBWTRCLFFBQVEsSUFBSTJGLGNBQWM7WUFDekQsTUFBTUksZUFBZSxNQUFNMUcsNEJBQTRCb0UsU0FBU2tDO1lBQ2hFbkQsaUJBQWlCLENBQUMsQ0FBQ3VELGNBQWNDO1lBQ2pDdkQsYUFBYSxNQUFNaEQsc0JBQXNCZ0UsU0FBU2tDLGNBQWN2SCxZQUFZNEIsUUFBUTtRQUN0RjtRQUVBLE9BQU91RixLQUFLRyxNQUFNLENBQUMsQ0FBQ3ZELFFBQVVELGFBQWFDLE9BQU84QyxlQUFlO2dCQUFDekM7Z0JBQWdCQztnQkFBWUg7WUFBTztJQUN2RyxFQUFFLE9BQU0yQixPQUFPO1FBQ1gxRixTQUFTO1lBQ1BtRjtZQUNBUSxVQUFVeEU7WUFDVnlFLFFBQVE7Z0JBQUM3RDtnQkFBUXFDLFNBQVM7b0JBQUMsR0FBR0EsT0FBTztvQkFBRXBDLFVBQVUyRTtnQkFBYztZQUFDO1lBQ2hFZCxPQUFPOUYsV0FBVytGLGNBQWM7UUFDbEMsR0FBR0osT0FBT1I7UUFDVixPQUFPLEVBQUU7SUFDYjtBQUNGLEVBQUU7QUFFRixPQUFPLE1BQU13QyxzQkFBc0IsQ0FDakN4QyxTQUNBVTtJQUVBLE1BQU1ULFNBQVM7SUFDZixNQUFNLEVBQUNhLFlBQVksRUFBRVMsU0FBUyxFQUFDekMsUUFBUTJELFNBQVMsRUFBQyxFQUFDLEdBQUd6QztJQUNyRCxNQUFNLEVBQUMwQyxPQUFPLEVBQUVDLE9BQU8sRUFBRXhELElBQUksRUFBRUMsRUFBRSxFQUFDLEdBQUdzQjtJQUNyQyxNQUFNa0MsZ0JBQWdCeEksUUFBUXVJO0lBQzlCLE1BQU1yRCxRQUF1QnJFLFNBQVNrRSxNQUFNQztJQUU1Q3NELFFBQ0d4RixHQUFHLENBQUMsQ0FBQytFO1FBQ0osTUFBTSxFQUFDWSxXQUFXLEVBQUVDLElBQUksRUFBRW5DLEtBQUssRUFBQyxHQUFHc0I7UUFDbkMsSUFBSWMsYUFBYUY7UUFFakIsSUFBR0EsZ0JBQWdCLFFBQVFBLGdCQUFnQixRQUFRQSxnQkFBZ0IsT0FBT0EsZ0JBQWdCLEtBQUs7WUFDN0ZFLGFBQWE7UUFDZjtRQUVBLE9BQU9EO1lBQ0wsS0FBSztnQkFDSCxPQUFPLENBQUMsUUFBUSxFQUFFQyxXQUFXLENBQUMsRUFBRS9JLFNBQVMyRyxRQUFRO1lBQ25EO2dCQUNFLE9BQU87UUFDWDtJQUNGO0lBRUYsT0FBT2pGLGdCQUFnQnNFLFNBQVM0QyxlQUM3QjFCLElBQUksQ0FBQyxDQUFDOEI7UUFDTCxJQUFHQSxNQUFNM0UsT0FBTyxLQUFLLFVBQVU7WUFDN0JxRSxRQUFRN0MsSUFBSSxDQUFDO2dCQUFDZ0QsYUFBYTtnQkFBTUMsTUFBTTtnQkFBV25DLE9BQU9pQztZQUFhO1lBQ3RFLE1BQU1LLFlBQVlQLFFBQVFkLElBQUksQ0FBQztZQUMvQixNQUFNWixTQUFtQjFHLEdBQUcsQ0FBQzs7O3FCQUdoQixFQUFFQyxRQUFRMEksV0FBVzs7MkNBRUMsRUFBRTdHLG1CQUFtQjs7Ozs7Ozs7WUFRcEQsRUFBRTdCLFFBQVErRSxNQUFNaEYsR0FBRyxFQUFFOztRQUV6QixDQUFDO1lBRUQsT0FBT2EsTUFBTTJGLGNBQWNHLEtBQUssQ0FBQ0QsUUFDOUJFLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPWSxHQUFHLElBQzNCeEIsS0FBSyxDQUFDLENBQUNDO2dCQUNOMUYsU0FBUztvQkFDUG1GO29CQUNBUSxVQUFVeEU7b0JBQ1Z5RSxRQUFRO3dCQUFDZ0M7d0JBQVN2RDt3QkFBTXdEO3dCQUFTdkQ7b0JBQUU7b0JBQ25DdUIsT0FBTzlGLFdBQVcrRixjQUFjO2dCQUNsQyxHQUFHSixPQUFPUjtnQkFDVixPQUFPLEVBQUU7WUFDWDtRQUNKO1FBQ0EsT0FBT3JFLFVBQVVxRSxTQUFTeUMsV0FBV0UsU0FDbEN6QixJQUFJLENBQUMsQ0FBQ2dDO1lBQ0wsSUFBR0EsUUFBUUMsT0FBTyxFQUFFO2dCQUNsQlQsUUFBUTdDLElBQUksQ0FBQztvQkFBQ2dELGFBQWE7b0JBQU1DLE1BQU07b0JBQVduQyxPQUFPdUMsUUFBUVAsT0FBTztnQkFBQTtnQkFDeEUsTUFBTVMsYUFBYVYsUUFBUWQsSUFBSSxDQUFDO2dCQUNoQyxNQUFNWixTQUFtQjFHLEdBQUcsQ0FBQzs7dUJBRWxCLEVBQUVDLFFBQVE2SSxZQUFZOzs7a0JBRzNCLEVBQUU3SSxRQUFRK0UsTUFBTWhGLEdBQUcsRUFBRTs7O1lBRzNCLENBQUM7Z0JBRUQsT0FBT2EsTUFBTTJGLGNBQWNHLEtBQUssQ0FBQ0QsUUFDOUJFLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPWSxHQUFHLElBQzNCeEIsS0FBSyxDQUFDLENBQUNDO29CQUNOMUYsU0FBUzt3QkFDUG1GO3dCQUNBUSxVQUFVeEU7d0JBQ1Z5RSxRQUFROzRCQUFDZ0M7NEJBQVN2RDs0QkFBTXdEOzRCQUFTdkQ7d0JBQUU7d0JBQ25DdUIsT0FBTzlGLFdBQVcrRixjQUFjO29CQUNsQyxHQUFHSixPQUFPUjtvQkFDVixPQUFPLEVBQUU7Z0JBQ1g7WUFDSjtZQUNBLE9BQU8sRUFBRTtRQUNYO0lBQ0o7QUFDSixFQUFFO0FBRUYsT0FBTyxNQUFNcUQsMEJBQTBCLENBQ3JDckQsU0FDQXNELFlBQXNCLEVBQUUsRUFDeEJwRTtJQUVBLE1BQU1lLFNBQVM7SUFDZixNQUFNLEVBQUNhLFlBQVksRUFBRXRCLFNBQVMsRUFBRSxFQUFFK0IsU0FBUyxFQUFDekMsUUFBUTJELFNBQVMsRUFBQyxFQUFDLEdBQUd6QztJQUNsRSxNQUFNLEVBQUNWLEtBQUssRUFBQyxHQUFHTCxrQkFBa0JDO0lBQ2xDLE1BQU0sRUFBQ1ksU0FBUzRCLGFBQWEsRUFBRTlCLFNBQVMrQixhQUFhLEVBQUMsR0FBR3BDLHVCQUF1QkM7SUFDaEYsTUFBTStELGtCQUFrQixDQUFDLE1BQU0sRUFBRWQsV0FBVztJQUM1QyxNQUFNZSxrQkFBNEJGLFVBQVVwRyxHQUFHLENBQUMsQ0FBQ3VHLGVBQWlCdEosVUFBVXNKLGNBQWM7SUFDMUYsTUFBTUMsV0FBcUI7UUFDekI7UUFDQSxDQUFDLFNBQVMsRUFBRUMsS0FBS0MsU0FBUyxDQUFDSixpQkFBaUIsZ0JBQWdCLENBQUM7S0FBQztJQUVoRSx5QkFBeUI7SUFDekIsTUFBTXhDLFNBQW1CMUcsR0FBRyxDQUFDO3lCQUNOLEVBQUVpSixnQkFBZ0I7OztzQ0FHTCxFQUFFbkgsbUJBQW1COzs7Ozs7OzswRUFRZSxFQUFFN0IsUUFBUUksWUFBWTRCLFFBQVEsRUFBRTtNQUNwRyxFQUFFaEMsUUFBUW9ILGNBQWNDLElBQUksQ0FBQyxPQUFPO2FBQzdCLEVBQUVySCxRQUFRbUosU0FBUzlCLElBQUksQ0FBQyxTQUFTO01BQ3hDLEVBQUVySCxRQUFRK0UsTUFBTWhGLEdBQUcsRUFBRTs7UUFFbkIsRUFBRW9ILGNBQWNHLE1BQU0sR0FBRyxJQUFJdEgsUUFBUSxDQUFDLFVBQVUsRUFBRW1ILGNBQWNFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJckgsUUFBUSxLQUFLOzs7Ozs7Ozs7O0VBVXJHLENBQUM7SUFFRCxPQUFPWSxNQUFNMkYsY0FBY0csS0FBSyxDQUFDRCxRQUM5QkUsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9ZLEdBQUcsSUFDM0J4QixLQUFLLENBQUMsQ0FBQ0M7UUFDTjFGLFNBQVM7WUFDUG1GO1lBQ0FRLFVBQVV4RTtZQUNWeUUsUUFBUTtnQkFBQ3hCO2dCQUFTb0U7WUFBUztZQUMzQjNDLE9BQU85RixXQUFXK0YsY0FBYztRQUNsQyxHQUFHSixPQUFPUjtRQUNWLE9BQU8sRUFBRTtJQUNYO0FBQ0osRUFBRTtBQUVGLE1BQU02RCxrQkFBa0IsQ0FBQ0M7SUFDdkIsTUFBTUMsZUFBZTdKLGNBQWM0SjtJQUVuQyxJQUFHQyxjQUFjO1FBQ2YsT0FBT0E7SUFDVDtJQUVBLE1BQU1DLGFBQWE1SixRQUFRMEo7SUFDM0IsT0FBT0UsYUFBYSxHQUFHckosWUFBWTRCLFFBQVEsQ0FBQyxDQUFDLEVBQUV5SCxZQUFZLEdBQUc7QUFDaEU7QUFFQSxPQUFPLE1BQU1DLGlDQUFpQyxPQUM1Q2pFLFNBQ0E4RCxZQUFvQixFQUFFLEVBQ3RCUixZQUFzQixFQUFFLEVBQ3hCcEU7SUFFQSxNQUFNZSxTQUFTO0lBQ2YsTUFBTWlFLG1CQUFtQjVGLE9BQU8wQixTQUFTdUIsU0FBU3VDLGFBQWE7SUFDL0QsTUFBTUMsZUFBZUYsZ0JBQWdCQyxhQUFhSTtJQUNsRCxNQUFNQyxnQkFBZ0JDLE1BQU1DLE9BQU8sQ0FBQ2YsYUFDaENBLFVBQVVwRyxHQUFHLENBQUMsQ0FBQ3VHLGVBQWlCdEosVUFBVXNKLGNBQWMsSUFBSWpGLFdBQVcsSUFBSXlELE1BQU0sQ0FBQ3FDLFdBQ2xGLEVBQUU7SUFDTixNQUFNLEVBQUNoRixLQUFLLEVBQUMsR0FBR0wsa0JBQWtCQztJQUVsQyxJQUFHLENBQUM2RSxnQkFBZ0IsQ0FBQ0ksY0FBY3RDLE1BQU0sRUFBRTtRQUN6QyxPQUFPLEVBQUU7SUFDWDtJQUVBLE1BQU1iLFNBQW1CMUcsR0FBRyxDQUFDO29DQUNLLEVBQUV5SixhQUFhLENBQUMsRUFBRTdILHNCQUFzQjs7OzZDQUcvQixFQUFFRSxtQkFBbUI7Ozs7Ozs7OzBFQVFRLEVBQUVFLG1CQUFtQjs7c0JBRXpFLEVBQUU2SCxjQUFjOztNQUVoQyxFQUFFNUosUUFBUStFLE1BQU1oRixHQUFHLEVBQUU7Ozs7Ozs7OztFQVN6QixDQUFDO0lBRUQsSUFBSTtRQUNGLE9BQU8sTUFBTWEsTUFBTTZFLFFBQVFjLFlBQVksRUFBRUcsS0FBSyxDQUFDRCxRQUM1Q0UsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9ZLEdBQUc7SUFDaEMsRUFBRSxPQUFNdkIsT0FBTztRQUNiMUYsU0FBUztZQUNQbUY7WUFDQVEsVUFBVXhFO1lBQ1Z5RSxRQUFRO2dCQUFDeEI7Z0JBQVM0RTtnQkFBV1I7WUFBUztZQUN0QzNDLE9BQU85RixXQUFXK0YsY0FBYztRQUNsQyxHQUFHSixPQUFnQlI7UUFFbkIsT0FBTyxFQUFFO0lBQ1g7QUFDRixFQUFFO0FBRUYsT0FBTyxNQUFNdUUsZUFBZSxDQUFDdkUsU0FBcUJ3RTtJQUNoRCxNQUFNQyxnQkFBZ0JySyxRQUFRb0s7SUFDOUIsTUFBTTlCLFVBQXVCO1FBQzNCZ0MsVUFBVTtRQUNWaEMsU0FBUztZQUFDO2dCQUFDL0MsT0FBTztnQkFBUStFLFVBQVU7Z0JBQU0vRCxPQUFPOEQ7WUFBYTtTQUFFO0lBQ2xFO0lBRUEsT0FBT2xKLFVBQXFCeUUsU0FBUyxVQUFVMEM7QUFDakQsRUFBRTtBQUVGLE9BQU8sTUFBTWlDLG1CQUFtQixDQUFDN0YsUUFBZ0IwRixTQUFpQkksV0FBbUJDLE1BQWMsUUFBUTtJQUN6RyxNQUFNQyxXQUFXLEdBQUdOLFFBQVEsQ0FBQyxFQUFFcEosa0JBQWtCd0osWUFBWTtJQUU3RCxPQUFPLENBQUMsTUFBTSxFQUFFOUYsT0FBTyxDQUFDLEVBQUUrRixJQUFJLENBQUMsRUFBRUMsVUFBVTtBQUM3QyxFQUFFO0FBRUYsT0FBTyxNQUFNQyxpQkFBaUIsQ0FBQyxFQUM3QkMsTUFBTSxFQUNOQyxZQUFZLFFBQVEsRUFDcEJULE9BQU8sRUFDUEksWUFBWSxLQUFLLEVBQ2pCTSxVQUFVLEtBQUssRUFDZjdGLElBQUksRUFDSjhGLE1BQU0sRUFDTztJQUNiLElBQUcsQ0FBQzlGLE1BQU07UUFDUixPQUFPO0lBQ1Q7SUFFQSxJQUFHLENBQUNtRixTQUFTO1FBQ1gsSUFBR0ksY0FBYyxXQUFXO1lBQzFCLE9BQU8sR0FBR2xLLE9BQU9aLEdBQUcsQ0FBQyxvQkFBb0IsYUFBYSxDQUFDO1FBQ3pEO1FBQ0EsT0FBTyxHQUFHWSxPQUFPWixHQUFHLENBQUMsb0JBQW9CLGFBQWEsQ0FBQztJQUN6RDtJQUVBLE1BQU1zTCxhQUFhSixVQUFVdEssT0FBT1osR0FBRyxDQUFDLG1CQUFtQjtJQUMzRCxNQUFNdUwsWUFBWUgsVUFBVSxHQUFHVixRQUFRLElBQUksRUFBRUksV0FBVyxHQUFHLEdBQUdKLFFBQVEsQ0FBQyxFQUFFSSxjQUFjLGFBQWFBLGNBQWMsVUFBVSxRQUFRQSxXQUFXO0lBQy9JLE1BQU1VLFdBQVc1SyxPQUFPWixHQUFHLENBQUMsZ0JBQWdCLENBQUMseUJBQXlCLEVBQUVzTCxZQUFZO0lBRXBGLElBQUcvRixTQUFTLFFBQVE7UUFDbEIsT0FBTyxHQUFHaUcsU0FBUyxDQUFDLEVBQUVqRyxLQUFLLENBQUMsRUFBRTRGLFVBQVUsQ0FBQyxFQUFFSSxXQUFXO0lBQ3hEO0lBRUEsT0FBTyxHQUFHQyxTQUFTLENBQUMsRUFBRWpHLEtBQUssQ0FBQyxFQUFFOEYsT0FBTyxDQUFDLEVBQUVGLFVBQVUsQ0FBQyxFQUFFSSxXQUFXO0FBQ2xFLEVBQUU7QUFFRixPQUFPLE1BQU1FLGNBQWMsT0FBTyxFQUNoQ1AsTUFBTSxFQUNOUSxXQUFXLFFBQVEsRUFDbkJoQixPQUFPLEVBQ1BJLFlBQVksS0FBSyxFQUNqQk0sVUFBVSxLQUFLLEVBQ2Y3RixJQUFJLEVBQ0o4RixNQUFNLEVBQ05NLFVBQVUsUUFBUSxFQUNMO0lBQ2IsSUFBRyxDQUFDakIsU0FBUztRQUNYLE9BQU87SUFDVDtJQUVBLE1BQU1ZLGFBQWFKLFVBQVV0SyxPQUFPWixHQUFHLENBQUMsbUJBQW1CO0lBQzNELE1BQU00TCxxQkFBcUJwSCxPQUFPNUQsT0FBT1osR0FBRyxDQUFDLGdCQUFnQjtJQUM3RCxNQUFNNkwsbUJBQW1CckgsT0FBTzVELE9BQU9aLEdBQUcsQ0FBQyxjQUFjO0lBQ3pELE1BQU04TCxnQkFBZ0JELG1CQUNsQixDQUFDLFlBQVksRUFBRUEsa0JBQWtCLEdBQ2hDRCxzQkFBc0IsQ0FBQyx5QkFBeUIsRUFBRU4sWUFBWTtJQUNuRSxNQUFNUyxhQUFhRixtQkFDZixDQUFDLDZCQUE2QixFQUFFQSxrQkFBa0IsR0FDakRELHNCQUFzQixDQUFDLHlCQUF5QixFQUFFTixZQUFZO0lBRW5FLHdDQUF3QztJQUN4QyxJQUFHRixTQUFTO1FBQ1ZPLFVBQVU7SUFDWjtJQUVBLE1BQU1LLGNBQWNaLFVBQVUsUUFBUTtJQUN0QyxNQUFNYSxXQUFXLEdBQUcxRyxLQUFLLENBQUMsRUFBRThGLE9BQU8sQ0FBQyxFQUFFSyxTQUFTLENBQUMsRUFBRWhCLFVBQVVzQixZQUFZLENBQUMsRUFBRWxCLFdBQVc7SUFFdEYsT0FBT2E7UUFDTCxLQUFLO1lBQVU7Z0JBQ2IsT0FBTyxNQUFNM0osZUFBZTtvQkFBQ2tLLFFBQVFaO29CQUFZYSxTQUFTLEtBQUs7b0JBQUlDLEtBQUtIO2dCQUFRO1lBQ2xGO1FBQ0EsS0FBSztZQUFVO2dCQUNiLE9BQU8sR0FBR0gsY0FBYyxDQUFDLEVBQUVHLFVBQVU7WUFDdkM7UUFDQSxLQUFLO1lBQU87Z0JBQ1YsT0FBTyxHQUFHRixXQUFXLENBQUMsRUFBRUUsVUFBVTtZQUNwQztRQUNBO1lBQVM7Z0JBQ1AsT0FBTztZQUNUO0lBQ0Y7QUFDRixFQUFFO0FBRUYsT0FBTyxNQUFNSSxxQkFBcUIsT0FDaENuRyxTQUNBd0UsU0FDQTRCLFFBQ0FDLFdBQW1CLFlBQVksRUFBRUM7SUFFakMsTUFBTXJHLFNBQVM7SUFDZixNQUFNLEVBQUNzQixTQUFTLEVBQUN6QyxRQUFRMkQsU0FBUyxFQUFDLEVBQUMsR0FBR3pDO0lBQ3ZDLE1BQU11RyxPQUFPN0wsT0FBT1osR0FBRyxDQUFDO0lBQ3hCLE1BQU0wTSxPQUFPOUwsT0FBT1osR0FBRyxDQUFDO0lBQ3hCLE1BQU11RCxTQUFTLEFBQUNnSixTQUFTSSxLQUFLLENBQUMsSUFBSyxDQUFDLEVBQUUsSUFBSTtJQUMzQyxNQUFNQyxjQUFjdEoscUJBQXFCQztJQUN6QyxJQUFJc0osdUJBQStCUDtJQUNuQyxJQUFJUSx1QkFBK0JSO0lBQ25DLElBQUlTLGdCQUEyQjtRQUM3QkMsVUFBVVYsT0FBT3ZFLE1BQU07UUFDdkJ3RSxVQUFVaEo7UUFDVm1IO0lBQ0Y7SUFFQSxJQUFJO1FBQ0ZtQyx1QkFBdUIsTUFBTWxNLE1BQU0yTCxRQUNoQ1csTUFBTSxHQUNOQyxNQUFNLENBQUM7WUFDTkMsS0FBSztZQUNMQyxRQUFRWDtZQUNSWSxPQUFPWjtZQUNQYSxvQkFBb0I7UUFDdEIsR0FDQ0MsUUFBUSxDQUFDWCxhQUFhO1lBQUNZLFNBQVNkO1FBQUksR0FDcENlLFFBQVE7SUFDYixFQUFFLE9BQU0vRyxPQUFPO1FBQ2IsT0FBTzFGLFNBQVM7WUFDZG1GO1lBQ0FRLFVBQVV4RTtZQUNWeUUsUUFBUTtnQkFBQzJGO2dCQUFVN0I7WUFBTztZQUMxQjdELE9BQU85RixXQUFXMk0sVUFBVTtRQUM5QixHQUFHaEgsT0FBT1I7SUFDWjtJQUVBLElBQUk7UUFDRixNQUFNeUgsV0FBa0M7WUFDdENDLE1BQU1mO1lBQ05YLFFBQVE7WUFDUjJCLGFBQWF0QjtZQUNiLEdBQUlDLGFBQWEsQ0FBQyxDQUFDO1lBQ25CSixLQUFLdkIsaUJBQWlCbEMsV0FBVytCLFNBQVM2QixVQUFVO1FBQ3REO1FBQ0EsTUFBTXRLLE1BQU0wTDtJQUNkLEVBQUUsT0FBTWpILE9BQU87UUFDYixPQUFPMUYsU0FBUztZQUNkbUY7WUFDQVEsVUFBVXhFO1lBQ1Z5RSxRQUFRO2dCQUFDMkY7Z0JBQVU3QjtZQUFPO1lBQzFCN0QsT0FBTzlGLFdBQVcyTSxVQUFVO1FBQzlCLEdBQUdoSCxPQUFPUjtJQUNaO0lBRUEsSUFBSTtRQUNGLE1BQU0sQ0FBQzRILGVBQWVDLFlBQVlDLGVBQWUsR0FBRyxNQUFNQyxRQUFRaEcsR0FBRyxDQUFDO1lBQ3BFdEgsTUFBTWtNLHNCQUFzQm5KLFFBQVE7WUFDcEMvQyxNQUFNa00sc0JBQXNCcUIsS0FBSztZQUNqQ3ZOLE1BQU0yTCxRQUFRNUksUUFBUTtTQUN2QjtRQUNELE1BQU0sRUFBQ3lLLENBQUMsRUFBRUMsQ0FBQyxFQUFFQyxDQUFDLEVBQUMsR0FBR04sV0FBV08sUUFBUTtRQUNyQyxNQUFNQyxRQUFRO1lBQUNGO1lBQUdEO1lBQUdEO1NBQUUsQ0FBQy9LLEdBQUcsQ0FBQyxDQUFDeUQsUUFBVUEsTUFBTTJILFFBQVEsQ0FBQyxJQUFJQyxRQUFRLENBQUMsR0FBRyxNQUFNM0csSUFBSSxDQUFDO1FBQ2pGLE1BQU00RyxlQUFlbEwsa0JBQWtCd0ssZUFBZXZLLElBQUk7UUFFMURzSixnQkFBZ0I7WUFDZHdCO1lBQ0F2QixVQUFVSCxxQkFBcUI5RSxNQUFNO1lBQ3JDd0UsVUFBVWhKO1lBQ1Y2SixRQUFRVSxjQUFjVixNQUFNLElBQUk7WUFDaEMxQztZQUNBLEdBQUdnRSxZQUFZO1lBQ2ZDLGFBQWFiLGNBQWNhLFdBQVcsR0FBR25LLE9BQU9zSixjQUFjYSxXQUFXLElBQUl0SztZQUM3RW1KLFNBQVNkO1lBQ1RrQyxZQUFZZCxjQUFjZSxPQUFPLEdBQUcsR0FBR2YsY0FBY2UsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHeEs7WUFDckVnSixPQUFPUyxjQUFjVCxLQUFLLElBQUk7UUFDaEM7UUFFQSxNQUFNeUIsT0FBT2xPLE9BQU9aLEdBQUcsQ0FBQztRQUN4QixNQUFNK08sT0FBT25PLE9BQU9aLEdBQUcsQ0FBQztRQUN4QjhNLHVCQUF1QixNQUFNbk0sTUFBTWtNLHNCQUNoQ0ssTUFBTSxDQUFDO1lBQ05DLEtBQUs7WUFDTEMsUUFBUTBCO1lBQ1JFLFVBQVU7WUFDVjNCLE9BQU95QjtRQUNULEdBQ0N2QixRQUFRLENBQUNYLGFBQWE7WUFBQ1ksU0FBU3VCO1FBQUksR0FDcEN0QixRQUFRO0lBQ2IsRUFBRSxPQUFNL0csT0FBTztRQUNiLE9BQU8xRixTQUFTO1lBQ2RtRjtZQUNBUSxVQUFVeEU7WUFDVnlFLFFBQVE7Z0JBQUMyRjtnQkFBVTdCO1lBQU87WUFDMUI3RCxPQUFPOUYsV0FBVzJNLFVBQVU7UUFDOUIsR0FBR2hILE9BQU9SO0lBQ1o7SUFFQSxJQUFJO1FBQ0YsTUFBTStJLFdBQWtDO1lBQ3RDckIsTUFBTWQ7WUFDTlosUUFBUTtZQUNSMkIsYUFBYXRCO1lBQ2IsR0FBSUMsYUFBYSxDQUFDLENBQUM7WUFDbkJKLEtBQUt2QixpQkFBaUJsQyxXQUFXK0IsU0FBUzZCLFVBQVU7UUFDdEQ7UUFDQSxNQUFNdEssTUFBTWdOO0lBQ2QsRUFBRSxPQUFNdkksT0FBTztRQUNiLE9BQU8xRixTQUFTO1lBQ2RtRjtZQUNBUSxVQUFVeEU7WUFDVjBFLE9BQU85RixXQUFXMk0sVUFBVTtRQUM5QixHQUFHaEgsT0FBT1I7SUFDWjtJQUVBLE9BQU82RztBQUNULEVBQUU7QUFFRixPQUFPLE1BQU1tQyxXQUFXLENBQ3RCaEosU0FDQXRCLE9BQ0E0SDtJQUVBLE1BQU1yRyxTQUFTO0lBQ2YsTUFBTSxFQUFDc0IsU0FBUyxFQUFDekMsUUFBUTJELFNBQVMsRUFBQyxFQUFDLEdBQUd6QztJQUN2QyxNQUFNLEVBQUN3RSxPQUFPLEVBQUV5RSxXQUFXLEVBQUU3QyxNQUFNLEVBQUVDLFFBQVEsRUFBRXhKLE1BQU0sRUFBRUMsUUFBUSxFQUFFdUIsVUFBVSxRQUFRLEVBQUMsR0FBR0s7SUFFdkYsT0FBT3lILG1CQUFtQm5HLFNBQVN3RSxTQUFTNEIsUUFBUUMsVUFBVUMsV0FDM0RwRixJQUFJLENBQUMsQ0FBQ2dJO1FBQ0wsTUFBTUMsU0FBb0I7WUFDeEIsR0FBR0QsWUFBWTtZQUNmRSxNQUFNNUU7WUFDTnlFO1lBQ0E1QztZQUNBaEksU0FBU0Qsc0JBQXNCQztZQUMvQlMsUUFBUTJEO1FBQ1Y7UUFFQSxPQUFPcEgsUUFBbUIyRSxTQUFTLFVBQVVtSixRQUMxQ2pJLElBQUksQ0FBQyxDQUFDbUksYUFBMEJDLGFBQWF0SixTQUFTO2dCQUNyRHdFO2dCQUNBM0gsUUFBUUEsVUFBVTRGO2dCQUNsQjNGLFVBQVV6QyxZQUFZeUMsWUFBWSxTQUFTLElBQUkwQixXQUFXO2dCQUMxRGEsTUFBTTtZQUNSLEdBQUc2QixJQUFJLENBQUMsSUFBTW1JO0lBQ2xCLEdBQ0M5SSxLQUFLLENBQUMsQ0FBQ0MsUUFBaUIxRixTQUFTO1lBQ2hDbUY7WUFDQVEsVUFBVXhFO1lBQ1YwRSxPQUFPOUYsV0FBVzBPLFlBQVk7UUFDaEMsR0FBRy9JLE9BQU9SO0FBQ2QsRUFBRTtBQUVGLE9BQU8sTUFBTXNKLGVBQWUsT0FBT3RKLFNBQXFCd0o7SUFDdEQsTUFBTXZKLFNBQVM7SUFDZixNQUFNLEVBQUNhLFlBQVksRUFBRVMsU0FBUyxFQUFDekMsUUFBUTJELFNBQVMsRUFBQyxFQUFDLEdBQUd6QztJQUNyRCxNQUFNLEVBQUN3RSxPQUFPLEVBQUUzSCxNQUFNLEVBQUVDLFFBQVEsRUFBQyxHQUFHME07SUFDcEMsTUFBTUMsTUFBTXhMLEtBQUt3TCxHQUFHO0lBQ3BCLE1BQU1DLFNBQVN6UCxXQUFXLENBQUMsZUFBZSxFQUFFdUssUUFBUSxDQUFDLEVBQUUzSCxPQUFPLENBQUMsRUFBRTRGLFdBQVc7SUFDNUUsTUFBTWhCLGlCQUFxQ3RILFVBQVUyQyxVQUFVMEIsV0FBVztJQUMxRSxNQUFNbUwsZUFBZXZQLFFBQVF5QztJQUM3QixNQUFNK00sWUFBWTVPLFNBQVN5RyxnQkFBZ0I7UUFBQzJILE1BQU1PO0lBQVk7SUFDOUQsTUFBTWxGLGdCQUFnQnJLLFFBQVFvSztJQUM5QixNQUFNcUYsWUFBWSxDQUFDLE9BQU8sRUFBRXBGLGVBQWU7SUFFM0MsTUFBTXFGLE9BQXNCO1FBQzFCQyxPQUFPSDtRQUNQUixNQUFNTTtRQUNOTSxLQUFLSDtRQUNMSSxPQUFPUjtRQUNQM007UUFDQXVDLE1BQU07SUFDUjtJQUVBLElBQUd1SyxXQUFXO1FBQ1osT0FBT3pPLE1BQU0yRixjQUFjM0QsVUFBVSxDQUFDdkMsTUFBTXlCLFNBQVMsRUFBRTZOLElBQUksQ0FBQ0osTUFBTTtZQUFDSyxXQUFXO1FBQUksR0FDL0VqSixJQUFJLENBQUMsQ0FBQ2tKLFdBQWFqUCxNQUFNMkYsY0FBYzNELFVBQVUsQ0FBQ3ZDLE1BQU15QixTQUFTLEVBQUVnTyxRQUFRLENBQUNELFdBQzVFN0osS0FBSyxDQUFDLENBQUNDLFFBQWlCMUYsU0FBUztnQkFDaENtRjtnQkFDQVEsVUFBVXhFO2dCQUNWeUUsUUFBUTtvQkFDTm9KO29CQUNBRDtvQkFDQXJGO29CQUNBb0Y7b0JBQ0EvTTtvQkFDQUM7Z0JBQ0Y7Z0JBQ0E2RCxPQUFPOUYsV0FBVytGLGNBQWM7WUFDbEMsR0FBR0osT0FBT1I7SUFDZDtJQUVBLE9BQU87QUFDVCxFQUFFO0FBRUYsT0FBTyxNQUFNc0ssY0FBYyxPQUN6QnRLLFNBQ0F0QixPQUNBNEg7SUFFQSxNQUFNckcsU0FBUztJQUNmLE1BQU0sRUFBQ3NCLFNBQVMsRUFBQ3pDLFFBQVEyRCxTQUFTLEVBQUMsRUFBQyxHQUFHekM7SUFDdkMsTUFBTSxFQUNKdUssU0FBUyxFQUFFLEVBQ1huRSxRQUFRb0UsV0FBVyxFQUNuQnZCLFdBQVcsRUFDWHpFLE9BQU8sRUFDUDNILE1BQU0sRUFDTkMsUUFBUSxFQUNSdUosUUFBUSxFQUNSaEksT0FBTyxFQUNQb00sTUFBTSxFQUFFLEVBQ1QsR0FBRy9MO0lBRUosTUFBTStGLGdCQUFnQkQsV0FBV3ZLLFdBQVcsQ0FBQyxNQUFNLEVBQUV3SSxXQUFXO0lBQ2hFLE1BQU1rSCxlQUFldlAsUUFBUXlDO0lBQzdCLE1BQU00RSxpQkFBcUN0SCxVQUFVMkMsVUFBVSxJQUFJMEIsV0FBVztJQUM5RSxNQUFNa00sZUFBMEI7UUFDOUJ6QjtRQUNBekUsU0FBU0M7UUFDVHBHLFNBQVNELHNCQUFzQkM7UUFDL0JTLFFBQVEyRDtJQUNWO0lBRUEsSUFBRzhILFVBQVVDLGFBQWE7UUFDeEIsSUFBSXBFLFNBQWlCb0U7UUFFckIsSUFBR0QsUUFBUTtZQUNULE1BQU1JLGVBQWVKLE9BQU9LLE1BQU0sQ0FBQ0wsT0FBT00sT0FBTyxDQUFDLE9BQU87WUFDekR6RSxTQUFTMEUsT0FBTzNMLElBQUksQ0FBQ3dMLGNBQWM7UUFDckM7UUFFQSxJQUFJSSxrQkFBa0IxRTtRQUV0QixJQUFHLENBQUNBLFVBQVU7WUFDWixNQUFNLEVBQUMyRSxrQkFBa0IsRUFBQyxHQUFHLE1BQU0sTUFBTSxDQUFDO1lBQzFDLE1BQU0sRUFBQ0MsSUFBSSxFQUFDLEdBQUcsTUFBTUQsbUJBQW1CNUU7WUFDeEMyRSxrQkFBa0JFO1FBQ3BCO1FBRUEsTUFBTUMsWUFBdUI7WUFDM0IsR0FBR1IsWUFBWTtZQUNmdEU7WUFDQUMsVUFBVTBFO1FBQ1o7UUFFQSxPQUFPL0IsU0FBU2hKLFNBQVNrTCxXQUFXNUUsV0FDakNwRixJQUFJLENBQUMsQ0FBQ3hDO1lBQ0wsSUFBR2lMLGdCQUFnQmxJLGdCQUFnQjtnQkFDakMsTUFBTStILFlBQTJCO29CQUMvQmhGLFNBQVNDO29CQUNUNUgsUUFBUThNO29CQUNSN00sVUFBVTJFO29CQUNWcEMsTUFBTTtnQkFDUjtnQkFDQSxPQUFPaUssYUFBYXRKLFNBQVN3SixXQUFXdEksSUFBSSxDQUFDLElBQU14QztZQUNyRDtZQUVBLE9BQU9BO1FBQ1QsR0FDQzZCLEtBQUssQ0FBQyxDQUFDQyxRQUFVMUYsU0FBUztnQkFDekJtRjtnQkFDQVEsVUFBVXhFO2dCQUNWMEUsT0FBTzlGLFdBQVcyTSxVQUFVO1lBQzlCLEdBQUdoSCxPQUFPUjtJQUNkLE9BQU8sSUFBR3lLLFFBQVEsSUFBSTtRQUNwQixJQUFJVTtRQUVKLE9BQU9wUixRQUFRMFEsS0FDWnZKLElBQUksQ0FBQyxDQUFDa0s7WUFDTCxJQUFHQSxJQUFJQyxNQUFNLEtBQUssS0FBSztnQkFDckIsT0FBT3RRLGFBQWE7b0JBQ2xCa0Y7b0JBQ0FRLFVBQVV4RTtvQkFDVjBFLE9BQU85RixXQUFXeVEsYUFBYTtnQkFDakMsR0FBR3RMO1lBQ0w7WUFFQW1MLGNBQWNDLElBQUlHLE9BQU8sQ0FBQ3pSLEdBQUcsQ0FBQztZQUU5QixPQUFPc1I7UUFDVCxHQUNDbEssSUFBSSxDQUFDLENBQUNrSyxNQUFRLEFBQUNBLElBQXFCaEYsTUFBTSxJQUMxQ2xGLElBQUksQ0FBQyxDQUFDa0Y7WUFDTCxNQUFNOEUsWUFBdUI7Z0JBQzNCLEdBQUdSLFlBQVk7Z0JBQ2Z0RTtnQkFDQUMsVUFBVThFO1lBQ1o7WUFFQSxPQUFPbkMsU0FBU2hKLFNBQVNrTCxXQUFXNUUsV0FDakNwRixJQUFJLENBQUMsQ0FBQ3hDO2dCQUNMLElBQUdpTCxnQkFBZ0JsSSxnQkFBZ0I7b0JBQ2pDLE1BQU0rSCxZQUEyQjt3QkFBQ2hGLFNBQVNDO3dCQUFlNUgsUUFBUThNO3dCQUFjN00sVUFBVTJFO3dCQUFnQnBDLE1BQU07b0JBQU87b0JBQ3ZILE9BQU9pSyxhQUFhdEosU0FBU3dKLFdBQVd0SSxJQUFJLENBQUMsSUFBTXhDO2dCQUNyRDtnQkFFQSxPQUFPQTtZQUNUO1FBQ0osR0FDQzZCLEtBQUssQ0FBQyxDQUFDQyxRQUFpQjFGLFNBQVM7Z0JBQ2hDbUY7Z0JBQ0FRLFVBQVV4RTtnQkFDVjBFLE9BQU87WUFDVCxHQUFHSCxPQUFPUjtJQUNkLE9BQU8sSUFBR3dFLFNBQVM7UUFDakIsTUFBTWdILFNBQVM7WUFDYixHQUFJdkMsZ0JBQWdCOUssWUFBWTtnQkFBQzhLO1lBQVcsSUFBSSxDQUFDLENBQUM7WUFDbEQsR0FBSTVLLFlBQVlGLFlBQVk7Z0JBQUNFLFNBQVNELHNCQUFzQkM7WUFBUSxJQUFJLENBQUMsQ0FBQztRQUM1RTtRQUVBLE9BQU81QyxXQUFzQnVFLFNBQVMsVUFBVXlFLGVBQWUrRztJQUNqRTtJQUVBLE9BQU87QUFDVCxFQUFFO0FBRUYsT0FBTyxNQUFNQyxjQUFjLE9BQU96TCxTQUFxQndFO0lBQ3JELE1BQU12RSxTQUFTO0lBQ2YsTUFBTSxFQUFDc0IsU0FBUyxFQUFDekMsUUFBUTJELFNBQVMsRUFBQyxFQUFDLEdBQUd6QztJQUN2QyxNQUFNeUUsZ0JBQWdCckssUUFBUW9LO0lBRTlCLElBQUk7UUFDRixNQUFNOUYsUUFBUSxNQUFNcEQsV0FBc0IwRSxTQUFTLFVBQVV5RSxlQUFlO1lBQzFFaUgsU0FBUztnQkFBQzlRLE1BQU15QixTQUFTO2FBQUM7WUFDMUJzUCxXQUFXO1FBQ2I7UUFFQSxJQUFHLENBQUNqTixPQUFPO1lBQ1QsT0FBTztRQUNUO1FBRUEsa0JBQWtCO1FBQ2xCLE1BQU0sRUFBQzBLLE1BQU1yRCxRQUFRLEVBQUMsR0FBR3JIO1FBQ3pCLE1BQU1nQyxTQUFvQztZQUN4Q3NGLFFBQVE7WUFDUjRGLFFBQVE7Z0JBQ05DLFNBQVM7b0JBQ1A7d0JBQUMzRixLQUFLLENBQUMsTUFBTSxFQUFFekQsVUFBVSxRQUFRLEVBQUVzRCxTQUFTLElBQUksQ0FBQztvQkFBQTtvQkFDakQ7d0JBQUNHLEtBQUssQ0FBQyxNQUFNLEVBQUV6RCxVQUFVLFFBQVEsRUFBRXNELFNBQVMsSUFBSSxDQUFDO29CQUFBO2lCQUNsRDtnQkFDRCtGLE9BQU87WUFDVDtRQUNGO1FBRUEsT0FBT2pRLGFBQWE2RSxRQUFRUSxJQUFJLENBQUMsSUFBTXhDO0lBQ3pDLEVBQUUsT0FBTThCLE9BQU87UUFDYixPQUFPMUYsU0FBUztZQUNkbUY7WUFDQVEsVUFBVXhFO1lBQ1Z5RSxRQUFRO2dCQUFDOEQ7WUFBTztZQUNoQjdELE9BQU85RixXQUFXK0YsY0FBYztRQUNsQyxHQUFHSixPQUFPUjtJQUNaO0FBQ0YsRUFBRSJ9
@@ -12,6 +12,7 @@ export * from './email.js';
12
12
  export * from './files.js';
13
13
  export * from './flags.js';
14
14
  export * from './groups.js';
15
+ export * from './higgsfield.js';
15
16
  export * from './images.js';
16
17
  export * from './ios.js';
17
18
  export * from './locations.js';
@@ -30,3 +31,7 @@ export * from './subscriptions.js';
30
31
  export * from './tags.js';
31
32
  export * from './users.js';
32
33
  export * from './videos.js';
34
+ export * from './imageGeneration.js';
35
+ export * from './contentGeneration.js';
36
+ export * from './videoGeneration.js';
37
+ export * from './geminiVideo.js';
@@ -11,6 +11,7 @@ export * from './email.js';
11
11
  export * from './files.js';
12
12
  export * from './flags.js';
13
13
  export * from './groups.js';
14
+ export * from './higgsfield.js';
14
15
  export * from './images.js';
15
16
  export * from './ios.js';
16
17
  export * from './locations.js';
@@ -29,5 +30,9 @@ export * from './subscriptions.js';
29
30
  export * from './tags.js';
30
31
  export * from './users.js';
31
32
  export * from './videos.js';
33
+ export * from './imageGeneration.js';
34
+ export * from './contentGeneration.js';
35
+ export * from './videoGeneration.js';
36
+ export * from './geminiVideo.js';
32
37
 
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50Ly5jb2RleC13b3JrdHJlZXMvcmVha3Rvci1waGFudGF6ZS1jaGF0L3BhY2thZ2VzL3JlYWt0b3Ivc3JjL2FjdGlvbnMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIGlzIHN1YmplY3QgdG8gdGhlIGFjY29tcGFueWluZyBjb21tZXJjaWFsIExJQ0VOU0UuXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vYXBwcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2FuYWx5dGljcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2Nvbm5lY3Rpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29udmVyc2F0aW9ucy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NybS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2R5bmFtb2RiLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZW1haWwuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9maWxlcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2ZsYWdzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZ3JvdXBzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vaW1hZ2VzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vaW9zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbG9jYXRpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9ub3RpZmljYXRpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcGF5bWVudHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9wb3N0cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3BlcnNvbmFzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVhY3Rpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcnVtLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vczMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zZWFyY2guanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zbXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zdGF0aXN0aWNzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc3Vic2NyaXB0aW9ucy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3RhZ3MuanMnO1xuZXhwb3J0ICogZnJvbSAnLi91c2Vycy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3ZpZGVvcy5qcyc7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsY0FBYyxZQUFZO0FBQzFCLGNBQWMsaUJBQWlCO0FBQy9CLGNBQWMsbUJBQW1CO0FBQ2pDLGNBQWMscUJBQXFCO0FBQ25DLGNBQWMsV0FBVztBQUN6QixjQUFjLGdCQUFnQjtBQUM5QixjQUFjLGFBQWE7QUFDM0IsY0FBYyxhQUFhO0FBQzNCLGNBQWMsYUFBYTtBQUMzQixjQUFjLGNBQWM7QUFDNUIsY0FBYyxjQUFjO0FBQzVCLGNBQWMsV0FBVztBQUN6QixjQUFjLGlCQUFpQjtBQUMvQixjQUFjLGdCQUFnQjtBQUM5QixjQUFjLHFCQUFxQjtBQUNuQyxjQUFjLGdCQUFnQjtBQUM5QixjQUFjLGFBQWE7QUFDM0IsY0FBYyxnQkFBZ0I7QUFDOUIsY0FBYyxpQkFBaUI7QUFDL0IsY0FBYyxXQUFXO0FBQ3pCLGNBQWMsVUFBVTtBQUN4QixjQUFjLGNBQWM7QUFDNUIsY0FBYyxXQUFXO0FBQ3pCLGNBQWMsa0JBQWtCO0FBQ2hDLGNBQWMscUJBQXFCO0FBQ25DLGNBQWMsWUFBWTtBQUMxQixjQUFjLGFBQWE7QUFDM0IsY0FBYyxjQUFjIn0=
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2UgaXMgc3ViamVjdCB0byB0aGUgYWNjb21wYW55aW5nIGNvbW1lcmNpYWwgTElDRU5TRS5cbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9hcHBzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYW5hbHl0aWNzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29ubmVjdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb252ZXJzYXRpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY3JtLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZHluYW1vZGIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9lbWFpbC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2ZpbGVzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZmxhZ3MuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9ncm91cHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9oaWdnc2ZpZWxkLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vaW1hZ2VzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vaW9zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbG9jYXRpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9ub3RpZmljYXRpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcGF5bWVudHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9wb3N0cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3BlcnNvbmFzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVhY3Rpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcnVtLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vczMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zZWFyY2guanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zbXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zdGF0aXN0aWNzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc3Vic2NyaXB0aW9ucy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3RhZ3MuanMnO1xuZXhwb3J0ICogZnJvbSAnLi91c2Vycy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3ZpZGVvcy5qcyc7XG5cbmV4cG9ydCAqIGZyb20gJy4vaW1hZ2VHZW5lcmF0aW9uLmpzJztcblxuZXhwb3J0ICogZnJvbSAnLi9jb250ZW50R2VuZXJhdGlvbi5qcyc7XG5cbmV4cG9ydCAqIGZyb20gJy4vdmlkZW9HZW5lcmF0aW9uLmpzJztcblxuZXhwb3J0ICogZnJvbSAnLi9nZW1pbmlWaWRlby5qcyc7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsY0FBYyxZQUFZO0FBQzFCLGNBQWMsaUJBQWlCO0FBQy9CLGNBQWMsbUJBQW1CO0FBQ2pDLGNBQWMscUJBQXFCO0FBQ25DLGNBQWMsV0FBVztBQUN6QixjQUFjLGdCQUFnQjtBQUM5QixjQUFjLGFBQWE7QUFDM0IsY0FBYyxhQUFhO0FBQzNCLGNBQWMsYUFBYTtBQUMzQixjQUFjLGNBQWM7QUFDNUIsY0FBYyxrQkFBa0I7QUFDaEMsY0FBYyxjQUFjO0FBQzVCLGNBQWMsV0FBVztBQUN6QixjQUFjLGlCQUFpQjtBQUMvQixjQUFjLGdCQUFnQjtBQUM5QixjQUFjLHFCQUFxQjtBQUNuQyxjQUFjLGdCQUFnQjtBQUM5QixjQUFjLGFBQWE7QUFDM0IsY0FBYyxnQkFBZ0I7QUFDOUIsY0FBYyxpQkFBaUI7QUFDL0IsY0FBYyxXQUFXO0FBQ3pCLGNBQWMsVUFBVTtBQUN4QixjQUFjLGNBQWM7QUFDNUIsY0FBYyxXQUFXO0FBQ3pCLGNBQWMsa0JBQWtCO0FBQ2hDLGNBQWMscUJBQXFCO0FBQ25DLGNBQWMsWUFBWTtBQUMxQixjQUFjLGFBQWE7QUFDM0IsY0FBYyxjQUFjO0FBRTVCLGNBQWMsdUJBQXVCO0FBRXJDLGNBQWMseUJBQXlCO0FBRXZDLGNBQWMsdUJBQXVCO0FBRXJDLGNBQWMsbUJBQW1CIn0=