sonamu 0.7.53 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. package/dist/api/config.d.ts +9 -1
  2. package/dist/api/config.d.ts.map +1 -1
  3. package/dist/api/config.js +1 -1
  4. package/dist/api/sonamu.d.ts +21 -1
  5. package/dist/api/sonamu.d.ts.map +1 -1
  6. package/dist/api/sonamu.js +159 -65
  7. package/dist/auth/plugins/entity-definitions/anonymous.d.ts +10 -0
  8. package/dist/auth/plugins/entity-definitions/anonymous.d.ts.map +1 -0
  9. package/dist/auth/plugins/entity-definitions/anonymous.js +23 -0
  10. package/dist/auth/plugins/entity-definitions/api-key.d.ts +9 -0
  11. package/dist/auth/plugins/entity-definitions/api-key.d.ts.map +1 -0
  12. package/dist/auth/plugins/entity-definitions/api-key.js +199 -0
  13. package/dist/auth/plugins/entity-definitions/index.d.ts +6 -0
  14. package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
  15. package/dist/auth/plugins/entity-definitions/index.js +20 -2
  16. package/dist/auth/plugins/entity-definitions/jwt.d.ts +9 -0
  17. package/dist/auth/plugins/entity-definitions/jwt.d.ts.map +1 -0
  18. package/dist/auth/plugins/entity-definitions/jwt.js +67 -0
  19. package/dist/auth/plugins/entity-definitions/organization.d.ts +9 -0
  20. package/dist/auth/plugins/entity-definitions/organization.d.ts.map +1 -0
  21. package/dist/auth/plugins/entity-definitions/organization.js +424 -0
  22. package/dist/auth/plugins/entity-definitions/passkey.d.ts +10 -0
  23. package/dist/auth/plugins/entity-definitions/passkey.d.ts.map +1 -0
  24. package/dist/auth/plugins/entity-definitions/passkey.js +129 -0
  25. package/dist/auth/plugins/entity-definitions/sso.d.ts +10 -0
  26. package/dist/auth/plugins/entity-definitions/sso.d.ts.map +1 -0
  27. package/dist/auth/plugins/entity-definitions/sso.js +110 -0
  28. package/dist/auth/plugins/entity-definitions/types.d.ts +1 -1
  29. package/dist/auth/plugins/entity-definitions/types.d.ts.map +1 -1
  30. package/dist/auth/plugins/entity-definitions/types.js +1 -1
  31. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
  32. package/dist/auth/plugins/wrappers/admin.js +2 -4
  33. package/dist/auth/plugins/wrappers/anonymous.d.ts +18 -0
  34. package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -0
  35. package/dist/auth/plugins/wrappers/anonymous.js +26 -0
  36. package/dist/auth/plugins/wrappers/api-key.d.ts +18 -0
  37. package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -0
  38. package/dist/auth/plugins/wrappers/api-key.js +38 -0
  39. package/dist/auth/plugins/wrappers/index.d.ts +6 -0
  40. package/dist/auth/plugins/wrappers/index.d.ts.map +1 -1
  41. package/dist/auth/plugins/wrappers/index.js +7 -1
  42. package/dist/auth/plugins/wrappers/jwt.d.ts +18 -0
  43. package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -0
  44. package/dist/auth/plugins/wrappers/jwt.js +30 -0
  45. package/dist/auth/plugins/wrappers/organization.d.ts +18 -0
  46. package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -0
  47. package/dist/auth/plugins/wrappers/organization.js +67 -0
  48. package/dist/auth/plugins/wrappers/passkey.d.ts +18 -0
  49. package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -0
  50. package/dist/auth/plugins/wrappers/passkey.js +32 -0
  51. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
  52. package/dist/auth/plugins/wrappers/phone-number.js +2 -4
  53. package/dist/auth/plugins/wrappers/sso.d.ts +853 -0
  54. package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -0
  55. package/dist/auth/plugins/wrappers/sso.js +36 -0
  56. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
  57. package/dist/auth/plugins/wrappers/two-factor.js +2 -4
  58. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
  59. package/dist/auth/plugins/wrappers/username.js +2 -4
  60. package/dist/bin/build-config.d.ts +2 -2
  61. package/dist/bin/build-config.js +6 -7
  62. package/dist/bin/cli.js +417 -32
  63. package/dist/bin/fixture.d.ts +27 -0
  64. package/dist/bin/fixture.d.ts.map +1 -0
  65. package/dist/bin/fixture.js +245 -0
  66. package/dist/cache/decorator.d.ts +4 -3
  67. package/dist/cache/decorator.d.ts.map +1 -1
  68. package/dist/cache/decorator.js +5 -4
  69. package/dist/cone/cone-generator.d.ts +33 -0
  70. package/dist/cone/cone-generator.d.ts.map +1 -0
  71. package/dist/cone/cone-generator.js +286 -0
  72. package/dist/database/_batch_update.d.ts.map +1 -1
  73. package/dist/database/_batch_update.js +16 -2
  74. package/dist/database/puri-subset.test-d.js +1 -1
  75. package/dist/database/puri-subset.types.d.ts +1 -1
  76. package/dist/database/puri-subset.types.d.ts.map +1 -1
  77. package/dist/database/puri-subset.types.js +1 -1
  78. package/dist/database/puri.d.ts +4 -0
  79. package/dist/database/puri.d.ts.map +1 -1
  80. package/dist/database/puri.js +20 -2
  81. package/dist/database/upsert-builder.d.ts.map +1 -1
  82. package/dist/database/upsert-builder.js +19 -3
  83. package/dist/dict/en.d.ts +15 -0
  84. package/dist/dict/en.d.ts.map +1 -1
  85. package/dist/dict/en.js +2 -1
  86. package/dist/dict/ko.d.ts +15 -0
  87. package/dist/dict/ko.d.ts.map +1 -1
  88. package/dist/dict/ko.js +2 -1
  89. package/dist/dict/rc-keys.d.ts +28 -0
  90. package/dist/dict/rc-keys.d.ts.map +1 -1
  91. package/dist/dict/rc-keys.js +31 -1
  92. package/dist/dict/sd.d.ts.map +1 -1
  93. package/dist/dict/sd.js +20 -4
  94. package/dist/entity/entity-manager.d.ts +298 -2
  95. package/dist/entity/entity-manager.d.ts.map +1 -1
  96. package/dist/entity/entity-manager.js +4 -1
  97. package/dist/entity/entity-template-cone.d.ts +14 -0
  98. package/dist/entity/entity-template-cone.d.ts.map +1 -0
  99. package/dist/entity/entity-template-cone.js +222 -0
  100. package/dist/entity/entity.d.ts +47 -2
  101. package/dist/entity/entity.d.ts.map +1 -1
  102. package/dist/entity/entity.js +161 -14
  103. package/dist/ssr/renderer.js +3 -3
  104. package/dist/syncer/api-parser.js +12 -1
  105. package/dist/syncer/checksum.d.ts +0 -14
  106. package/dist/syncer/checksum.d.ts.map +1 -1
  107. package/dist/syncer/checksum.js +1 -23
  108. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  109. package/dist/syncer/syncer-actions.js +8 -2
  110. package/dist/syncer/syncer.d.ts +1 -1
  111. package/dist/syncer/syncer.d.ts.map +1 -1
  112. package/dist/syncer/syncer.js +17 -10
  113. package/dist/tasks/workflow-manager.d.ts +13 -1
  114. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  115. package/dist/tasks/workflow-manager.js +18 -1
  116. package/dist/template/entity-converter.js +4 -4
  117. package/dist/template/helpers.d.ts +10 -0
  118. package/dist/template/helpers.d.ts.map +1 -1
  119. package/dist/template/helpers.js +48 -1
  120. package/dist/template/implementations/entry-server.template.d.ts +1 -1
  121. package/dist/template/implementations/entry-server.template.js +7 -2
  122. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  123. package/dist/template/implementations/generated.template.js +5 -1
  124. package/dist/template/implementations/generated_http.template.d.ts +1 -0
  125. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  126. package/dist/template/implementations/generated_http.template.js +6 -2
  127. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  128. package/dist/template/implementations/generated_sso.template.js +29 -8
  129. package/dist/template/implementations/queries.template.d.ts.map +1 -1
  130. package/dist/template/implementations/queries.template.js +9 -1
  131. package/dist/template/implementations/sd.template.d.ts +1 -1
  132. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  133. package/dist/template/implementations/sd.template.js +28 -4
  134. package/dist/template/implementations/services.template.d.ts.map +1 -1
  135. package/dist/template/implementations/services.template.js +12 -12
  136. package/dist/template/implementations/view_form.template.d.ts +11 -7
  137. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  138. package/dist/template/implementations/view_form.template.js +97 -87
  139. package/dist/template/implementations/view_list.template.d.ts +3 -3
  140. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  141. package/dist/template/implementations/view_list.template.js +115 -109
  142. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  143. package/dist/template/implementations/view_search_input.template.js +18 -14
  144. package/dist/template/zod-converter.d.ts.map +1 -1
  145. package/dist/template/zod-converter.js +95 -7
  146. package/dist/testing/_relation-graph.js +1 -1
  147. package/dist/testing/data-explorer.d.ts +61 -0
  148. package/dist/testing/data-explorer.d.ts.map +1 -0
  149. package/dist/testing/data-explorer.js +274 -0
  150. package/dist/testing/faker-mappings.d.ts +20 -0
  151. package/dist/testing/faker-mappings.d.ts.map +1 -0
  152. package/dist/testing/faker-mappings.js +421 -0
  153. package/dist/testing/fixture-generator.d.ts +161 -0
  154. package/dist/testing/fixture-generator.d.ts.map +1 -0
  155. package/dist/testing/fixture-generator.js +954 -0
  156. package/dist/testing/fixture-manager.d.ts +6 -1
  157. package/dist/testing/fixture-manager.d.ts.map +1 -1
  158. package/dist/testing/fixture-manager.js +72 -4
  159. package/dist/testing/index.d.ts +3 -0
  160. package/dist/testing/index.d.ts.map +1 -1
  161. package/dist/testing/index.js +4 -1
  162. package/dist/types/types.d.ts +1520 -26
  163. package/dist/types/types.d.ts.map +1 -1
  164. package/dist/types/types.js +136 -22
  165. package/dist/ui/ai-client.d.ts.map +1 -1
  166. package/dist/ui/ai-client.js +9 -4
  167. package/dist/ui/api.d.ts.map +1 -1
  168. package/dist/ui/api.js +303 -24
  169. package/dist/ui-web/assets/index-CsUr-_pV.js +254 -0
  170. package/dist/ui-web/assets/index-T42zzs1K.css +1 -0
  171. package/dist/ui-web/index.html +2 -2
  172. package/dist/utils/fs-utils.d.ts +2 -1
  173. package/dist/utils/fs-utils.d.ts.map +1 -1
  174. package/dist/utils/fs-utils.js +14 -3
  175. package/package.json +19 -11
  176. package/src/api/config.ts +12 -1
  177. package/src/api/sonamu.ts +179 -65
  178. package/src/auth/plugins/entity-definitions/anonymous.ts +17 -0
  179. package/src/auth/plugins/entity-definitions/api-key.ts +93 -0
  180. package/src/auth/plugins/entity-definitions/index.ts +18 -0
  181. package/src/auth/plugins/entity-definitions/jwt.ts +35 -0
  182. package/src/auth/plugins/entity-definitions/organization.ts +215 -0
  183. package/src/auth/plugins/entity-definitions/passkey.ts +64 -0
  184. package/src/auth/plugins/entity-definitions/sso.ts +62 -0
  185. package/src/auth/plugins/entity-definitions/types.ts +11 -1
  186. package/src/auth/plugins/wrappers/admin.ts +1 -3
  187. package/src/auth/plugins/wrappers/anonymous.ts +30 -0
  188. package/src/auth/plugins/wrappers/api-key.ts +42 -0
  189. package/src/auth/plugins/wrappers/index.ts +6 -0
  190. package/src/auth/plugins/wrappers/jwt.ts +34 -0
  191. package/src/auth/plugins/wrappers/organization.ts +73 -0
  192. package/src/auth/plugins/wrappers/passkey.ts +36 -0
  193. package/src/auth/plugins/wrappers/phone-number.ts +1 -3
  194. package/src/auth/plugins/wrappers/sso.ts +40 -0
  195. package/src/auth/plugins/wrappers/two-factor.ts +1 -3
  196. package/src/auth/plugins/wrappers/username.ts +1 -3
  197. package/src/bin/build-config.ts +6 -6
  198. package/src/bin/cli.ts +452 -31
  199. package/src/bin/fixture.ts +302 -0
  200. package/src/cache/decorator.ts +4 -3
  201. package/src/cone/cone-generator.ts +363 -0
  202. package/src/database/_batch_update.ts +11 -0
  203. package/src/database/puri-subset.test-d.ts +13 -13
  204. package/src/database/puri-subset.types.ts +1 -1
  205. package/src/database/puri.ts +43 -1
  206. package/src/database/upsert-builder.ts +16 -2
  207. package/src/dict/en.ts +1 -0
  208. package/src/dict/ko.ts +1 -0
  209. package/src/dict/rc-keys.ts +32 -0
  210. package/src/dict/sd.ts +23 -3
  211. package/src/entity/entity-manager.ts +4 -0
  212. package/src/entity/entity-template-cone.ts +298 -0
  213. package/src/entity/entity.ts +189 -13
  214. package/src/shared/app.shared.ts.txt +5 -0
  215. package/src/shared/web.shared.ts.txt +9 -5
  216. package/src/skills/project/README.md +21 -0
  217. package/src/skills/project/architecture.md +373 -0
  218. package/src/skills/project/business-logic.md +270 -0
  219. package/src/skills/project/requirements.md +160 -0
  220. package/src/skills/sonamu/SKILL.md +168 -3
  221. package/src/skills/sonamu/api.md +102 -0
  222. package/src/skills/sonamu/database.md +220 -1
  223. package/src/skills/sonamu/entity-relations.md +89 -1
  224. package/src/skills/sonamu/fixture-cli.md +501 -0
  225. package/src/skills/sonamu/frontend.md +214 -0
  226. package/src/skills/sonamu/i18n.md +95 -0
  227. package/src/skills/sonamu/model.md +153 -0
  228. package/src/skills/sonamu/project-init.md +178 -8
  229. package/src/skills/sonamu/scaffolding.md +112 -0
  230. package/src/skills/sonamu/subset.md +9 -3
  231. package/src/skills/sonamu/testing.md +287 -2
  232. package/src/skills/sonamu/workflow.md +70 -5
  233. package/src/ssr/renderer.ts +2 -2
  234. package/src/syncer/api-parser.ts +12 -0
  235. package/src/syncer/checksum.ts +0 -38
  236. package/src/syncer/syncer-actions.ts +7 -1
  237. package/src/syncer/syncer.ts +16 -5
  238. package/src/tasks/workflow-manager.ts +29 -8
  239. package/src/template/entity-converter.ts +3 -3
  240. package/src/template/helpers.ts +49 -0
  241. package/src/template/implementations/entry-server.template.ts +1 -1
  242. package/src/template/implementations/generated.template.ts +4 -0
  243. package/src/template/implementations/generated_http.template.ts +1 -0
  244. package/src/template/implementations/generated_sso.template.ts +40 -11
  245. package/src/template/implementations/queries.template.ts +8 -0
  246. package/src/template/implementations/sd.template.ts +22 -3
  247. package/src/template/implementations/services.template.ts +11 -10
  248. package/src/template/implementations/view_form.template.ts +111 -101
  249. package/src/template/implementations/view_list.template.ts +120 -119
  250. package/src/template/implementations/view_search_input.template.ts +17 -13
  251. package/src/template/zod-converter.ts +103 -6
  252. package/src/testing/_relation-graph.ts +1 -1
  253. package/src/testing/data-explorer.ts +427 -0
  254. package/src/testing/faker-mappings.ts +434 -0
  255. package/src/testing/fixture-generator.ts +1166 -0
  256. package/src/testing/fixture-manager.ts +91 -6
  257. package/src/testing/index.ts +3 -0
  258. package/src/types/types.ts +222 -26
  259. package/src/ui/ai-client.ts +9 -1
  260. package/src/ui/api.ts +429 -23
  261. package/src/utils/fs-utils.ts +14 -1
  262. package/dist/template/implementations/view_enums_select.template.d.ts +0 -17
  263. package/dist/template/implementations/view_enums_select.template.d.ts.map +0 -1
  264. package/dist/template/implementations/view_enums_select.template.js +0 -62
  265. package/dist/template/implementations/view_id_async_select.template.d.ts +0 -17
  266. package/dist/template/implementations/view_id_async_select.template.d.ts.map +0 -1
  267. package/dist/template/implementations/view_id_async_select.template.js +0 -125
  268. package/dist/ui-web/assets/index-Bd_2AkLb.css +0 -1
  269. package/dist/ui-web/assets/index-BpSbhQWo.js +0 -225
  270. package/src/template/implementations/view_enums_select.template.ts +0 -65
  271. package/src/template/implementations/view_id_async_select.template.ts +0 -139
@@ -5,9 +5,10 @@ import fs from "node:fs/promises";
5
5
  import mime, { lookup as mimeLookup } from "mime-types";
6
6
  import os from "os";
7
7
  import path from "path";
8
- import { BASE_FIELD_MAPPINGS, convertFastifyHeadersToStandard, createMockSSEFactory, DB, isDaemonServer, merge } from "../index.js";
8
+ import { BASE_FIELD_MAPPINGS, convertFastifyHeadersToStandard, createMockSSEFactory, DB, isDaemonServer, merge, NotFoundException } from "../index.js";
9
9
  import { applyCacheHeaders, CachePresets } from "../cache-control/cache-control.js";
10
10
  import { toFastifyCompressOption } from "../compress/compress.js";
11
+ import { SD } from "../dict/sd.js";
11
12
  import { Naite } from "../naite/naite.js";
12
13
  import { BufferedFile } from "../storage/buffered-file.js";
13
14
  import { UploadedFile } from "../storage/uploaded-file.js";
@@ -275,7 +276,6 @@ class SonamuClass {
275
276
  const { sonamuUIApiPlugin } = await import("../ui/api.js");
276
277
  server.register(sonamuUIApiPlugin);
277
278
  }
278
- // 로컬/프로덕션 환경 분기
279
279
  const webPath = path.join(this.appRootPath, "web");
280
280
  const hasWeb = await exists(webPath);
281
281
  // 전역 compress 옵션 계산 (route.compress: true일 때 사용)
@@ -293,9 +293,13 @@ class SonamuClass {
293
293
  customTypes: pluginCompress.customTypes
294
294
  } : undefined;
295
295
  if (isLocal()) {
296
- // 로컬 개발 환경: Vite Dev Server + 통합 핸들러
297
- if (hasWeb) {
298
- await this.setupViteDevServer(server, webPath, config, globalCompressOptions);
296
+ // 로컬 개발 환경: catch-all로 API를 동적 매칭하여 HMR을 지원합니다.
297
+ // SONAMU_DISABLE_INTEGRATED_WEB=yes로 설정하면 dev_api 모드에서 Vite 통합을 비활성화할 수 있습니다.
298
+ const disableIntegratedWeb = process.env.SONAMU_DISABLE_INTEGRATED_WEB === "yes";
299
+ if (hasWeb && !disableIntegratedWeb) {
300
+ await this.setupDevServerWithVite(server, webPath, config);
301
+ } else {
302
+ this.setupDevServer(server, config);
299
303
  }
300
304
  } else {
301
305
  // 프로덕션 환경: 개별 API 라우트 + 정적 파일 서빙
@@ -310,14 +314,70 @@ class SonamuClass {
310
314
  compress: toFastifyCompressOption(api.options.compress, globalCompressOptions)
311
315
  });
312
316
  }
313
- if (hasWeb) {
314
- await this.setupStaticWebServer(server, webPath, config, globalCompressOptions);
317
+ // 프로덕션에서는 web 소스(appRoot/web) 유무와 무관하게,
318
+ // api/web-dist 존재 여부를 setupStaticWebServer 내부에서 판단합니다.
319
+ await this.setupStaticWebServer(server, config, globalCompressOptions);
320
+ }
321
+ }
322
+ /**
323
+ * dev 모드 공통: catch-all에서 syncer.apis를 동적으로 탐색하여 API 요청을 처리합니다.
324
+ * server.route()로 개별 등록하면 handler가 고정되어 HMR이 동작하지 않으므로,
325
+ * 매 요청마다 syncer.apis를 조회하는 이 방식을 사용합니다.
326
+ *
327
+ * 요청이 /api(정확히는 this.config.api.route.prefix)로 시작하지 않는 경우라면 null을 반환하며 끝냅니다.
328
+ */ handleDevApiRequest(request, config) {
329
+ const url = this.getPathnameFromUrl(request.url);
330
+ const method = request.method;
331
+ if (!url.startsWith(this.config.api.route.prefix)) {
332
+ return null;
333
+ }
334
+ // syncer.apis의 path는 :param 형태를 포함할 수 있으므로 세그먼트 단위로 매칭합니다.
335
+ // 정규식 생성 방식은 path 문자열 내 특수문자(., +, (, [ 등)로 오작동할 수 있어 사용하지 않습니다.
336
+ const matchedApi = this.syncer.apis.find((api)=>{
337
+ if (this.syncer.models[api.modelName] === undefined) {
338
+ return false;
315
339
  }
340
+ const apiMethod = api.options.httpMethod ?? "GET";
341
+ if (apiMethod !== method) return false;
342
+ const fullPath = this.config.api.route.prefix + api.path;
343
+ return this.isPathPatternMatch(fullPath, url);
344
+ });
345
+ if (!matchedApi) {
346
+ throw new NotFoundException(SD("error.api.notFound"));
316
347
  }
348
+ return this.createApiHandler(matchedApi, config);
349
+ }
350
+ /**
351
+ * dev api 모드: Vite 없이 API 동적 라우팅만 제공합니다.
352
+ * HMR을 위해 catch-all에서 매 요청마다 syncer.apis를 조회합니다.
353
+ */ setupDevServer(server, config) {
354
+ server.route({
355
+ method: [
356
+ "GET",
357
+ "HEAD",
358
+ "POST",
359
+ "PUT",
360
+ "DELETE",
361
+ "PATCH"
362
+ ],
363
+ url: `${this.config.api.route.prefix}/*`,
364
+ handler: async (request, reply)=>{
365
+ const handler = this.handleDevApiRequest(request, config);
366
+ if (handler) {
367
+ return handler(request, reply);
368
+ }
369
+ // 사실 /api로 시작하지 않는 요청은 여기에 들어오지도 않을 거라 이 라인은 도달 불가능입니다만,
370
+ // 안전빵으로 남겨놓습니다.
371
+ throw new NotFoundException(SD("error.api.notFound"));
372
+ }
373
+ });
317
374
  }
318
375
  // biome-ignore lint/suspicious/noExplicitAny: ViteDevServer 타입을 동적으로 로드해야 함
319
376
  viteServer = null;
320
- async setupViteDevServer(server, webPath, config, globalCompressOptions) {
377
+ /**
378
+ * dev all 모드: Vite Dev Server를 통합하여 API + SSR + CSR을 모두 제공합니다.
379
+ * API 동적 매칭은 handleDevApiRequest를 공유합니다.
380
+ */ async setupDevServerWithVite(server, webPath, config) {
321
381
  // @fastify/middie 등록 (Connect-style middleware 지원)
322
382
  await server.register((await import("@fastify/middie")).default);
323
383
  const vite = await import("vite");
@@ -340,48 +400,35 @@ class SonamuClass {
340
400
  // 나머지는 Vite middleware로 전달
341
401
  return this.viteServer.middlewares(req, res, next);
342
402
  });
343
- // API 동적 라우팅 (catch-all 전에 등록)
344
- for (const api of this.syncer.apis){
345
- if (this.syncer.models[api.modelName] === undefined) {
346
- throw new Error(`정의되지 않은 모델에 접근 ${api.modelName}`);
347
- }
348
- server.route({
349
- method: api.options.httpMethod ?? "GET",
350
- url: this.config.api.route.prefix + api.path,
351
- handler: this.createApiHandler(api, config),
352
- compress: toFastifyCompressOption(api.options.compress, globalCompressOptions)
353
- });
354
- }
355
- // SSR 라우트 개별 등록 (compress 옵션이 라우트별로 적용되도록)
356
- const { getSSRRoutes, renderSSR } = await import("../ssr/index.js");
357
- const ssrRoutes = getSSRRoutes();
358
- for (const route of ssrRoutes){
359
- server.route({
360
- method: [
361
- "GET",
362
- "HEAD"
363
- ],
364
- url: route.path,
365
- compress: toFastifyCompressOption(route.compress ?? true, globalCompressOptions),
366
- handler: async (request, reply)=>{
367
- const url = request.url;
368
- console.log(`[SSR] Matched route: ${route.path}`);
369
- const params = this.extractPathParams(route.path, url);
370
- const html = await renderSSR(url, route, params, request, reply, config, this.viteServer);
371
- reply.type("text/html");
372
- return html;
373
- }
374
- });
375
- }
376
- // CSR fallback (SSR 라우트에 매칭되지 않는 모든 요청)
403
+ // catch-all 라우트에서 동적으로 API/SSR 처리
404
+ // 개발 환경에서는 라우트별 compress 옵션을 포기하고 HMR 이점을 취합니다.
377
405
  server.route({
378
406
  method: [
379
407
  "GET",
380
- "HEAD"
408
+ "HEAD",
409
+ "POST",
410
+ "PUT",
411
+ "DELETE",
412
+ "PATCH"
381
413
  ],
382
414
  url: "/*",
383
415
  handler: async (request, reply)=>{
416
+ // 1. API 요청 처리
417
+ const result = this.handleDevApiRequest(request, config);
418
+ if (result) {
419
+ return result(request, reply);
420
+ }
384
421
  const url = request.url;
422
+ // 2. SSR 라우트 처리
423
+ const { matchSSRRoute, renderSSR } = await import("../ssr/index.js");
424
+ const ssrMatch = matchSSRRoute(url);
425
+ if (ssrMatch) {
426
+ console.log(`[SSR] Matched route: ${ssrMatch.route.path}`);
427
+ const html = await renderSSR(url, ssrMatch.route, ssrMatch.params, request, reply, config, this.viteServer);
428
+ reply.type("text/html");
429
+ return html;
430
+ }
431
+ // 3. CSR fallback
385
432
  try {
386
433
  const fs = await import("node:fs/promises");
387
434
  let template = await fs.readFile(path.join(this.viteServer.config.root, "index.html"), "utf-8");
@@ -402,12 +449,12 @@ class SonamuClass {
402
449
  });
403
450
  console.log("✓ Vite dev server integrated");
404
451
  }
405
- async setupStaticWebServer(server, _webPath, config, globalCompressOptions) {
406
- // 경로 명확화: api/public/web, api/dist/ssr
407
- const webDistPath = path.join(this.apiRootPath, "public", "web");
408
- const ssrPath = path.join(this.apiRootPath, "dist", "ssr");
452
+ async setupStaticWebServer(server, config, globalCompressOptions) {
453
+ // 경로 명확화: api/web-dist/client (정적 파일), api/web-dist/server (SSR entry), api/dist/ssr (SSR routes - API 소유)
454
+ const webDistPath = path.join(this.apiRootPath, "web-dist", "client");
455
+ const ssrPath = path.join(this.apiRootPath, "web-dist", "server");
409
456
  const ssrEntryPath = path.join(ssrPath, "entry-server.generated.js");
410
- const ssrRoutesPath = path.join(ssrPath, "routes.js");
457
+ const ssrRoutesPath = path.join(this.apiRootPath, "dist", "ssr", "routes.js");
411
458
  if (!await exists(webDistPath)) {
412
459
  console.warn(`⚠ Web dist not found: ${webDistPath}`);
413
460
  return;
@@ -434,7 +481,13 @@ class SonamuClass {
434
481
  server.get("/assets/:filename", async (request, reply)=>{
435
482
  const requestedFile = request.params.filename;
436
483
  const assetsDir = path.join(webDistPath, "assets");
437
- const assetPath = `/assets/${requestedFile}`;
484
+ const safeFilePath = this.resolvePathWithinBaseDir(assetsDir, requestedFile);
485
+ if (safeFilePath === null) {
486
+ reply.status(403).send();
487
+ return;
488
+ }
489
+ const normalizedRequestedFile = path.relative(assetsDir, safeFilePath).replace(/\\/g, "/");
490
+ const assetPath = `/assets/${normalizedRequestedFile}`;
438
491
  // Cache-Control 헤더 결정
439
492
  const getCacheControlForAsset = ()=>{
440
493
  const cacheReq = {
@@ -452,8 +505,8 @@ class SonamuClass {
452
505
  return CachePresets.immutable;
453
506
  };
454
507
  // index-*.js 또는 index-*.css 요청인 경우
455
- if (/^index-[a-f0-9]+\.(js|css)$/.test(requestedFile)) {
456
- const ext = requestedFile.split(".").pop();
508
+ if (/^index-[a-f0-9]+\.(js|css)$/.test(normalizedRequestedFile)) {
509
+ const ext = normalizedRequestedFile.split(".").pop();
457
510
  const files = await fs.readdir(assetsDir);
458
511
  const currentFile = files.find((f)=>f.startsWith("index-") && f.endsWith(`.${ext}`));
459
512
  if (currentFile) {
@@ -465,17 +518,17 @@ class SonamuClass {
465
518
  }
466
519
  }
467
520
  // 일반 파일 서빙
468
- const filePath = path.join(assetsDir, requestedFile);
521
+ const filePath = safeFilePath;
469
522
  if (await exists(filePath)) {
470
523
  const content = await fs.readFile(filePath);
471
- const ext = requestedFile.split(".").pop();
524
+ const ext = normalizedRequestedFile.split(".").pop();
472
525
  reply.type(ext === "js" ? "application/javascript" : ext === "css" ? "text/css" : "");
473
- if (requestedFile.includes("-")) {
526
+ if (normalizedRequestedFile.includes("-")) {
474
527
  applyCacheHeaders(reply, getCacheControlForAsset());
475
528
  }
476
529
  return reply.send(content);
477
530
  }
478
- reply.code(404).send("Not found");
531
+ reply.status(404).send();
479
532
  });
480
533
  // SSR 라우트 개별 등록 (compress 옵션이 라우트별로 적용되도록)
481
534
  if (ssrAvailable) {
@@ -511,9 +564,7 @@ class SonamuClass {
511
564
  handler: async (request, reply)=>{
512
565
  // /api, /sonamu-ui는 404 그대로
513
566
  if (request.url.startsWith("/api") || request.url.startsWith("/sonamu-ui")) {
514
- reply.code(404).send({
515
- error: "Not Found"
516
- });
567
+ reply.status(404).send();
517
568
  return;
518
569
  }
519
570
  // CSR용 Cache-Control 헤더 설정
@@ -530,10 +581,15 @@ class SonamuClass {
530
581
  }
531
582
  }
532
583
  // 정적 파일이 존재할 경우, 정적 파일을 먼저 서빙해야함
533
- const filePath = path.join(webDistPath, request.url);
534
- if (await fileExists(filePath)) {
535
- const content = await fs.readFile(filePath);
536
- return reply.type(mimeLookup(filePath) || "application/octet-stream").send(content);
584
+ const requestPath = this.getPathnameFromUrl(request.url);
585
+ const safeFilePath = this.resolvePathWithinBaseDir(webDistPath, requestPath);
586
+ if (safeFilePath === null) {
587
+ reply.status(403).send();
588
+ return;
589
+ }
590
+ if (await fileExists(safeFilePath)) {
591
+ const content = await fs.readFile(safeFilePath);
592
+ return reply.type(mimeLookup(safeFilePath) || "application/octet-stream").send(content);
537
593
  }
538
594
  // CSR fallback: index.html 서빙
539
595
  const indexPath = path.join(webDistPath, "index.html");
@@ -668,7 +724,7 @@ class SonamuClass {
668
724
  * 예: pattern="/admin/companies/:companyId", url="/admin/companies/123" → { companyId: "123" }
669
725
  */ extractPathParams(pattern, url) {
670
726
  const patternParts = pattern.split("/").filter(Boolean);
671
- const urlParts = url.split("?")[0].split("/").filter(Boolean);
727
+ const urlParts = this.getPathnameFromUrl(url).split("/").filter(Boolean);
672
728
  const params = {};
673
729
  for(let i = 0; i < patternParts.length; i++){
674
730
  if (patternParts[i].startsWith(":")) {
@@ -677,6 +733,44 @@ class SonamuClass {
677
733
  }
678
734
  return params;
679
735
  }
736
+ isPathPatternMatch(pattern, url) {
737
+ const patternParts = pattern.split("/").filter(Boolean);
738
+ const urlParts = this.getPathnameFromUrl(url).split("/").filter(Boolean);
739
+ if (patternParts.length !== urlParts.length) {
740
+ return false;
741
+ }
742
+ for(let i = 0; i < patternParts.length; i++){
743
+ const patternPart = patternParts[i];
744
+ const urlPart = urlParts[i];
745
+ if (patternPart.startsWith(":")) {
746
+ continue;
747
+ }
748
+ if (patternPart !== urlPart) {
749
+ return false;
750
+ }
751
+ }
752
+ return true;
753
+ }
754
+ getPathnameFromUrl(url) {
755
+ return url.split("?")[0];
756
+ }
757
+ resolvePathWithinBaseDir(baseDir, inputPath) {
758
+ try {
759
+ const decoded = decodeURIComponent(inputPath).replace(/\\/g, "/");
760
+ if (decoded.includes("\0")) {
761
+ return null;
762
+ }
763
+ const relativePath = decoded.replace(/^\/+/, "");
764
+ const resolvedPath = path.resolve(baseDir, relativePath);
765
+ const relativeFromBase = path.relative(baseDir, resolvedPath);
766
+ if (relativeFromBase.startsWith("..") || path.isAbsolute(relativeFromBase)) {
767
+ return null;
768
+ }
769
+ return resolvedPath;
770
+ } catch {
771
+ return null;
772
+ }
773
+ }
680
774
  /**
681
775
  * API 응답에 적용할 Cache-Control 설정을 결정합니다.
682
776
  * 우선순위: 개별 지정 > cacheControlHandler
@@ -800,7 +894,7 @@ class SonamuClass {
800
894
  });
801
895
  }
802
896
  /*
803
- A function that automatically handles init and destroy when using Sonamu via scripts.
897
+ A function that automatically handles init and destroy when using Sonamu via scripts.
804
898
  */ async runScript(fn) {
805
899
  await this.init(true, false, undefined, false);
806
900
  try {
@@ -1023,4 +1117,4 @@ export const Sonamu = new SonamuClass();
1023
1117
  return `uploads/${timestamp}-${random}.${ext}`;
1024
1118
  }
1025
1119
 
1026
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvc29uYW11LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpc3Bvc2UgYXMgbG9ndGFwZURpc3Bvc2UgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gXCJhc3luY19ob29rc1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoIH0gZnJvbSBcImJldHRlci1hdXRoXCI7XG5pbXBvcnQgdHlwZSB7IEZTV2F0Y2hlciB9IGZyb20gXCJjaG9raWRhclwiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5SW5zdGFuY2UsIEZhc3RpZnlSZXBseSwgRmFzdGlmeVJlcXVlc3QgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlciwgU2VydmVyUmVzcG9uc2UgfSBmcm9tIFwiaHR0cFwiO1xuaW1wb3J0IG1pbWUsIHsgbG9va3VwIGFzIG1pbWVMb29rdXAgfSBmcm9tIFwibWltZS10eXBlc1wiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUG9vbENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuaW1wb3J0IHR5cGUgeyBab2RPYmplY3QgfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQge1xuICBCQVNFX0ZJRUxEX01BUFBJTkdTLFxuICBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkLFxuICBjcmVhdGVNb2NrU1NFRmFjdG9yeSxcbiAgREIsXG4gIGlzRGFlbW9uU2VydmVyLFxuICBtZXJnZSxcbn0gZnJvbSBcIi4uXCI7XG5pbXBvcnQgdHlwZSB7IENhY2hlQ29uZmlnLCBDYWNoZU1hbmFnZXIgfSBmcm9tIFwiLi4vY2FjaGUvdHlwZXNcIjtcbmltcG9ydCB7IGFwcGx5Q2FjaGVIZWFkZXJzLCBDYWNoZVByZXNldHMgfSBmcm9tIFwiLi4vY2FjaGUtY29udHJvbC9jYWNoZS1jb250cm9sXCI7XG5pbXBvcnQgdHlwZSB7IENhY2hlQ29udHJvbENvbmZpZywgQ2FjaGVDb250cm9sUmVxdWVzdCB9IGZyb20gXCIuLi9jYWNoZS1jb250cm9sL3R5cGVzXCI7XG5pbXBvcnQgeyB0b0Zhc3RpZnlDb21wcmVzc09wdGlvbiB9IGZyb20gXCIuLi9jb21wcmVzcy9jb21wcmVzc1wiO1xuaW1wb3J0IHR5cGUgeyBDb21wcmVzc09wdGlvbnMgfSBmcm9tIFwiLi4vY29tcHJlc3MvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB0eXBlIHsgTG9jYWxpemVkU3RyaW5nIH0gZnJvbSBcIi4uL2RpY3QvdHlwZXNcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyBCdWZmZXJlZEZpbGUgfSBmcm9tIFwiLi4vc3RvcmFnZS9idWZmZXJlZC1maWxlXCI7XG5pbXBvcnQgdHlwZSB7IFN0b3JhZ2VNYW5hZ2VyIH0gZnJvbSBcIi4uL3N0b3JhZ2Uvc3RvcmFnZS1tYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IEtleUdlbmVyYXRvciB9IGZyb20gXCIuLi9zdG9yYWdlL3R5cGVzXCI7XG5pbXBvcnQgeyBVcGxvYWRlZEZpbGUgfSBmcm9tIFwiLi4vc3RvcmFnZS91cGxvYWRlZC1maWxlXCI7XG5pbXBvcnQgdHlwZSB7IFN5bmNlciB9IGZyb20gXCIuLi9zeW5jZXIvc3luY2VyXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93TWFuYWdlciB9IGZyb20gXCIuLi90YXNrcy93b3JrZmxvdy1tYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdUZhc3RpZnlDb25maWcgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGV4aXN0cywgZmlsZUV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVDb25maWcsIFNvbmFtdVNlcnZlck9wdGlvbnMsIFNvbmFtdVRhc2tPcHRpb25zIH0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgZ2V0U2VjcmV0cywgdHlwZSBTb25hbXVTZWNyZXRzIH0gZnJvbSBcIi4vc2VjcmV0XCI7XG5cbmNsYXNzIFNvbmFtdUNsYXNzIHtcbiAgcHVibGljIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGZvclRlc3Rpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGFzeW5jTG9jYWxTdG9yYWdlOiBBc3luY0xvY2FsU3RvcmFnZTx7XG4gICAgY29udGV4dDogQ29udGV4dDtcbiAgfT4gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKTtcblxuICBwdWJsaWMgZ2V0Q29udGV4dCgpOiBDb250ZXh0IHtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoc3RvcmU/LmNvbnRleHQpIHtcbiAgICAgIHJldHVybiBzdG9yZS5jb250ZXh0IGFzIENvbnRleHQ7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIikge1xuICAgICAgLy8g7YWM7Iqk7YyFIO2ZmOqyveyXkOyEnCDsu6jthY3siqTtirjqsIAg7KO87J6F65CY7KeAIOyViuydgCDqsr3smrAg67mIIOy7qO2FjeyKpO2KuCDrpqzthLRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlcXVlc3Q6IG51bGwsXG4gICAgICAgIHJlcGx5OiBudWxsLFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgY3JlYXRlU1NFOiAoc2NoZW1hOiBab2RPYmplY3QpID0+IGNyZWF0ZU1vY2tTU0VGYWN0b3J5KHNjaGVtYSksXG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTog7YWM7Iqk7YyFIO2ZmOqyveyXkOyEnCDsu6jthY3siqTtirjqsIAg7KO87J6F65CY7KeAIOyViuydgCDqsr3smrAg67mIIOy7qO2FjeyKpO2KuCDrpqzthLRcbiAgICAgICAgbmFpdGVTdG9yZTogbmV3IE1hcDxzdHJpbmcsIGFueT4oKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBDb250ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgY2Fubm90IGZpbmQgY29udGV4dFwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hcGlSb290UGF0aDogQWJzb2x1dGVQYXRoIHwgbnVsbCA9IG51bGw7XG4gIHNldCBhcGlSb290UGF0aChhcGlSb290UGF0aDogQWJzb2x1dGVQYXRoKSB7XG4gICAgdGhpcy5fYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aDtcbiAgfVxuICBnZXQgYXBpUm9vdFBhdGgoKTogQWJzb2x1dGVQYXRoIHtcbiAgICBpZiAodGhpcy5fYXBpUm9vdFBhdGggPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hcGlSb290UGF0aDtcbiAgfVxuICBnZXQgYXBwUm9vdFBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hcGlSb290UGF0aC5zcGxpdChwYXRoLnNlcCkuc2xpY2UoMCwgLTEpLmpvaW4ocGF0aC5zZXApO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGJDb25maWc6IFNvbmFtdURCQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNldCBkYkNvbmZpZyhkYkNvbmZpZzogU29uYW11REJDb25maWcpIHtcbiAgICB0aGlzLl9kYkNvbmZpZyA9IGRiQ29uZmlnO1xuICB9XG4gIGdldCBkYkNvbmZpZygpOiBTb25hbXVEQkNvbmZpZyB7XG4gICAgaWYgKHRoaXMuX2RiQ29uZmlnID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGJDb25maWc7XG4gIH1cblxuICBwcml2YXRlIF9zeW5jZXI6IFN5bmNlciB8IG51bGwgPSBudWxsO1xuICBzZXQgc3luY2VyKHN5bmNlcjogU3luY2VyKSB7XG4gICAgdGhpcy5fc3luY2VyID0gc3luY2VyO1xuICB9XG4gIGdldCBzeW5jZXIoKTogU3luY2VyIHtcbiAgICBpZiAodGhpcy5fc3luY2VyID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3luY2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29uZmlnOiBTb25hbXVDb25maWcgfCBudWxsID0gbnVsbDtcbiAgc2V0IGNvbmZpZyhjb25maWc6IFNvbmFtdUNvbmZpZykge1xuICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBnZXQgY29uZmlnKCk6IFNvbmFtdUNvbmZpZyB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBzZWNyZXRzOiBTb25hbXVTZWNyZXRzID0gZ2V0U2VjcmV0cygpO1xuXG4gIHByaXZhdGUgX3N0b3JhZ2U6IFN0b3JhZ2VNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBTdG9yYWdlTWFuYWdlciDsnbjsiqTthLTsiqRcbiAgICovXG4gIGdldCBzdG9yYWdlKCk6IFN0b3JhZ2VNYW5hZ2VyIHtcbiAgICBpZiAoIXRoaXMuX3N0b3JhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0b3JhZ2UgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBzdG9yYWdlIGNvbmZpZy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zdG9yYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FjaGU6IENhY2hlTWFuYWdlciB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogQ2FjaGVNYW5hZ2VyIOyduOyKpO2EtOyKpCAoQmVudG9DYWNoZSlcbiAgICovXG4gIGdldCBjYWNoZSgpOiBDYWNoZU1hbmFnZXIge1xuICAgIGlmICghdGhpcy5fY2FjaGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhY2hlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgY2FjaGUgY29uZmlnIGluIHNvbmFtdS5jb25maWcudHMuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGU7XG4gIH1cblxuICBwcml2YXRlIF93b3JrZmxvd3M6IFdvcmtmbG93TWFuYWdlciB8IG51bGwgPSBudWxsO1xuICBnZXQgd29ya2Zsb3dzKCk6IFdvcmtmbG93TWFuYWdlciB7XG4gICAgaWYgKHRoaXMuX3dvcmtmbG93cyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fd29ya2Zsb3dzO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXV0aDogQXV0aCB8IG51bGwgPSBudWxsO1xuICBnZXQgYXV0aCgpOiBBdXRoIHtcbiAgICBpZiAoIXRoaXMuX2F1dGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF1dGggaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBhdXRoIGNvbmZpZyBpbiBzb25hbXUuY29uZmlnLnRzLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2F1dGg7XG4gIH1cblxuICAvLyBITVIg7LKY66asXG4gIHB1YmxpYyB3YXRjaGVyOiBGU1dhdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwZW5kaW5nRmlsZXM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgaG1yU3RhcnRUaW1lOiBudW1iZXIgPSAwO1xuXG4gIHB1YmxpYyBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSB8IG51bGwgPSBudWxsO1xuXG4gIGFzeW5jIGluaXRGb3JUZXN0aW5nKCkge1xuICAgIGF3YWl0IHRoaXMuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgfVxuXG4gIGFzeW5jIGluaXQoXG4gICAgZG9TaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBlbmFibGVTeW5jOiBib29sZWFuID0gdHJ1ZSxcbiAgICBhcGlSb290UGF0aD86IEFic29sdXRlUGF0aCxcbiAgICBmb3JUZXN0aW5nOiBib29sZWFuID0gZmFsc2UsXG4gICkge1xuICAgIHRoaXMuZm9yVGVzdGluZyA9IGZvclRlc3Rpbmc7XG5cbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFkb1NpbGVudCkge1xuICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICBjb25zb2xlLnRpbWUoY2hhbGsuY3lhbihgU29uYW11LmluaXQke2ZvclRlc3RpbmcgPyBcIiBmb3IgdGVzdGluZ1wiIDogXCJcIn1gKSk7XG4gICAgfVxuXG4gICAgLy8gQVBJIOujqO2KuCDtjKjsiqRcbiAgICBjb25zdCB7IGZpbmRBcGlSb290UGF0aCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvdXRpbHNcIik7XG4gICAgdGhpcy5hcGlSb290UGF0aCA9IGFwaVJvb3RQYXRoID8/IGZpbmRBcGlSb290UGF0aCgpO1xuXG4gICAgLy8g7ISk7KCV7J2EIOuhnOuUqe2VmOuKlCDqsoPrtoDthLAg7Iuc7J6RXG4gICAgY29uc3QgeyBsb2FkQ29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvbmZpZ1wiKTtcbiAgICB0aGlzLmNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcodGhpcy5hcGlSb290UGF0aCk7XG4gICAgLy8gc29uYW11LmNvbmZpZy50cyDquLDrs7jqsJIg7ISk7KCVXG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA/PyBcInBnXCI7XG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGVmYXVsdE9wdGlvbnMuY2xpZW50ID0gdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPz8gXCJwZ1wiO1xuXG4gICAgLy8g66Gc6rmFIOyEpOyglVxuICAgIGNvbnN0IHsgY29uZmlndXJlTG9nVGFwZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vbG9nZ2VyL2NvbmZpZ3VyZVwiKTtcbiAgICBpZiAodGhpcy5jb25maWcubG9nZ2luZyAhPT0gZmFsc2UpIHtcbiAgICAgIGF3YWl0IGNvbmZpZ3VyZUxvZ1RhcGUoe1xuICAgICAgICAuLi50aGlzLmNvbmZpZy5sb2dnaW5nLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gREIg66Gc65OcXG4gICAgY29uc3QgeyBEQiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZGF0YWJhc2UvZGJcIik7XG4gICAgdGhpcy5kYkNvbmZpZyA9IERCLmdlbmVyYXRlREJDb25maWcodGhpcy5jb25maWcuZGF0YWJhc2UpO1xuICAgIGlmICghZG9TaWxlbnQpIHtcbiAgICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oXCJEQiBDb25maWcgTG9hZGVkIVwiKSk7XG4gICAgfVxuXG4gICAgLy8gRW50aXR5IOuhnOuTnFxuICAgIC8vIO2FjOyKpO2KuOyXkOyEnOuPhCBFbnRpdHkg7KCV67O064qUIO2VhOyalO2VqeuLiOuLpC5cbiAgICAvLyB1cHNlcnTqsIAg7KCc64yA66GcIOyekeuPme2VmOugpOuptCBlbnRpdHnsnZggdW5pcXVlIGluZGV4IOygleuztOqwgCDtlYTsmpTtlZjquLAg65WM66y47J6F64uI64ukLlxuICAgIGNvbnN0IHsgRW50aXR5TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCIpO1xuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIuYXV0b2xvYWQoZG9TaWxlbnQpO1xuXG4gICAgLy8gQ2FjaGUg7LSI6riw7ZmUXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplQ2FjaGUodGhpcy5jb25maWcuc2VydmVyLmNhY2hlLCBmb3JUZXN0aW5nKTtcblxuICAgIC8vIO2FjOyKpO2MheyduCDqsr3smrAg7Iux7YGsIOyXhuydtCDspJHri6hcbiAgICBpZiAoZm9yVGVzdGluZykge1xuICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUYXNrIOuTseuhnVxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVdvcmtmbG93cyh0aGlzLmNvbmZpZy50YXNrcyk7XG5cbiAgICAvLyBTeW5jZXJcbiAgICBjb25zdCB7IFN5bmNlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3luY2VyL3N5bmNlclwiKTtcbiAgICB0aGlzLnN5bmNlciA9IG5ldyBTeW5jZXIoKTtcblxuICAgIC8vIEF1dG9sb2FkOiBNb2RlbHMgLyBUeXBlcyAvIEFQSXMgLyBXb3JrZmxvd3MgLyBUZW1wbGF0ZXMgLyBTU1IgUm91dGVzXG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRBcGlzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRXb3JrZmxvd3MoKTtcbiAgICBjb25zdCB7IFRlbXBsYXRlTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdGVtcGxhdGVcIik7XG4gICAgYXdhaXQgVGVtcGxhdGVNYW5hZ2VyLmF1dG9sb2FkKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRTU1JSb3V0ZXMoKTtcblxuICAgIGNvbnN0IHsgaXNMb2NhbCwgaXNUZXN0IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIC8vIOuhnOy7rOyXkOyEnOuKlCDsvZTrk5wg7IOd7ISx7J2EIOychO2VtCBCaW9tZSDshYvsl4XsnbQg7ZWE7JqU7ZWoICjtmITsnqwgYXBpUm9vdFBhdGgg7KCE64us7ZWY7JesIOyLpO2WiSlcbiAgICAgIChhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9mb3JtYXR0ZXJcIikpLnNldHVwQmlvbWUodGhpcy5hcGlSb290UGF0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBpc0hvdFJlbG9hZFNlcnZlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpICYmICFpc1Rlc3QoKSAmJiBpc0hvdFJlbG9hZFNlcnZlcigpICYmIGVuYWJsZVN5bmMpIHtcbiAgICAgIGF3YWl0IHRoaXMuc3luY2VyLnN5bmMoKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRXYXRjaGVyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBpZiAoIWRvU2lsZW50KSB7XG4gICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnNvbGUudGltZUVuZChjaGFsay5jeWFuKFwiU29uYW11LmluaXRcIikpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlcnZlcihpbml0T3B0aW9ucz86IHsgZW5hYmxlU3luYz86IGJvb2xlYW47IGRvU2lsZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCA9PT0gZmFsc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdChpbml0T3B0aW9ucz8uZG9TaWxlbnQsIGluaXRPcHRpb25zPy5lbmFibGVTeW5jKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5jb25maWcuc2VydmVyO1xuICAgIGNvbnN0IHsgZGVmYXVsdDogZmFzdGlmeSB9ID0gYXdhaXQgaW1wb3J0KFwiZmFzdGlmeVwiKTtcbiAgICBjb25zdCB7IGdldExvZ1RhcGVGYXN0aWZ5TG9nZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCJAbG9ndGFwZS9mYXN0aWZ5XCIpO1xuICAgIGNvbnN0IHNlcnZlciA9IGZhc3RpZnkoe1xuICAgICAgLi4ub3B0aW9ucy5mYXN0aWZ5LFxuICAgICAgbG9nZ2VyOlxuICAgICAgICB0aGlzLmNvbmZpZy5sb2dnaW5nICE9PSBmYWxzZVxuICAgICAgICAgID8gZ2V0TG9nVGFwZUZhc3RpZnlMb2dnZXIoe1xuICAgICAgICAgICAgICBjYXRlZ29yeTogdGhpcy5jb25maWcubG9nZ2luZz8uZmFzdGlmeUNhdGVnb3J5ID8/IFtcImZhc3RpZnlcIl0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuXG4gICAgLy8gU3RvcmFnZSDshKTsoJUg4oaSIFN0b3JhZ2VNYW5hZ2VyIOyDneyEsVxuICAgIGlmIChvcHRpb25zLnN0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IHsgU3RvcmFnZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0b3JhZ2Uvc3RvcmFnZS1tYW5hZ2VyXCIpO1xuICAgICAgdGhpcy5fc3RvcmFnZSA9IG5ldyBTdG9yYWdlTWFuYWdlcihvcHRpb25zLnN0b3JhZ2UpO1xuICAgIH1cblxuICAgIC8vIO2UjOufrOq3uOyduCDrk7HroZ1cbiAgICBpZiAob3B0aW9ucy5wbHVnaW5zKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyUGx1Z2lucyhzZXJ2ZXIsIG9wdGlvbnMucGx1Z2lucyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYXV0aCkge1xuICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlckJldHRlckF1dGgoc2VydmVyLCBvcHRpb25zLmF1dGgpO1xuICAgIH1cblxuICAgIC8vIEFQSSDrnbzsmrDtjIUg7ISk7KCVXG4gICAgYXdhaXQgdGhpcy53aXRoRmFzdGlmeShzZXJ2ZXIsIG9wdGlvbnMuYXBpQ29uZmlnLCB7XG4gICAgICBlbmFibGVTeW5jOiBpbml0T3B0aW9ucz8uZW5hYmxlU3luYyxcbiAgICAgIGRvU2lsZW50OiBpbml0T3B0aW9ucz8uZG9TaWxlbnQsXG4gICAgfSk7XG5cbiAgICAvLyDshJzrsoQg7Iuc7J6RXG4gICAgYXdhaXQgdGhpcy5ib290KHNlcnZlciwgb3B0aW9ucyk7XG5cbiAgICByZXR1cm4gc2VydmVyO1xuICB9XG5cbiAgYXN5bmMgd2l0aEZhc3RpZnkoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGVuYWJsZVN5bmM/OiBib29sZWFuO1xuICAgICAgZG9TaWxlbnQ/OiBib29sZWFuO1xuICAgIH0sXG4gICkge1xuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXQob3B0aW9ucz8uZG9TaWxlbnQsIG9wdGlvbnM/LmVuYWJsZVN5bmMpO1xuICAgIH1cblxuICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuXG4gICAgLy8gdGltZXpvbmUg7ISk7KCVXG4gICAgY29uc3QgdGltZXpvbmUgPSB0aGlzLmNvbmZpZy5hcGkudGltZXpvbmU7XG4gICAgaWYgKHRpbWV6b25lKSB7XG4gICAgICAvLyDtg4DsnoTsobTsl5Ag66ee6rKMIOydkeuLtSDrgqDsp5wg7Iqk7Yq466eB7J2EIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICAvLyDqsIDroLkgdGltZXpvbmXsnbQgXCJBc2lhL1Nlb3VsXCIg7J2066m0XG4gICAgICAvLyBcIjIwMjUtMTEtMjFUMDA6MDA6MDAuMDAwWlwiIOulvCBcIjIwMjUtMTEtMjFUMDk6MDA6MDArMDk6MDBcIiDsnLzroZwg67OA7ZmY7ZW07KO87Ja07JW8IO2VqeuLiOuLpC5cbiAgICAgIGNvbnN0IHsgZm9ybWF0SW5UaW1lWm9uZSB9ID0gYXdhaXQgaW1wb3J0KFwiZGF0ZS1mbnMtdHpcIik7XG5cbiAgICAgIC8vIElTTyA4NjAxIOuCoOynnCDtmJXsi50g7KCV6rec7IudICjsmIg6IDIwMjQtMDEtMTVUMDk6MzA6MDAuMDAwWilcbiAgICAgIGNvbnN0IElTT19EQVRFX1JFR0VYID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfShcXC5cXGR7M30pP1okLztcblxuICAgICAgLy8gVOulvCDrkZjrn6zsi7wg7J6R7J2A65Sw7Ji07ZGc6rCAIOyXhuuLpOuptCBcIjIwMjUtMTEtMTkxNzYzNTQ2MTg5MDAwMTg6NTY6MjkrMDk6MDBcIuyZgCDqsJnsnYAg6rKw6rO86rCAIOuCmOyYteuLiOuLpC5cbiAgICAgIC8vIOydtOuKlCBkYXRlLWZucyDtirnsnoXri4jri6QuXG4gICAgICAvLyDsnbTroIfqsowg7ZW064+EIOq0nOywruyKteuLiOuLpC4gXCIyMDI1LTExLTE5VDE4OjU2OjI5KzA5OjAwXCIg66qo7JaR7Jy866GcIOyemCDrgpjsmLXri4jri6QuXG4gICAgICBjb25zdCBEQVRFX0ZPUk1BVCA9IFwieXl5eS1NTS1kZCdUJ0hIOm1tOnNzWFhYXCI7XG5cbiAgICAgIHNlcnZlci5zZXRSZXBseVNlcmlhbGl6ZXIoKHBheWxvYWQpID0+IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIChfa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgSVNPX0RBVEVfUkVHRVgudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRJblRpbWVab25lKFxuICAgICAgICAgICAgICBuZXcgRGF0ZSh2YWx1ZSksXG4gICAgICAgICAgICAgIHRpbWV6b25lIGFzIGAke3N0cmluZ30vJHtzdHJpbmd9YCxcbiAgICAgICAgICAgICAgREFURV9GT1JNQVQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBpZiAoIW9wdGlvbnM/LmRvU2lsZW50KSB7XG4gICAgICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgVGltZXpvbmUgc2V0IHRvICR7dGltZXpvbmV9YCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOyghOyytCDrnbzsmrDtjIUg66as7Iqk7Yq4XG4gICAgc2VydmVyLmdldChcbiAgICAgIGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9L3JvdXRlc2AsXG4gICAgICBhc3luYyAoX3JlcXVlc3QsIF9yZXBseSk6IFByb21pc2U8dHlwZW9mIHRoaXMuc3luY2VyLmFwaXM+ID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luY2VyLmFwaXM7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBIZWFsdGhjaGVjayBBUElcbiAgICBzZXJ2ZXIuZ2V0KFxuICAgICAgYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vaGVhbHRoY2hlY2tgLFxuICAgICAgYXN5bmMgKF9yZXF1ZXN0LCBfcmVwbHkpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICByZXR1cm4gXCJva1wiO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gU29uYW11IFVJIEFQSSAo66Gc7LusIO2ZmOqyveyXkOyEnOunjClcbiAgICBjb25zdCB7IGlzTG9jYWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIik7XG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgY29uc3QgeyBzb25hbXVVSUFwaVBsdWdpbiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdWkvYXBpXCIpO1xuICAgICAgc2VydmVyLnJlZ2lzdGVyKHNvbmFtdVVJQXBpUGx1Z2luKTtcbiAgICB9XG5cbiAgICAvLyDroZzsu6wv7ZSE66Gc642V7IWYIO2ZmOqyvSDrtoTquLBcbiAgICBjb25zdCB3ZWJQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBwUm9vdFBhdGgsIFwid2ViXCIpO1xuICAgIGNvbnN0IGhhc1dlYiA9IGF3YWl0IGV4aXN0cyh3ZWJQYXRoKTtcblxuICAgIC8vIOyghOyXrSBjb21wcmVzcyDsmLXshZgg6rOE7IKwIChyb3V0ZS5jb21wcmVzczogdHJ1ZeydvCDrlYwg7IKs7JqpKVxuICAgIGNvbnN0IHBsdWdpbkNvbXByZXNzID0gdGhpcy5jb25maWcuc2VydmVyLnBsdWdpbnM/LmNvbXByZXNzO1xuICAgIGNvbnN0IGdsb2JhbENvbXByZXNzT3B0aW9uczogQ29tcHJlc3NPcHRpb25zIHwgdW5kZWZpbmVkID0gcGx1Z2luQ29tcHJlc3NcbiAgICAgID8gcGx1Z2luQ29tcHJlc3MgPT09IHRydWVcbiAgICAgICAgPyB7IHRocmVzaG9sZDogMTAyNCwgZW5jb2RpbmdzOiBbXCJiclwiLCBcImd6aXBcIiwgXCJkZWZsYXRlXCJdIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICB0aHJlc2hvbGQ6IHBsdWdpbkNvbXByZXNzLnRocmVzaG9sZCxcbiAgICAgICAgICAgIGVuY29kaW5nczogcGx1Z2luQ29tcHJlc3MuZW5jb2RpbmdzLFxuICAgICAgICAgICAgY3VzdG9tVHlwZXM6IHBsdWdpbkNvbXByZXNzLmN1c3RvbVR5cGVzLFxuICAgICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgLy8g66Gc7LusIOqwnOuwnCDtmZjqsr06IFZpdGUgRGV2IFNlcnZlciArIO2Gte2VqSDtlbjrk6Trn6xcbiAgICAgIGlmIChoYXNXZWIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXR1cFZpdGVEZXZTZXJ2ZXIoc2VydmVyLCB3ZWJQYXRoLCBjb25maWcsIGdsb2JhbENvbXByZXNzT3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIO2UhOuhnOuNleyFmCDtmZjqsr06IOqwnOuzhCBBUEkg65287Jqw7Yq4ICsg7KCV7KCBIO2MjOydvCDshJzruZlcbiAgICAgIGZvciAoY29uc3QgYXBpIG9mIHRoaXMuc3luY2VyLmFwaXMpIHtcbiAgICAgICAgaWYgKHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsoJXsnZjrkJjsp4Ag7JWK7J2AIOuqqOuNuOyXkCDsoJHqt7wgJHthcGkubW9kZWxOYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VydmVyLnJvdXRlKHtcbiAgICAgICAgICBtZXRob2Q6IGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPz8gXCJHRVRcIixcbiAgICAgICAgICB1cmw6IHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXggKyBhcGkucGF0aCxcbiAgICAgICAgICBoYW5kbGVyOiB0aGlzLmNyZWF0ZUFwaUhhbmRsZXIoYXBpLCBjb25maWcpLFxuICAgICAgICAgIGNvbXByZXNzOiB0b0Zhc3RpZnlDb21wcmVzc09wdGlvbihhcGkub3B0aW9ucy5jb21wcmVzcywgZ2xvYmFsQ29tcHJlc3NPcHRpb25zKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNXZWIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXR1cFN0YXRpY1dlYlNlcnZlcihzZXJ2ZXIsIHdlYlBhdGgsIGNvbmZpZywgZ2xvYmFsQ29tcHJlc3NPcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IFZpdGVEZXZTZXJ2ZXIg7YOA7J6F7J2EIOuPmeyggeycvOuhnCDroZzrk5ztlbTslbwg7ZWoXG4gIHByaXZhdGUgdml0ZVNlcnZlcjogYW55ID0gbnVsbDtcblxuICBwcml2YXRlIGFzeW5jIHNldHVwVml0ZURldlNlcnZlcihcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIHdlYlBhdGg6IHN0cmluZyxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgZ2xvYmFsQ29tcHJlc3NPcHRpb25zPzogQ29tcHJlc3NPcHRpb25zLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBAZmFzdGlmeS9taWRkaWUg65Ox66GdIChDb25uZWN0LXN0eWxlIG1pZGRsZXdhcmUg7KeA7JuQKVxuICAgIGF3YWl0IHNlcnZlci5yZWdpc3RlcigoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvbWlkZGllXCIpKS5kZWZhdWx0KTtcblxuICAgIGNvbnN0IHZpdGUgPSBhd2FpdCBpbXBvcnQoXCJ2aXRlXCIpO1xuXG4gICAgdGhpcy52aXRlU2VydmVyID0gYXdhaXQgdml0ZS5jcmVhdGVTZXJ2ZXIoe1xuICAgICAgcm9vdDogd2ViUGF0aCxcbiAgICAgIHNlcnZlcjoge1xuICAgICAgICBtaWRkbGV3YXJlTW9kZTogdHJ1ZSxcbiAgICAgICAgaG1yOiB7XG4gICAgICAgICAgc2VydmVyOiBzZXJ2ZXIuc2VydmVyLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFwcFR5cGU6IFwiY3VzdG9tXCIsXG4gICAgfSk7XG5cbiAgICAvLyBWaXRlIG1pZGRsZXdhcmUg65Ox66GdIChWaXRlIOyXkOyFiyDsspjrpqwpXG4gICAgc2VydmVyLnVzZSgocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgIC8vIEFQSeyZgCBTb25hbXUgVUnripQgRmFzdGlmeSDrnbzsmrDtirjqsIAg7LKY66as7ZWY64+E66GdIHNraXBcbiAgICAgIGlmIChyZXEudXJsPy5zdGFydHNXaXRoKHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgpIHx8IHJlcS51cmw/LnN0YXJ0c1dpdGgoXCIvc29uYW11LXVpXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgICB9XG4gICAgICAvLyDrgpjrqLjsp4DripQgVml0ZSBtaWRkbGV3YXJl66GcIOyghOuLrFxuICAgICAgcmV0dXJuIHRoaXMudml0ZVNlcnZlci5taWRkbGV3YXJlcyhyZXEsIHJlcywgbmV4dCk7XG4gICAgfSk7XG5cbiAgICAvLyBBUEkg64+Z7KCBIOudvOyasO2MhSAoY2F0Y2gtYWxsIOyghOyXkCDrk7HroZ0pXG4gICAgZm9yIChjb25zdCBhcGkgb2YgdGhpcy5zeW5jZXIuYXBpcykge1xuICAgICAgaWYgKHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihg7KCV7J2Y65CY7KeAIOyViuydgCDrqqjrjbjsl5Ag7KCR6re8ICR7YXBpLm1vZGVsTmFtZX1gKTtcbiAgICAgIH1cblxuICAgICAgc2VydmVyLnJvdXRlKHtcbiAgICAgICAgbWV0aG9kOiBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCIsXG4gICAgICAgIHVybDogdGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCArIGFwaS5wYXRoLFxuICAgICAgICBoYW5kbGVyOiB0aGlzLmNyZWF0ZUFwaUhhbmRsZXIoYXBpLCBjb25maWcpLFxuICAgICAgICBjb21wcmVzczogdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24oYXBpLm9wdGlvbnMuY29tcHJlc3MsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTU1Ig65287Jqw7Yq4IOqwnOuzhCDrk7HroZ0gKGNvbXByZXNzIOyYteyFmOydtCDrnbzsmrDtirjrs4TroZwg7KCB7Jqp65CY64+E66GdKVxuICAgIGNvbnN0IHsgZ2V0U1NSUm91dGVzLCByZW5kZXJTU1IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3NzclwiKTtcbiAgICBjb25zdCBzc3JSb3V0ZXMgPSBnZXRTU1JSb3V0ZXMoKTtcblxuICAgIGZvciAoY29uc3Qgcm91dGUgb2Ygc3NyUm91dGVzKSB7XG4gICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIkhFQURcIl0sXG4gICAgICAgIHVybDogcm91dGUucGF0aCxcbiAgICAgICAgY29tcHJlc3M6IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uKHJvdXRlLmNvbXByZXNzID8/IHRydWUsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVybCA9IHJlcXVlc3QudXJsO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbU1NSXSBNYXRjaGVkIHJvdXRlOiAke3JvdXRlLnBhdGh9YCk7XG5cbiAgICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmV4dHJhY3RQYXRoUGFyYW1zKHJvdXRlLnBhdGgsIHVybCk7XG4gICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlbmRlclNTUih1cmwsIHJvdXRlLCBwYXJhbXMsIHJlcXVlc3QsIHJlcGx5LCBjb25maWcsIHRoaXMudml0ZVNlcnZlcik7XG5cbiAgICAgICAgICByZXBseS50eXBlKFwidGV4dC9odG1sXCIpO1xuICAgICAgICAgIHJldHVybiBodG1sO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ1NSIGZhbGxiYWNrIChTU1Ig65287Jqw7Yq47JeQIOunpOy5reuQmOyngCDslYrripQg66qo65OgIOyalOyyrSlcbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgdXJsOiBcIi8qXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIik7XG4gICAgICAgICAgbGV0IHRlbXBsYXRlID0gYXdhaXQgZnMucmVhZEZpbGUoXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy52aXRlU2VydmVyLmNvbmZpZy5yb290LCBcImluZGV4Lmh0bWxcIiksXG4gICAgICAgICAgICBcInV0Zi04XCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0ZW1wbGF0ZSA9IGF3YWl0IHRoaXMudml0ZVNlcnZlci50cmFuc2Zvcm1JbmRleEh0bWwodXJsLCB0ZW1wbGF0ZSk7XG5cbiAgICAgICAgICByZXBseS50eXBlKFwidGV4dC9odG1sXCIpO1xuICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMudml0ZVNlcnZlci5zc3JGaXhTdGFja3RyYWNlKGUgYXMgRXJyb3IpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDUwMCk7XG4gICAgICAgICAgcmV0dXJuIChlIGFzIEVycm9yKS5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyiheujjCDsi5wgVml0ZeuPhCDsooXro4xcbiAgICBzZXJ2ZXIuYWRkSG9vayhcIm9uQ2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy52aXRlU2VydmVyLmNsb3NlKCk7XG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhcIuKckyBWaXRlIGRldiBzZXJ2ZXIgaW50ZWdyYXRlZFwiKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0dXBTdGF0aWNXZWJTZXJ2ZXIoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgICBfd2ViUGF0aDogc3RyaW5nLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICBnbG9iYWxDb21wcmVzc09wdGlvbnM6IENvbXByZXNzT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g6rK966GcIOuqhe2Zle2ZlDogYXBpL3B1YmxpYy93ZWIsIGFwaS9kaXN0L3NzclxuICAgIGNvbnN0IHdlYkRpc3RQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwicHVibGljXCIsIFwid2ViXCIpO1xuICAgIGNvbnN0IHNzclBhdGggPSBwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJkaXN0XCIsIFwic3NyXCIpO1xuICAgIGNvbnN0IHNzckVudHJ5UGF0aCA9IHBhdGguam9pbihzc3JQYXRoLCBcImVudHJ5LXNlcnZlci5nZW5lcmF0ZWQuanNcIik7XG4gICAgY29uc3Qgc3NyUm91dGVzUGF0aCA9IHBhdGguam9pbihzc3JQYXRoLCBcInJvdXRlcy5qc1wiKTtcblxuICAgIGlmICghKGF3YWl0IGV4aXN0cyh3ZWJEaXN0UGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYOKaoCBXZWIgZGlzdCBub3QgZm91bmQ6ICR7d2ViRGlzdFBhdGh9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU1NSIGVudHJ5IOyhtOyerCDsl6zrtoAg7ZmV7J24XG4gICAgY29uc3Qgc3NyQXZhaWxhYmxlID0gYXdhaXQgZXhpc3RzKHNzckVudHJ5UGF0aCk7XG5cbiAgICBpZiAoIXNzckF2YWlsYWJsZSkge1xuICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIGVudHJ5IG5vdCBmb3VuZDogJHtzc3JFbnRyeVBhdGh9YCk7XG4gICAgICBjb25zb2xlLndhcm4oXCIgIFNTUiB3aWxsIGJlIGRpc2FibGVkLiBPbmx5IENTUiB3aWxsIHdvcmsuXCIpO1xuICAgIH1cblxuICAgIC8vIFNTUiDrnbzsmrDtirgg66Gc65OcIChwcm9kdWN0aW9u7JeQ7ISc66eMLCDsgqzsmqnsnpAg7ZSE66Gc7KCd7Yq47J2YIHNzci9yb3V0ZXMudHMpXG4gICAgaWYgKHNzckF2YWlsYWJsZSkge1xuICAgICAgaWYgKGF3YWl0IGV4aXN0cyhzc3JSb3V0ZXNQYXRoKSkge1xuICAgICAgICAvLyB0cy1sb2FkZXLrnbzrqbQgXCJmaWxlOi8vXCLroZwg7Iuc7J6R7ZWY64qUIGZ1bGx5LXJlc29sdmVkIHBhdGjrp4wg67Cb6riw7JeQIOydtOulvCDsspjrpqztlbTso7zripQgaW1wb3J0TWVtYmVyc+ulvCDsgqzsmqntlbTslbwg7ZaI6rKg7KeA66eMLFxuICAgICAgICAvLyDsl6zquLDripQg7ZSE66Gc642V7IWYIO2ZmOqyveyXkOyEnCBsb2FkZXIg7JeG7J20IOuPjOyVhOqwgOq4sCDrlYzrrLjsl5AgXCLsp4Tsp5wganMg7YyM7J28XCLsnZggXCLqt7jrg6VcIiDsoIjrjIDqsr3roZzrpbwg67CU66GcIGltcG9ydO2VtOuPhCDrkKnri4jri6QuXG4gICAgICAgIC8vIOydtCDrgrTsmqnsnYAg7J20IO2VqOyImCDrgrTsl5DshJwg7JWE656Y7JeQIOuCmOyYrCDri6TrpbggaW1wb3J0IO2YuOy2nOyXkOuPhCDrj5nsnbztlZjqsowg7KCB7Jqp65Cp64uI64ukLlxuICAgICAgICBhd2FpdCBpbXBvcnQoc3NyUm91dGVzUGF0aCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi4pyTIFNTUiByb3V0ZXMgbG9hZGVkXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIHJvdXRlcyBub3QgZm91bmQ6ICR7c3NyUm91dGVzUGF0aH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDroaTrp4Eg7JeF642w7J207Yq4IOuMgOydkTogYXNzZXQgaGFzaCDrtojsnbzsuZgg7IucIO2YhOyerCDrsoTsoIQg7KeB7KCRIOyEnOu5mVxuICAgIHNlcnZlci5nZXQoXCIvYXNzZXRzLzpmaWxlbmFtZVwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEZpbGUgPSAocmVxdWVzdC5wYXJhbXMgYXMgeyBmaWxlbmFtZTogc3RyaW5nIH0pLmZpbGVuYW1lO1xuICAgICAgY29uc3QgYXNzZXRzRGlyID0gcGF0aC5qb2luKHdlYkRpc3RQYXRoLCBcImFzc2V0c1wiKTtcbiAgICAgIGNvbnN0IGFzc2V0UGF0aCA9IGAvYXNzZXRzLyR7cmVxdWVzdGVkRmlsZX1gO1xuXG4gICAgICAvLyBDYWNoZS1Db250cm9sIO2XpOuNlCDqsrDsoJVcbiAgICAgIGNvbnN0IGdldENhY2hlQ29udHJvbEZvckFzc2V0ID0gKCk6IENhY2hlQ29udHJvbENvbmZpZyA9PiB7XG4gICAgICAgIGNvbnN0IGNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICAgIHR5cGU6IFwiYXNzZXRzXCIsXG4gICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgICBwYXRoOiBhc3NldFBhdGgsXG4gICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyDsgqzsmqnsnpAg7KCV7J2YIO2VuOuTpOufrCDsmrDshKBcbiAgICAgICAgaWYgKGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIoY2FjaGVSZXEpO1xuICAgICAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDquLDrs7jqsJI6IGltbXV0YWJsZVxuICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLmltbXV0YWJsZTtcbiAgICAgIH07XG5cbiAgICAgIC8vIGluZGV4LSouanMg65iQ64qUIGluZGV4LSouY3NzIOyalOyyreyduCDqsr3smrBcbiAgICAgIGlmICgvXmluZGV4LVthLWYwLTldK1xcLihqc3xjc3MpJC8udGVzdChyZXF1ZXN0ZWRGaWxlKSkge1xuICAgICAgICBjb25zdCBleHQgPSByZXF1ZXN0ZWRGaWxlLnNwbGl0KFwiLlwiKS5wb3AoKTtcbiAgICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGFzc2V0c0Rpcik7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGaWxlID0gZmlsZXMuZmluZCgoZikgPT4gZi5zdGFydHNXaXRoKFwiaW5kZXgtXCIpICYmIGYuZW5kc1dpdGgoYC4ke2V4dH1gKSk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRGaWxlKSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oYXNzZXRzRGlyLCBjdXJyZW50RmlsZSk7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgICByZXBseS50eXBlKGV4dCA9PT0gXCJqc1wiID8gXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCIgOiBcInRleHQvY3NzXCIpO1xuICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCgpKTtcbiAgICAgICAgICByZXR1cm4gcmVwbHkuc2VuZChjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDsnbzrsJgg7YyM7J28IOyEnOu5mVxuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oYXNzZXRzRGlyLCByZXF1ZXN0ZWRGaWxlKTtcbiAgICAgIGlmIChhd2FpdCBleGlzdHMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGV4dCA9IHJlcXVlc3RlZEZpbGUuc3BsaXQoXCIuXCIpLnBvcCgpO1xuICAgICAgICByZXBseS50eXBlKGV4dCA9PT0gXCJqc1wiID8gXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCIgOiBleHQgPT09IFwiY3NzXCIgPyBcInRleHQvY3NzXCIgOiBcIlwiKTtcbiAgICAgICAgaWYgKHJlcXVlc3RlZEZpbGUuaW5jbHVkZXMoXCItXCIpKSB7XG4gICAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGdldENhY2hlQ29udHJvbEZvckFzc2V0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXBseS5zZW5kKGNvbnRlbnQpO1xuICAgICAgfVxuXG4gICAgICByZXBseS5jb2RlKDQwNCkuc2VuZChcIk5vdCBmb3VuZFwiKTtcbiAgICB9KTtcblxuICAgIC8vIFNTUiDrnbzsmrDtirgg6rCc67OEIOuTseuhnSAoY29tcHJlc3Mg7Ji17IWY7J20IOudvOyasO2KuOuzhOuhnCDsoIHsmqnrkJjrj4TroZ0pXG4gICAgaWYgKHNzckF2YWlsYWJsZSkge1xuICAgICAgY29uc3QgeyBnZXRTU1JSb3V0ZXMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3NzclwiKTtcbiAgICAgIGNvbnN0IHsgcmVuZGVyU1NSIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3IvcmVuZGVyZXJcIik7XG4gICAgICBjb25zdCBzc3JSb3V0ZXMgPSBnZXRTU1JSb3V0ZXMoKTtcblxuICAgICAgZm9yIChjb25zdCByb3V0ZSBvZiBzc3JSb3V0ZXMpIHtcbiAgICAgICAgc2VydmVyLnJvdXRlKHtcbiAgICAgICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIkhFQURcIl0sXG4gICAgICAgICAgdXJsOiByb3V0ZS5wYXRoLFxuICAgICAgICAgIGNvbXByZXNzOiB0b0Zhc3RpZnlDb21wcmVzc09wdGlvbihyb3V0ZS5jb21wcmVzcyA/PyB0cnVlLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpLFxuICAgICAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW1NTUl0gTWF0Y2hlZCByb3V0ZTogJHtyb3V0ZS5wYXRofWApO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmV4dHJhY3RQYXRoUGFyYW1zKHJvdXRlLnBhdGgsIHVybCk7XG4gICAgICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVuZGVyU1NSKHVybCwgcm91dGUsIHBhcmFtcywgcmVxdWVzdCwgcmVwbHksIGNvbmZpZyk7XG5cbiAgICAgICAgICAgIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDU1Igb3IgU3RhdGljIEZpbGUgRmFsbGJhY2sgKFNTUiDrnbzsmrDtirjsl5Ag66ek7Lmt65CY7KeAIOyViuuKlCDrqqjrk6Ag7JqU7LKtKVxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIkhFQURcIl0sXG4gICAgICB1cmw6IFwiKlwiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIC8vIC9hcGksIC9zb25hbXUtdWnripQgNDA0IOq3uOuMgOuhnFxuICAgICAgICBpZiAocmVxdWVzdC51cmwuc3RhcnRzV2l0aChcIi9hcGlcIikgfHwgcmVxdWVzdC51cmwuc3RhcnRzV2l0aChcIi9zb25hbXUtdWlcIikpIHtcbiAgICAgICAgICByZXBseS5jb2RlKDQwNCkuc2VuZCh7IGVycm9yOiBcIk5vdCBGb3VuZFwiIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENTUuyaqSBDYWNoZS1Db250cm9sIO2XpOuNlCDshKTsoJVcbiAgICAgICAgaWYgKGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKSB7XG4gICAgICAgICAgY29uc3QgY3NyQ2FjaGVSZXE6IENhY2hlQ29udHJvbFJlcXVlc3QgPSB7XG4gICAgICAgICAgICB0eXBlOiBcImNzclwiLFxuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgICAgIHBhdGg6IHJlcXVlc3QudXJsLnNwbGl0KFwiP1wiKVswXSxcbiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBjc3JDYWNoZUNvbmZpZyA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNzckNhY2hlUmVxKTtcblxuICAgICAgICAgIGlmIChjc3JDYWNoZUNvbmZpZykge1xuICAgICAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGNzckNhY2hlQ29uZmlnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDsoJXsoIEg7YyM7J287J20IOyhtOyerO2VoCDqsr3smrAsIOygleyggSDtjIzsnbzsnYQg66i87KCAIOyEnOu5me2VtOyVvO2VqFxuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3ZWJEaXN0UGF0aCwgcmVxdWVzdC51cmwpO1xuICAgICAgICBpZiAoYXdhaXQgZmlsZUV4aXN0cyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICAgIHJldHVybiByZXBseS50eXBlKG1pbWVMb29rdXAoZmlsZVBhdGgpIHx8IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIpLnNlbmQoY29udGVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDU1IgZmFsbGJhY2s6IGluZGV4Lmh0bWwg7ISc67mZXG4gICAgICAgIGNvbnN0IGluZGV4UGF0aCA9IHBhdGguam9pbih3ZWJEaXN0UGF0aCwgXCJpbmRleC5odG1sXCIpO1xuICAgICAgICByZXR1cm4gcmVwbHkudHlwZShcInRleHQvaHRtbFwiKS5zZW5kKGF3YWl0IGZzLnJlYWRGaWxlKGluZGV4UGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coYOKckyBTdGF0aWMgd2ViIHNlcnZlciBjb25maWd1cmVkIHdpdGggJHtzc3JBdmFpbGFibGUgPyBcIlNTUlwiIDogXCJDU1Igb25seVwifSBzdXBwb3J0YCk7XG4gIH1cblxuICBjcmVhdGVBcGlIYW5kbGVyKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApOiAocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpID0+IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBhc3luYyAocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgICAgIC8vIENvbnRleHQg7IOd7ISxXG4gICAgICBjb25zdCBjb250ZXh0OiBDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgICByZXR1cm4gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0IH0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gZ3VhcmRzIOyymOumrFxuICAgICAgICAoYXBpLm9wdGlvbnMuZ3VhcmRzID8/IFtdKS5ldmVyeSgoZ3VhcmQpID0+IGNvbmZpZy5ndWFyZEhhbmRsZXIoZ3VhcmQsIHJlcXVlc3QsIGFwaSkpO1xuXG4gICAgICAgIC8vIO2MjOudvOuvuO2EsCDsoJXrs7TroZwgem9kIOyKpO2CpOuniCDruYzrk5xcbiAgICAgICAgY29uc3QgeyBnZXRab2RPYmplY3RGcm9tQXBpIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvZGUtY29udmVydGVyc1wiKTtcbiAgICAgICAgY29uc3QgUmVxVHlwZSA9IGdldFpvZE9iamVjdEZyb21BcGkoYXBpLCB0aGlzLnN5bmNlci50eXBlcyk7XG5cbiAgICAgICAgLy8gcmVxdWVzdCDtjIzsi7FcbiAgICAgICAgY29uc3Qgd2hpY2ggPSBhcGkub3B0aW9ucy5odHRwTWV0aG9kID09PSBcIkdFVFwiID8gXCJxdWVyeVwiIDogXCJib2R5XCI7XG4gICAgICAgIGxldCByZXFCb2R5OiB7XG4gICAgICAgICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgICAgICAgfTtcbiAgICAgICAgLy8g7YyM7J28IOyXheuhnOuTnCDsnojripQg6rK97JqwIOyehOyLnCDrjbDsnbTthLBcbiAgICAgICAgY29uc3QgZmlsZXM6IHtcbiAgICAgICAgICBidWZmZXJlZEZpbGVzOiBCdWZmZXJlZEZpbGVbXTtcbiAgICAgICAgICB1cGxvYWRlZEZpbGVzOiBVcGxvYWRlZEZpbGVbXTtcbiAgICAgICAgfSA9IHtcbiAgICAgICAgICBidWZmZXJlZEZpbGVzOiBbXSxcbiAgICAgICAgICB1cGxvYWRlZEZpbGVzOiBbXSxcbiAgICAgICAgfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSAocmVxdWVzdFt3aGljaF0gPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIGlmIChhcGkudXBsb2FkT3B0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSByZXF1ZXN0LnBhcnRzKHtcbiAgICAgICAgICAgICAgbGltaXRzOiBhcGkudXBsb2FkT3B0aW9ucy5saW1pdHMsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gRm9ybURhdGHsnZggZmllbGTrk6TsnYQg7J6E7Iuc66GcIOyggOyepVxuICAgICAgICAgICAgY29uc3QgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICAgICAgICAgIGlmIChhcGkudXBsb2FkT3B0aW9ucy5jb25zdW1lID09PSBcImJ1ZmZlclwiIHx8ICFhcGkudXBsb2FkT3B0aW9ucy5jb25zdW1lKSB7XG4gICAgICAgICAgICAgIC8vIEJ1ZmZlciDrqqjrk5w6IOuplOuqqOumrOyXkCDroZzrk5xcbiAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICAgICAgICAgIC8vIENSSVRJQ0FMOiDtjIzsnbwg7Iqk7Yq466a87J2EIOymieyLnCBjb25zdW1l7ZW07JW8IOuLpOydjCBwYXJ066GcIOuEmOyWtOqwiCDsiJgg7J6I7J2MXG4gICAgICAgICAgICAgICAgICAvLyDsnbQg7Zi47Lac7J20IOyXhuycvOuptCDsooXsooUgbXVsdGlwYXJ0IO2MjOyLseydtCBwZW5kaW5nIOyDge2DnOuhnCDtg4DsnoTslYTsm4Mg67Cc7IOdXG4gICAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCBwYXJ0LnRvQnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgICBmaWxlcy5idWZmZXJlZEZpbGVzLnB1c2gobmV3IEJ1ZmZlcmVkRmlsZShwYXJ0LCBidWZmZXIpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWVsZFwiKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZHNbcGFydC5maWVsZG5hbWVdID0gU3RyaW5nKHBhcnQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChhcGkudXBsb2FkT3B0aW9ucy5jb25zdW1lID09PSBcInN0cmVhbVwiKSB7XG4gICAgICAgICAgICAgIC8vIFN0cmVhbSDrqqjrk5w6IOymieyLnCDsoIDsnqXshozroZwg7Iqk7Yq466as67CNXG4gICAgICAgICAgICAgIGNvbnN0IGRpc2tOYW1lID0gYXBpLnVwbG9hZE9wdGlvbnMuZGVzdGluYXRpb247XG4gICAgICAgICAgICAgIGNvbnN0IGRpc2sgPSB0aGlzLnN0b3JhZ2UudXNlKGRpc2tOYW1lKTtcblxuICAgICAgICAgICAgICAvLyDsmrDshKDsiJzsnIQ6IOuNsOy9lOugiOydtO2EsCA+IOyghOyXrSDshKTsoJUgPiDquLDrs7jqsJJcbiAgICAgICAgICAgICAgY29uc3Qga2V5R2VuZXJhdG9yOiBLZXlHZW5lcmF0b3IgPVxuICAgICAgICAgICAgICAgIGFwaS51cGxvYWRPcHRpb25zLmtleUdlbmVyYXRvciA/P1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNlcnZlci5zdG9yYWdlPy5rZXlHZW5lcmF0b3IgPz9cbiAgICAgICAgICAgICAgICBkZWZhdWx0S2V5R2VuZXJhdG9yO1xuXG4gICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwiZmlsZVwiKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBrZXlHZW5lcmF0b3Ioe1xuICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogcGFydC5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbWltZXR5cGU6IHBhcnQubWltZXR5cGUsXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgYXdhaXQgZGlzay5wdXRTdHJlYW0oa2V5LCBwYXJ0LmZpbGUsIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGU6IHBhcnQubWltZXR5cGUsXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgZGlzay5nZXRVcmwoa2V5KTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25lZFVybCA9IGF3YWl0IGRpc2suZ2V0U2lnbmVkVXJsKGtleSk7XG5cbiAgICAgICAgICAgICAgICAgIGZpbGVzLnVwbG9hZGVkRmlsZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgbmV3IFVwbG9hZGVkRmlsZSh7XG4gICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IHBhcnQuZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgbWltZXR5cGU6IHBhcnQubWltZXR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgc2l6ZTogcGFydC5maWxlLmJ5dGVzUmVhZCxcbiAgICAgICAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgICAgICAgc2lnbmVkVXJsLFxuICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNrTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSBcImZpZWxkXCIpIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkc1twYXJ0LmZpZWxkbmFtZV0gPSBTdHJpbmcocGFydC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHFz66GcIOykkeyyqSDqtazsobAg7YyM7IuxOiBwYXJhbXNbY2F0ZWdvcnldIOKGkiB7IHBhcmFtczogeyBjYXRlZ29yeTogXCJ0ZXN0XCIgfSB9XG4gICAgICAgICAgICBjb25zdCBxcyA9IGF3YWl0IGltcG9ydChcInFzXCIpO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcXMuZGVmYXVsdC5wYXJzZShmaWVsZHMpO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihib2R5LCBwYXJzZWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHsgZmFzdGlmeUNhc3RlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jYXN0ZXJcIik7XG4gICAgICAgICAgcmVxQm9keSA9IGZhc3RpZnlDYXN0ZXIoUmVxVHlwZSkucGFyc2UoYm9keSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zdCB7IFpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCJ6b2RcIik7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBab2RFcnJvcikge1xuICAgICAgICAgICAgY29uc3QgeyBodW1hbml6ZVpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy96b2QtZXJyb3JcIik7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGh1bWFuaXplWm9kRXJyb3IoZSlcbiAgICAgICAgICAgICAgLm1hcCgoaXNzdWUpID0+IGlzc3VlLm1lc3NhZ2UpXG4gICAgICAgICAgICAgIC5qb2luKFwiIFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHsgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24obWVzc2FnZXMgYXMgTG9jYWxpemVkU3RyaW5nLCB7XG4gICAgICAgICAgICAgIHpvZEVycm9yOiBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udGVudC1UeXBlXG4gICAgICAgIHJlcGx5LnR5cGUoYXBpLm9wdGlvbnMuY29udGVudFR5cGUgPz8gXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuXG4gICAgICAgIC8vIENhY2hlLUNvbnRyb2wg7Zek642UIOyEpOyglVxuICAgICAgICBjb25zdCBhcGlDYWNoZUNvbmZpZyA9IHRoaXMuZ2V0QXBpQ2FjaGVDb250cm9sKGFwaSwgcmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKGFwaUNhY2hlQ29uZmlnKSB7XG4gICAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGFwaUNhY2hlQ29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOyXheuhnOuTnCDsmLXshZjsnbQg7J6I64qUIOqyveyasCDtjIzsnbwg642w7J207YSw66W8IENvbnRleHTsl5Ag7LaU6rCAXG4gICAgICAgIGlmIChhcGkudXBsb2FkT3B0aW9ucykge1xuICAgICAgICAgIGNvbnN0IGNvbnN1bWUgPSBhcGkudXBsb2FkT3B0aW9ucy5jb25zdW1lID8/IFwiYnVmZmVyXCI7XG4gICAgICAgICAgaWYgKGNvbnN1bWUgPT09IFwiYnVmZmVyXCIpIHtcbiAgICAgICAgICAgIGNvbnRleHQuYnVmZmVyZWRGaWxlcyA9IGZpbGVzLmJ1ZmZlcmVkRmlsZXM7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb25zdW1lID09PSBcInN0cmVhbVwiKSB7XG4gICAgICAgICAgICBjb250ZXh0LnVwbG9hZGVkRmlsZXMgPSBmaWxlcy51cGxvYWRlZEZpbGVzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOuqqOuNuCDrqZTshozrk5wgYXJncyDsg53shLHtlZjsl6wg7Zi47LacXG4gICAgICAgIGNvbnN0IHsgQXBpUGFyYW1UeXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKTtcbiAgICAgICAgY29uc3QgYXJncyA9IGFwaS5wYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IHtcbiAgICAgICAgICAvLyBDb250ZXh0IOyduOygneyFmFxuICAgICAgICAgIGlmIChBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlcUJvZHlbcGFyYW0ubmFtZV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MsIHJlcGx5KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVVJM7JeQ7IScIHBhdGggcGFyYW1z66W8IOy2lOy2nO2VqeuLiOuLpC5cbiAgICog7JiIOiBwYXR0ZXJuPVwiL2FkbWluL2NvbXBhbmllcy86Y29tcGFueUlkXCIsIHVybD1cIi9hZG1pbi9jb21wYW5pZXMvMTIzXCIg4oaSIHsgY29tcGFueUlkOiBcIjEyM1wiIH1cbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdFBhdGhQYXJhbXMocGF0dGVybjogc3RyaW5nLCB1cmw6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHBhdHRlcm5QYXJ0cyA9IHBhdHRlcm4uc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCB1cmxQYXJ0cyA9IHVybC5zcGxpdChcIj9cIilbMF0uc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocGF0dGVyblBhcnRzW2ldLnN0YXJ0c1dpdGgoXCI6XCIpKSB7XG4gICAgICAgIHBhcmFtc1twYXR0ZXJuUGFydHNbaV0uc2xpY2UoMSldID0gdXJsUGFydHNbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogQVBJIOydkeuLteyXkCDsoIHsmqntlaAgQ2FjaGUtQ29udHJvbCDshKTsoJXsnYQg6rKw7KCV7ZWp64uI64ukLlxuICAgKiDsmrDshKDsiJzsnIQ6IOqwnOuzhCDsp4DsoJUgPiBjYWNoZUNvbnRyb2xIYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGdldEFwaUNhY2hlQ29udHJvbChcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKSB7XG4gICAgLy8g642w7L2U66CI7J207YSwIOyEpOyglSDsmrDshKBcbiAgICBpZiAoYXBpLm9wdGlvbnMuY2FjaGVDb250cm9sKSB7XG4gICAgICByZXR1cm4gYXBpLm9wdGlvbnMuY2FjaGVDb250cm9sO1xuICAgIH1cblxuICAgIC8vIOyghOyXrSDtlbjrk6Trn6xcbiAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICAgIGNvbnN0IGNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICB0eXBlOiBcImFwaVwiLFxuICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICBwYXRoOiByZXF1ZXN0LnJvdXRlT3B0aW9ucz8udXJsID8/IHJlcXVlc3QudXJsLnNwbGl0KFwiP1wiKVswXSxcbiAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgYXBpLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNhY2hlUmVxKTtcbiAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU1NS7JqpIEFQSSDtmLjstpwgKEhUVFAg7Jik67KE7Zek65OcIOyXhuydtCDsp4HsoJEg7Zi47LacKVxuICAgKiBjcmVhdGVBcGlIYW5kbGVy7J2YIOuhnOyngeydhCDsnqzsgqzsmqntlZjrkJgsIHJlcXVlc3Qg7YyM7IuxIOuMgOyLoCBwYXJhbXMg7KeB7KCRIOyCrOyaqVxuICAgKi9cbiAgYXN5bmMgaW52b2tlQXBpRm9yU1NSKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBTU1Lsl5DshJwg64uk7JaR7ZWcIO2DgOyeheydmCBwYXJhbXPrpbwg67Cb7JWE7JW8IO2VqFxuICAgIHBhcmFtczogYW55W10sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIC8vIENvbnRleHQg7IOd7ISxICjquLDsobQg66mU7IaM65OcIOyerOyCrOyaqSlcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgcmV0dXJuIHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBhcmdzIOyDneyEsTogQ29udGV4dCDtjIzrnbzrr7jthLDripQg7KO87J6FLCDrgpjrqLjsp4DripQgcGFyYW1z7JeQ7IScIOqwgOyguOyYpOq4sFxuICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgbGV0IHBhcmFtc0luZGV4ID0gMDtcbiAgICAgIGNvbnN0IGFyZ3MgPSBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgIGlmIChBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmFtc1twYXJhbXNJbmRleCsrXTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDrqqjrjbgg66mU7ISc65OcIO2YuOy2nCAo6riw7KG0IOuplOyEnOuTnCDsnqzsgqzsmqkpXG4gICAgICByZXR1cm4gdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MsIHJlcGx5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGludm9rZU1vZGVsTWV0aG9kKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgYXJnczogdW5rbm93bltdLFxuICAgIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5zeW5jZXIubW9kZWxzW2FwaS5tb2RlbE5hbWVdO1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogbW9kZWzsnYAg66qo6424IOyduOyKpO2EtOyKpOydtOuvgOuhnCDrqZTshJzrk5wg7Zi47LacIOqwgOuKpVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IChtb2RlbCBhcyBhbnkpW2FwaS5tZXRob2ROYW1lXS5hcHBseShtb2RlbCwgYXJncyk7XG4gICAgcmVwbHkudHlwZShhcGkub3B0aW9ucy5jb250ZW50VHlwZSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlQ29udGV4dChcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgKTogUHJvbWlzZTxDb250ZXh0PiB7XG4gICAgLy8gY3JlYXRlU1NFRmFjdG9yeSDtlajsiJjsl5Ag66+466asIHJlcXVlc3TsnZggc29ja2V06rO8IHJlcGx566W8IOuwlOyduOuUqS5cbiAgICBjb25zdCB7IGNyZWF0ZVNTRUZhY3RvcnkgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0cmVhbS9zc2VcIik7XG4gICAgY29uc3QgY3JlYXRlU1NFID0gKDxUIGV4dGVuZHMgWm9kT2JqZWN0PihcbiAgICAgIF9yZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICAgIF9yZXBseTogRmFzdGlmeVJlcGx5LFxuICAgICAgX2V2ZW50czogVCxcbiAgICApID0+IGNyZWF0ZVNTRUZhY3RvcnkoX3JlcXVlc3Quc29ja2V0LCBfcmVwbHksIF9ldmVudHMpKS5iaW5kKG51bGwsIHJlcXVlc3QsIHJlcGx5KTtcblxuICAgIC8vIGxvY2FsZSDqsJDsp4BcbiAgICBjb25zdCBsb2NhbGUgPVxuICAgICAgdGhpcy5kZXRlY3RMb2NhbGUocmVxdWVzdC5oZWFkZXJzW1wiYWNjZXB0LWxhbmd1YWdlXCJdLCB0aGlzLmNvbmZpZy5pMThuLnN1cHBvcnRlZExvY2FsZXMpID8/XG4gICAgICB0aGlzLmNvbmZpZy5pMThuLmRlZmF1bHRMb2NhbGU7XG5cbiAgICAvLyBhdXRoIGNvbnRleHQg7LaU6rCAXG4gICAgY29uc3QgaGVhZGVycyA9IGNvbnZlcnRGYXN0aWZ5SGVhZGVyc1RvU3RhbmRhcmQocmVxdWVzdC5oZWFkZXJzKTtcbiAgICBjb25zdCBzZXNzaW9uID0gKGF3YWl0IHRoaXMuX2F1dGg/LmFwaS5nZXRTZXNzaW9uKHsgaGVhZGVycyB9KSkgPz8gbnVsbDtcblxuICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSB7XG4gICAgICAuLi4oYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICBjb25maWcuY29udGV4dFByb3ZpZGVyKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICByZXBseSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgICAgIGNyZWF0ZVNTRSxcbiAgICAgICAgICAgIG5haXRlU3RvcmU6IE5haXRlLmNyZWF0ZVN0b3JlKCksXG4gICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAvLyBhdXRoXG4gICAgICAgICAgICB1c2VyOiBzZXNzaW9uPy51c2VyID8/IG51bGwsXG4gICAgICAgICAgICBzZXNzaW9uOiBzZXNzaW9uPy5zZXNzaW9uID8/IG51bGwsXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHJlcGx5LFxuICAgICAgICApLFxuICAgICAgKSksXG4gICAgfTtcbiAgICByZXR1cm4gY29udGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHQtTGFuZ3VhZ2Ug7Zek642U7JeQ7IScIOyngOybkO2VmOuKlCBsb2NhbGXsnYQg7LC+7Iq164uI64ukLlxuICAgKiBAZXhhbXBsZSBcImtvLUtSLGtvO3E9MC45LGVuO3E9MC44XCIg4oaSIFwia29cIlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RMb2NhbGUoXG4gICAgYWNjZXB0TGFuZ3VhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzdXBwb3J0ZWQ6IHN0cmluZ1tdLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghYWNjZXB0TGFuZ3VhZ2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAvLyBBY2NlcHQtTGFuZ3VhZ2U6IGtvLUtSLGtvO3E9MC45LGVuO3E9MC44XG4gICAgY29uc3QgbGFuZ3MgPSBhY2NlcHRMYW5ndWFnZS5zcGxpdChcIixcIikubWFwKChsYW5nKSA9PiB7XG4gICAgICBjb25zdCBbY29kZV0gPSBsYW5nLnNwbGl0KFwiO1wiKTtcbiAgICAgIHJldHVybiBjb2RlLnRyaW0oKS5zcGxpdChcIi1cIilbMF07IC8vIGtvLUtSIOKGkiBrb1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxhbmdzLmZpbmQoKGxhbmcpID0+IHN1cHBvcnRlZC5pbmNsdWRlcyhsYW5nKSk7XG4gIH1cblxuICBhc3luYyBzdGFydFdhdGNoZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd2F0Y2hQYXRoID0gW3BhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcInNyY1wiKV07XG5cbiAgICBjb25zdCBjaG9raWRhciA9IChhd2FpdCBpbXBvcnQoXCJjaG9raWRhclwiKSkuZGVmYXVsdDtcbiAgICB0aGlzLndhdGNoZXIgPSBjaG9raWRhci53YXRjaCh3YXRjaFBhdGgsIHtcbiAgICAgIGlnbm9yZWQ6IChwYXRoLCBzdGF0cykgPT5cbiAgICAgICAgISFzdGF0cz8uaXNGaWxlKCkgJiYgIXBhdGguZW5kc1dpdGgoXCIudHNcIikgJiYgIXBhdGguZW5kc1dpdGgoXCIuanNvblwiKSxcbiAgICAgIHBlcnNpc3RlbnQ6IHRydWUsXG4gICAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgdGhpcy53YXRjaGVyLm9uKFwiYWxsXCIsIGFzeW5jIChldmVudDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBmaWxlUGF0aCBhcyBBYnNvbHV0ZVBhdGg7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGFic29sdXRlUGF0aC5zdGFydHNXaXRoKHRoaXMuYXBpUm9vdFBhdGgpLFxuICAgICAgICBcIkZpbGUgcGF0aCBpcyBub3Qgd2l0aGluIHRoZSBBUEkgcm9vdCBwYXRoXCIsXG4gICAgICApO1xuXG4gICAgICBpZiAoZXZlbnQgIT09IFwiY2hhbmdlXCIgJiYgZXZlbnQgIT09IFwiYWRkXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBzb25hbXUuY29uZmlnLnRzIOuzgOqyvSDsi5wg7J6s7Iuc7J6RXG4gICAgICAgIGNvbnN0IGlzQ29uZmlnVHMgPSBmaWxlUGF0aCA9PT0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwic29uYW11LmNvbmZpZy50c1wiKTtcblxuICAgICAgICBpZiAoaXNDb25maWdUcykge1xuICAgICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2UodGhpcy5hcGlSb290UGF0aCwgXCJhcGlcIik7XG4gICAgICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ib2xkKGBEZXRlY3RlZCgke2V2ZW50fSk6ICR7Y2hhbGsuYmx1ZShyZWxhdGl2ZVBhdGgpfSAtIFJlc3RhcnRpbmcuLi5gKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgXCJTSUdVU1IyXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRmlsZUNoYW5nZShldmVudCwgYWJzb2x1dGVQYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qXG4gICAgIEEgZnVuY3Rpb24gdGhhdCBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgaW5pdCBhbmQgZGVzdHJveSB3aGVuIHVzaW5nIFNvbmFtdSB2aWEgc2NyaXB0cy4gICAgXG4gICovXG4gIGFzeW5jIHJ1blNjcmlwdChmbjogKCkgPT4gUHJvbWlzZTx2b2lkPikge1xuICAgIGF3YWl0IHRoaXMuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJQbHVnaW5zKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLCBwbHVnaW5zOiBTb25hbXVTZXJ2ZXJPcHRpb25zW1wicGx1Z2luc1wiXSkge1xuICAgIGlmICghcGx1Z2lucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNvbXByZXNzIO2UjOufrOq3uOyduOydgCDri6Trpbgg7ZSM65+s6re47J2467O064ukIOuovOyggCDrk7HroZ3rkJjslrTslbwg7ZWp64uI64ukLlxuICAgIGlmIChwbHVnaW5zLmNvbXByZXNzKSB7XG4gICAgICBjb25zdCBjb21wcmVzc1BsdWdpbiA9IChhd2FpdCBpbXBvcnQoXCJAZmFzdGlmeS9jb21wcmVzc1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgICB0aHJlc2hvbGQ6IDEwMjQsXG4gICAgICAgIGVuY29kaW5nczogW1wiYnJcIiwgXCJnemlwXCIsIFwiZGVmbGF0ZVwiXSBhcyAoXCJiclwiIHwgXCJnemlwXCIgfCBcImRlZmxhdGVcIilbXSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChwbHVnaW5zLmNvbXByZXNzID09PSB0cnVlKSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3Rlcihjb21wcmVzc1BsdWdpbiwgZGVmYXVsdE9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VydmVyLnJlZ2lzdGVyKGNvbXByZXNzUGx1Z2luLCB7XG4gICAgICAgICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgLi4ucGx1Z2lucy5jb21wcmVzcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGx1Z2luc01vZHVsZXMgPSB7XG4gICAgICBjb3JzOiBcIkBmYXN0aWZ5L2NvcnNcIixcbiAgICAgIGZvcm1ib2R5OiBcIkBmYXN0aWZ5L2Zvcm1ib2R5XCIsXG4gICAgICBtdWx0aXBhcnQ6IFwiQGZhc3RpZnkvbXVsdGlwYXJ0XCIsXG4gICAgICBxczogXCJmYXN0aWZ5LXFzXCIsXG4gICAgICBzc2U6IFwiZmFzdGlmeS1zc2UtdjJcIixcbiAgICAgIHN0YXRpYzogXCJAZmFzdGlmeS9zdGF0aWNcIixcbiAgICB9IGFzIGNvbnN0O1xuXG4gICAgY29uc3QgcmVnaXN0ZXJQbHVnaW4gPSBhc3luYyA8SyBleHRlbmRzIGtleW9mIE5vbk51bGxhYmxlPHR5cGVvZiBwbHVnaW5zPj4oXG4gICAgICBrZXk6IEssXG4gICAgICBwbHVnaW5OYW1lOiBzdHJpbmcsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb24gPSBwbHVnaW5zW2tleV07XG4gICAgICBpZiAoIW9wdGlvbikgcmV0dXJuO1xuXG4gICAgICBpZiAob3B0aW9uID09PSB0cnVlKSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3RlcigoYXdhaXQgaW1wb3J0KHBsdWdpbk5hbWUpKS5kZWZhdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3RlcigoYXdhaXQgaW1wb3J0KHBsdWdpbk5hbWUpKS5kZWZhdWx0LCBvcHRpb24pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHBsdWdpbk5hbWVdIG9mIE9iamVjdC5lbnRyaWVzKHBsdWdpbnNNb2R1bGVzKSkge1xuICAgICAgYXdhaXQgcmVnaXN0ZXJQbHVnaW4oa2V5IGFzIGtleW9mIHR5cGVvZiBwbHVnaW5zLCBwbHVnaW5OYW1lKTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2lucy5jdXN0b20pIHtcbiAgICAgIHBsdWdpbnMuY3VzdG9tKHNlcnZlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGJldHRlci1hdXRoIOudvOyasO2KuOulvCDrk7HroZ3tlanri4jri6QuXG4gICAqIC9hcGkvYXV0aC8qIOqyveuhnOuhnCDsnbjspp0gQVBJ6rCAIOyekOuPmSDrk7HroZ3rkKnri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyQmV0dGVyQXV0aChcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSxcbiAgICBvcHRpb25zOiBOb25OdWxsYWJsZTxTb25hbXVTZXJ2ZXJPcHRpb25zW1wiYXV0aFwiXT4sXG4gICkge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuO1xuXG4gICAgY29uc3QgYmFzZVBhdGggPSBvcHRpb25zLmJhc2VQYXRoID8/IFwiL2FwaS9hdXRoXCI7XG5cbiAgICAvLyDsgqzsmqnsnpAg7ISk7KCV6rO8IOq4sOuzuOqwkuydhCBtZXJnZVxuICAgIGNvbnN0IG1lcmdlZEZpZWxkTWFwcGluZ3MgPSBtZXJnZShCQVNFX0ZJRUxEX01BUFBJTkdTLCBvcHRpb25zKTtcblxuICAgIC8vIGJldHRlci1hdXRoIOyduOyKpO2EtOyKpCDsg53shLFcbiAgICBjb25zdCB7IGJldHRlckF1dGggfSA9IGF3YWl0IGltcG9ydChcImJldHRlci1hdXRoXCIpO1xuICAgIGNvbnN0IHsgUG9vbCB9ID0gYXdhaXQgaW1wb3J0KFwicGdcIik7XG5cbiAgICB0aGlzLl9hdXRoID0gYmV0dGVyQXV0aCh7XG4gICAgICBkYXRhYmFzZTogbmV3IFBvb2woREIuZ2V0REJDb25maWcoXCJ3XCIpLmNvbm5lY3Rpb24gYXMgUG9vbENvbmZpZyksXG4gICAgICAuLi5tZXJnZWRGaWVsZE1hcHBpbmdzLFxuICAgIH0pO1xuXG4gICAgLy8gYmV0dGVyLWF1dGgg65287Jqw7Yq4IOuTseuhnVxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIlBPU1RcIl0sXG4gICAgICB1cmw6IGAke2Jhc2VQYXRofS8qYCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsLCBgaHR0cDovLyR7cmVxdWVzdC5oZWFkZXJzLmhvc3R9YCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkKHJlcXVlc3QuaGVhZGVycyk7XG4gICAgICAgIGNvbnN0IHJlcSA9IG5ldyBSZXF1ZXN0KHVybC50b1N0cmluZygpLCB7XG4gICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIC4uLihyZXF1ZXN0LmJvZHkgPyB7IGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcXVlc3QuYm9keSkgfSA6IHt9KSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGguaGFuZGxlcihyZXEpO1xuXG4gICAgICAgIHJlcGx5LnN0YXR1cyhyZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICByZXNwb25zZS5oZWFkZXJzLmZvckVhY2goKHZhbHVlOiBzdHJpbmcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgcmVwbHkuaGVhZGVyKGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQocmVzcG9uc2UuYm9keSA/IGF3YWl0IHJlc3BvbnNlLnRleHQoKSA6IG51bGwpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgYmV0dGVyLWF1dGggcmVnaXN0ZXJlZCBhdCAke2Jhc2VQYXRofS8qYCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplQ2FjaGUoY29uZmlnOiBDYWNoZUNvbmZpZyB8IHVuZGVmaW5lZCwgZm9yVGVzdGluZzogYm9vbGVhbikge1xuICAgIGNvbnN0IHsgc2V0Q2FjaGVNYW5hZ2VyUmVmIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9kZWNvcmF0b3JcIik7XG5cbiAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7IScIOuplOuqqOumrCDrk5zrnbzsnbTrsoQg7J6Q64+ZIOyCrOyaqVxuICAgIGlmIChmb3JUZXN0aW5nKSB7XG4gICAgICBjb25zdCB7IGNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2NhY2hlLW1hbmFnZXJcIik7XG4gICAgICB0aGlzLl9jYWNoZSA9IGNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIoKTtcbiAgICAgIHNldENhY2hlTWFuYWdlclJlZih0aGlzLl9jYWNoZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7ISk7KCV7J20IOyXhuycvOuptCDsupDsi5wg67mE7Zmc7ISx7ZmUXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHNldENhY2hlTWFuYWdlclJlZihudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDshKTsoJXsl5Ag65Sw6528IENhY2hlTWFuYWdlciDsg53shLFcbiAgICBjb25zdCB7IGNyZWF0ZUNhY2hlTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vY2FjaGUvY2FjaGUtbWFuYWdlclwiKTtcbiAgICB0aGlzLl9jYWNoZSA9IGNyZWF0ZUNhY2hlTWFuYWdlcihjb25maWcpO1xuICAgIHNldENhY2hlTWFuYWdlclJlZih0aGlzLl9jYWNoZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVXb3JrZmxvd3Mob3B0aW9uczogU29uYW11VGFza09wdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCB7IFdvcmtmbG93TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiKTtcbiAgICAvLyBOT1RFOiBAc29uYW11LWtpdC90YXNrcyDslYjsl5DshKAga25leCBjb25maWfrpbwg7IiY7KCV7ZWY6riwIOuVjOusuOyXkCBjb25uZWN0aW9u7J20IOyVhOuLjCBjb25maWcg7Ke466GcIOuztOuDheuLiOuLpC5cbiAgICB0aGlzLl93b3JrZmxvd3MgPSBuZXcgV29ya2Zsb3dNYW5hZ2VyKERCLmdldERCQ29uZmlnKFwid1wiKSk7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZW5hYmxlV29ya2VyID0gb3B0aW9ucy5lbmFibGVXb3JrZXIgPz8gaXNEYWVtb25TZXJ2ZXIoKTtcbiAgICBjb25zdCBkZWZhdWx0V29ya2VyT3B0aW9ucyA9IHtcbiAgICAgIGNvbmN1cnJlbmN5OiBvcy5jcHVzKCkubGVuZ3RoIC0gMSxcbiAgICAgIHVzZVB1YlN1YjogdHJ1ZSxcbiAgICAgIGxpc3RlbkRlbGF5OiA1MDAsXG4gICAgfTtcblxuICAgIGlmIChlbmFibGVXb3JrZXIpIHtcbiAgICAgIHRoaXMud29ya2Zsb3dzLnNldHVwV29ya2VyKHtcbiAgICAgICAgLi4uZGVmYXVsdFdvcmtlck9wdGlvbnMsXG4gICAgICAgIC4uLm9wdGlvbnMud29ya2VyT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYm9vdChzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSwgb3B0aW9uczogU29uYW11U2VydmVyT3B0aW9ucykge1xuICAgIGNvbnN0IHBvcnQgPSBvcHRpb25zLmxpc3Rlbj8ucG9ydCA/PyAzMDAwO1xuICAgIGNvbnN0IGhvc3QgPSBvcHRpb25zLmxpc3Rlbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuXG4gICAgc2VydmVyLmFkZEhvb2soXCJvbkNsb3NlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IG9wdGlvbnMubGlmZWN5Y2xlPy5vblNodXRkb3duPy4oc2VydmVyKTtcbiAgICAgIGF3YWl0IHRoaXMud29ya2Zsb3dzLmRlc3Ryb3koKTtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2h1dGRvd24gPSBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkdXJpbmcgc2h1dGRvd246XCIsIGVycik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCBzaHV0ZG93bik7XG4gICAgcHJvY2Vzcy5vbihcIlNJR1RFUk1cIiwgc2h1dGRvd24pO1xuXG4gICAgaWYgKG9wdGlvbnMubGlmZWN5Y2xlPy5vbkVycm9yKSB7XG4gICAgICBzZXJ2ZXIuc2V0RXJyb3JIYW5kbGVyKG9wdGlvbnMubGlmZWN5Y2xlPy5vbkVycm9yKTtcbiAgICB9XG5cbiAgICBzZXJ2ZXJcbiAgICAgIC5saXN0ZW4oeyBwb3J0LCBob3N0IH0pXG4gICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMud29ya2Zsb3dzLnN0YXJ0V29ya2VyKCk7XG4gICAgICAgIGF3YWl0IG9wdGlvbnMubGlmZWN5Y2xlPy5vblN0YXJ0Py4oc2VydmVyKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goYXN5bmMgKGVycikgPT4ge1xuICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJGYWlsZWQgdG8gc3RhcnQgc2VydmVyOlwiLCBlcnIpKTtcbiAgICAgICAgYXdhaXQgc2h1dGRvd24oKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVGaWxlQ2hhbmdlKGV2ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDssqsg67KI7Ke4IO2MjOydvOydtOuptCBITVIg7Iuc7J6RIOyLnOqwhCDquLDroZ1cbiAgICBpZiAodGhpcy5wZW5kaW5nRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmhtclN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZ0ZpbGVzLnB1c2goZmlsZVBhdGgpO1xuXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLmFwaVJvb3RQYXRoLCBmaWxlUGF0aCk7XG4gICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChgRGV0ZWN0ZWQoJHtldmVudH0pOiAke2NoYWxrLmJsdWUocmVsYXRpdmVQYXRoKX1gKSk7XG5cbiAgICBhd2FpdCB0aGlzLnN5bmNlci5zeW5jRnJvbVdhdGNoZXIoZXZlbnQsIGZpbGVQYXRoKTtcblxuICAgIC8vIOyymOumrCDsmYTro4zrkJwg7YyM7J287J2EIOuMgOq4sCDrqqnroZ3sl5DshJwg7KCc6rGwXG4gICAgdGhpcy5wZW5kaW5nRmlsZXMgPSB0aGlzLnBlbmRpbmdGaWxlcy5zbGljZSgxKTtcblxuICAgIC8vIOuqqOuToCDtjIzsnbwg7LKY66as6rCAIOyZhOujjOuQmOuptCDstZzsooUg66mU7Iuc7KeAIOy2nOugpVxuICAgIGlmICh0aGlzLnBlbmRpbmdGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuZmluaXNoSE1SKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5pc2hITVIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIucmVuZXdDaGVja3N1bXMoKTtcblxuICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHRvdGFsVGltZSA9IGVuZFRpbWUgLSB0aGlzLmhtclN0YXJ0VGltZTtcbiAgICBjb25zdCBbY2hhbGssIHsgY2VudGVyVGV4dCB9XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdCxcbiAgICAgIGltcG9ydChcIi4uL3V0aWxzL2NvbnNvbGUtdXRpbFwiKSxcbiAgICBdKTtcbiAgICBjb25zdCBtc2cgPSBgSE1SIERvbmUhICR7Y2hhbGsuYm9sZC53aGl0ZShgJHt0b3RhbFRpbWV9bXNgKX1gO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYmxhY2suYmdHcmVlbihjZW50ZXJUZXh0KG1zZykpKTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBCYXNlTW9kZWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2Jhc2UtbW9kZWxcIik7XG4gICAgLy8g66i87KCAIOyymOumrO2VtOyVvO2VqC5cbiAgICBhd2FpdCBCYXNlTW9kZWwuZGVzdHJveSgpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICB0aGlzLl93b3JrZmxvd3M/LmRlc3Ryb3koKSA/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIHRoaXMuX2NhY2hlPy5kaXNjb25uZWN0KCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICB0aGlzLndhdGNoZXI/LmNsb3NlKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICBsb2d0YXBlRGlzcG9zZSgpLFxuICAgIF0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBTb25hbXUgPSBuZXcgU29uYW11Q2xhc3MoKTtcblxuLyoqXG4gKiBzdHJlYW0g66qo65Oc7JeQ7IScIO2CpCDsg53shLEg7ZWo7IiY6rCAIOyngOygleuQmOyngCDslYrslZjsnYQg65WMIOyCrOyaqe2VmOuKlCDquLDrs7gg7ZWo7IiY7J6F64uI64ukLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0S2V5R2VuZXJhdG9yKGZpbGU6IHsgZmlsZW5hbWU6IHN0cmluZzsgbWltZXR5cGU6IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgY29uc3QgZXh0ID0gbWltZS5leHRlbnNpb24oZmlsZS5taW1ldHlwZSkgfHwgXCJiaW5cIjtcbiAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgcmFuZG9tID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCk7XG4gIHJldHVybiBgdXBsb2Fkcy8ke3RpbWVzdGFtcH0tJHtyYW5kb219LiR7ZXh0fWA7XG59XG4iXSwibmFtZXMiOlsiZGlzcG9zZSIsImxvZ3RhcGVEaXNwb3NlIiwiYXNzZXJ0IiwiQXN5bmNMb2NhbFN0b3JhZ2UiLCJmcyIsIm1pbWUiLCJsb29rdXAiLCJtaW1lTG9va3VwIiwib3MiLCJwYXRoIiwiQkFTRV9GSUVMRF9NQVBQSU5HUyIsImNvbnZlcnRGYXN0aWZ5SGVhZGVyc1RvU3RhbmRhcmQiLCJjcmVhdGVNb2NrU1NFRmFjdG9yeSIsIkRCIiwiaXNEYWVtb25TZXJ2ZXIiLCJtZXJnZSIsImFwcGx5Q2FjaGVIZWFkZXJzIiwiQ2FjaGVQcmVzZXRzIiwidG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24iLCJOYWl0ZSIsIkJ1ZmZlcmVkRmlsZSIsIlVwbG9hZGVkRmlsZSIsImV4aXN0cyIsImZpbGVFeGlzdHMiLCJnZXRTZWNyZXRzIiwiU29uYW11Q2xhc3MiLCJpc0luaXRpYWxpemVkIiwiZm9yVGVzdGluZyIsImFzeW5jTG9jYWxTdG9yYWdlIiwiZ2V0Q29udGV4dCIsInN0b3JlIiwiZ2V0U3RvcmUiLCJjb250ZXh0IiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwicmVxdWVzdCIsInJlcGx5IiwiaGVhZGVycyIsImNyZWF0ZVNTRSIsInNjaGVtYSIsIm5haXRlU3RvcmUiLCJNYXAiLCJFcnJvciIsIl9hcGlSb290UGF0aCIsImFwaVJvb3RQYXRoIiwiYXBwUm9vdFBhdGgiLCJzcGxpdCIsInNlcCIsInNsaWNlIiwiam9pbiIsIl9kYkNvbmZpZyIsImRiQ29uZmlnIiwiX3N5bmNlciIsInN5bmNlciIsIl9jb25maWciLCJjb25maWciLCJzZWNyZXRzIiwiX3N0b3JhZ2UiLCJzdG9yYWdlIiwiX2NhY2hlIiwiY2FjaGUiLCJfd29ya2Zsb3dzIiwid29ya2Zsb3dzIiwiX2F1dGgiLCJhdXRoIiwid2F0Y2hlciIsInBlbmRpbmdGaWxlcyIsImhtclN0YXJ0VGltZSIsInNlcnZlciIsImluaXRGb3JUZXN0aW5nIiwiaW5pdCIsInVuZGVmaW5lZCIsImRvU2lsZW50IiwiZW5hYmxlU3luYyIsImNoYWxrIiwiZGVmYXVsdCIsImNvbnNvbGUiLCJ0aW1lIiwiY3lhbiIsImZpbmRBcGlSb290UGF0aCIsImxvYWRDb25maWciLCJkYXRhYmFzZSIsImRlZmF1bHRPcHRpb25zIiwiY2xpZW50IiwiY29uZmlndXJlTG9nVGFwZSIsImxvZ2dpbmciLCJnZW5lcmF0ZURCQ29uZmlnIiwibG9nIiwiZ3JlZW4iLCJFbnRpdHlNYW5hZ2VyIiwiYXV0b2xvYWQiLCJpbml0aWFsaXplQ2FjaGUiLCJpbml0aWFsaXplV29ya2Zsb3dzIiwidGFza3MiLCJTeW5jZXIiLCJhdXRvbG9hZFR5cGVzIiwiYXV0b2xvYWRNb2RlbHMiLCJhdXRvbG9hZEFwaXMiLCJhdXRvbG9hZFdvcmtmbG93cyIsIlRlbXBsYXRlTWFuYWdlciIsImF1dG9sb2FkU1NSUm91dGVzIiwiaXNMb2NhbCIsImlzVGVzdCIsInNldHVwQmlvbWUiLCJpc0hvdFJlbG9hZFNlcnZlciIsInN5bmMiLCJzdGFydFdhdGNoZXIiLCJ0aW1lRW5kIiwiY3JlYXRlU2VydmVyIiwiaW5pdE9wdGlvbnMiLCJvcHRpb25zIiwiZmFzdGlmeSIsImdldExvZ1RhcGVGYXN0aWZ5TG9nZ2VyIiwibG9nZ2VyIiwiY2F0ZWdvcnkiLCJmYXN0aWZ5Q2F0ZWdvcnkiLCJTdG9yYWdlTWFuYWdlciIsInBsdWdpbnMiLCJyZWdpc3RlclBsdWdpbnMiLCJyZWdpc3RlckJldHRlckF1dGgiLCJ3aXRoRmFzdGlmeSIsImFwaUNvbmZpZyIsImJvb3QiLCJ0aW1lem9uZSIsImFwaSIsImZvcm1hdEluVGltZVpvbmUiLCJJU09fREFURV9SRUdFWCIsIkRBVEVfRk9STUFUIiwic2V0UmVwbHlTZXJpYWxpemVyIiwicGF5bG9hZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJfa2V5IiwidmFsdWUiLCJ0ZXN0IiwiRGF0ZSIsImdldCIsInJvdXRlIiwicHJlZml4IiwiX3JlcXVlc3QiLCJfcmVwbHkiLCJhcGlzIiwic29uYW11VUlBcGlQbHVnaW4iLCJyZWdpc3RlciIsIndlYlBhdGgiLCJoYXNXZWIiLCJwbHVnaW5Db21wcmVzcyIsImNvbXByZXNzIiwiZ2xvYmFsQ29tcHJlc3NPcHRpb25zIiwidGhyZXNob2xkIiwiZW5jb2RpbmdzIiwiY3VzdG9tVHlwZXMiLCJzZXR1cFZpdGVEZXZTZXJ2ZXIiLCJtb2RlbHMiLCJtb2RlbE5hbWUiLCJtZXRob2QiLCJodHRwTWV0aG9kIiwidXJsIiwiaGFuZGxlciIsImNyZWF0ZUFwaUhhbmRsZXIiLCJzZXR1cFN0YXRpY1dlYlNlcnZlciIsInZpdGVTZXJ2ZXIiLCJ2aXRlIiwicm9vdCIsIm1pZGRsZXdhcmVNb2RlIiwiaG1yIiwiYXBwVHlwZSIsInVzZSIsInJlcSIsInJlcyIsIm5leHQiLCJzdGFydHNXaXRoIiwibWlkZGxld2FyZXMiLCJnZXRTU1JSb3V0ZXMiLCJyZW5kZXJTU1IiLCJzc3JSb3V0ZXMiLCJwYXJhbXMiLCJleHRyYWN0UGF0aFBhcmFtcyIsImh0bWwiLCJ0eXBlIiwidGVtcGxhdGUiLCJyZWFkRmlsZSIsInRyYW5zZm9ybUluZGV4SHRtbCIsImUiLCJzc3JGaXhTdGFja3RyYWNlIiwiZXJyb3IiLCJzdGF0dXMiLCJtZXNzYWdlIiwiYWRkSG9vayIsImNsb3NlIiwiX3dlYlBhdGgiLCJ3ZWJEaXN0UGF0aCIsInNzclBhdGgiLCJzc3JFbnRyeVBhdGgiLCJzc3JSb3V0ZXNQYXRoIiwid2FybiIsInNzckF2YWlsYWJsZSIsInJlcXVlc3RlZEZpbGUiLCJmaWxlbmFtZSIsImFzc2V0c0RpciIsImFzc2V0UGF0aCIsImdldENhY2hlQ29udHJvbEZvckFzc2V0IiwiY2FjaGVSZXEiLCJjYWNoZUNvbnRyb2xIYW5kbGVyIiwicmVzdWx0IiwiaW1tdXRhYmxlIiwiZXh0IiwicG9wIiwiZmlsZXMiLCJyZWFkZGlyIiwiY3VycmVudEZpbGUiLCJmaW5kIiwiZiIsImVuZHNXaXRoIiwiZmlsZVBhdGgiLCJjb250ZW50Iiwic2VuZCIsImluY2x1ZGVzIiwiY29kZSIsImNzckNhY2hlUmVxIiwiY3NyQ2FjaGVDb25maWciLCJpbmRleFBhdGgiLCJjcmVhdGVDb250ZXh0IiwicnVuIiwiZ3VhcmRzIiwiZXZlcnkiLCJndWFyZCIsImd1YXJkSGFuZGxlciIsImdldFpvZE9iamVjdEZyb21BcGkiLCJSZXFUeXBlIiwidHlwZXMiLCJ3aGljaCIsInJlcUJvZHkiLCJidWZmZXJlZEZpbGVzIiwidXBsb2FkZWRGaWxlcyIsImJvZHkiLCJ1cGxvYWRPcHRpb25zIiwicGFydHMiLCJsaW1pdHMiLCJmaWVsZHMiLCJjb25zdW1lIiwicGFydCIsImJ1ZmZlciIsInRvQnVmZmVyIiwicHVzaCIsImZpZWxkbmFtZSIsIlN0cmluZyIsImRpc2tOYW1lIiwiZGVzdGluYXRpb24iLCJkaXNrIiwia2V5R2VuZXJhdG9yIiwiZGVmYXVsdEtleUdlbmVyYXRvciIsImtleSIsIm1pbWV0eXBlIiwicHV0U3RyZWFtIiwiZmlsZSIsImNvbnRlbnRUeXBlIiwiZ2V0VXJsIiwic2lnbmVkVXJsIiwiZ2V0U2lnbmVkVXJsIiwic2l6ZSIsImJ5dGVzUmVhZCIsInFzIiwicGFyc2VkIiwicGFyc2UiLCJPYmplY3QiLCJhc3NpZ24iLCJmYXN0aWZ5Q2FzdGVyIiwiWm9kRXJyb3IiLCJodW1hbml6ZVpvZEVycm9yIiwibWVzc2FnZXMiLCJtYXAiLCJpc3N1ZSIsIkJhZFJlcXVlc3RFeGNlcHRpb24iLCJ6b2RFcnJvciIsImFwaUNhY2hlQ29uZmlnIiwiZ2V0QXBpQ2FjaGVDb250cm9sIiwiQXBpUGFyYW1UeXBlIiwiYXJncyIsInBhcmFtZXRlcnMiLCJwYXJhbSIsImlzQ29udGV4dCIsIm5hbWUiLCJpbnZva2VNb2RlbE1ldGhvZCIsInBhdHRlcm4iLCJwYXR0ZXJuUGFydHMiLCJmaWx0ZXIiLCJCb29sZWFuIiwidXJsUGFydHMiLCJpIiwibGVuZ3RoIiwiY2FjaGVDb250cm9sIiwicm91dGVPcHRpb25zIiwiaW52b2tlQXBpRm9yU1NSIiwicGFyYW1zSW5kZXgiLCJtb2RlbCIsIm1ldGhvZE5hbWUiLCJhcHBseSIsImNyZWF0ZVNTRUZhY3RvcnkiLCJfZXZlbnRzIiwic29ja2V0IiwiYmluZCIsImxvY2FsZSIsImRldGVjdExvY2FsZSIsImkxOG4iLCJzdXBwb3J0ZWRMb2NhbGVzIiwiZGVmYXVsdExvY2FsZSIsInNlc3Npb24iLCJnZXRTZXNzaW9uIiwiUHJvbWlzZSIsInJlc29sdmUiLCJjb250ZXh0UHJvdmlkZXIiLCJjcmVhdGVTdG9yZSIsInVzZXIiLCJhY2NlcHRMYW5ndWFnZSIsInN1cHBvcnRlZCIsImxhbmdzIiwibGFuZyIsInRyaW0iLCJ3YXRjaFBhdGgiLCJjaG9raWRhciIsIndhdGNoIiwiaWdub3JlZCIsInN0YXRzIiwiaXNGaWxlIiwicGVyc2lzdGVudCIsImlnbm9yZUluaXRpYWwiLCJvbiIsImV2ZW50IiwiYWJzb2x1dGVQYXRoIiwiaXNDb25maWdUcyIsInJlbGF0aXZlUGF0aCIsInJlcGxhY2UiLCJib2xkIiwiYmx1ZSIsImtpbGwiLCJwaWQiLCJoYW5kbGVGaWxlQ2hhbmdlIiwicnVuU2NyaXB0IiwiZm4iLCJkZXN0cm95IiwiY29tcHJlc3NQbHVnaW4iLCJwbHVnaW5zTW9kdWxlcyIsImNvcnMiLCJmb3JtYm9keSIsIm11bHRpcGFydCIsInNzZSIsInN0YXRpYyIsInJlZ2lzdGVyUGx1Z2luIiwicGx1Z2luTmFtZSIsIm9wdGlvbiIsImVudHJpZXMiLCJjdXN0b20iLCJiYXNlUGF0aCIsIm1lcmdlZEZpZWxkTWFwcGluZ3MiLCJiZXR0ZXJBdXRoIiwiUG9vbCIsImdldERCQ29uZmlnIiwiY29ubmVjdGlvbiIsIlVSTCIsImhvc3QiLCJSZXF1ZXN0IiwidG9TdHJpbmciLCJyZXNwb25zZSIsImZvckVhY2giLCJoZWFkZXIiLCJ0ZXh0Iiwic2V0Q2FjaGVNYW5hZ2VyUmVmIiwiY3JlYXRlVGVzdENhY2hlTWFuYWdlciIsImNyZWF0ZUNhY2hlTWFuYWdlciIsIldvcmtmbG93TWFuYWdlciIsImVuYWJsZVdvcmtlciIsImRlZmF1bHRXb3JrZXJPcHRpb25zIiwiY29uY3VycmVuY3kiLCJjcHVzIiwidXNlUHViU3ViIiwibGlzdGVuRGVsYXkiLCJzZXR1cFdvcmtlciIsIndvcmtlck9wdGlvbnMiLCJwb3J0IiwibGlzdGVuIiwibGlmZWN5Y2xlIiwib25TaHV0ZG93biIsInNodXRkb3duIiwiZXhpdCIsImVyciIsIm9uRXJyb3IiLCJzZXRFcnJvckhhbmRsZXIiLCJ0aGVuIiwic3RhcnRXb3JrZXIiLCJvblN0YXJ0IiwiY2F0Y2giLCJyZWQiLCJub3ciLCJyZWxhdGl2ZSIsInN5bmNGcm9tV2F0Y2hlciIsImZpbmlzaEhNUiIsInJlbmV3Q2hlY2tzdW1zIiwiZW5kVGltZSIsInRvdGFsVGltZSIsImNlbnRlclRleHQiLCJhbGwiLCJtc2ciLCJ3aGl0ZSIsImJsYWNrIiwiYmdHcmVlbiIsIkJhc2VNb2RlbCIsImFsbFNldHRsZWQiLCJkaXNjb25uZWN0IiwiU29uYW11IiwiZXh0ZW5zaW9uIiwidGltZXN0YW1wIiwicmFuZG9tIiwiTWF0aCJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsV0FBV0MsY0FBYyxRQUFRLG1CQUFtQjtBQUM3RCxPQUFPQyxZQUFZLFNBQVM7QUFDNUIsU0FBU0MsaUJBQWlCLFFBQVEsY0FBYztBQUloRCxPQUFPQyxRQUFRLG1CQUFjO0FBRTdCLE9BQU9DLFFBQVFDLFVBQVVDLFVBQVUsUUFBUSxhQUFhO0FBQ3hELE9BQU9DLFFBQVEsS0FBSztBQUNwQixPQUFPQyxVQUFVLE9BQU87QUFHeEIsU0FDRUMsbUJBQW1CLEVBQ25CQywrQkFBK0IsRUFDL0JDLG9CQUFvQixFQUNwQkMsRUFBRSxFQUNGQyxjQUFjLEVBQ2RDLEtBQUssUUFDQSxjQUFLO0FBRVosU0FBU0MsaUJBQWlCLEVBQUVDLFlBQVksUUFBUSxvQ0FBaUM7QUFFakYsU0FBU0MsdUJBQXVCLFFBQVEsMEJBQXVCO0FBSS9ELFNBQVNDLEtBQUssUUFBUSxvQkFBaUI7QUFDdkMsU0FBU0MsWUFBWSxRQUFRLDhCQUEyQjtBQUd4RCxTQUFTQyxZQUFZLFFBQVEsOEJBQTJCO0FBSXhELFNBQVNDLE1BQU0sRUFBRUMsVUFBVSxRQUFRLHVCQUFvQjtBQUt2RCxTQUFTQyxVQUFVLFFBQTRCLGNBQVc7QUFFMUQsTUFBTUM7SUFDR0MsZ0JBQXlCLE1BQU07SUFDL0JDLGFBQXNCLE1BQU07SUFDNUJDLG9CQUVGLElBQUl6QixvQkFBb0I7SUFFdEIwQixhQUFzQjtRQUMzQixNQUFNQyxRQUFRLElBQUks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
1120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvc29uYW11LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpc3Bvc2UgYXMgbG9ndGFwZURpc3Bvc2UgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gXCJhc3luY19ob29rc1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoIH0gZnJvbSBcImJldHRlci1hdXRoXCI7XG5pbXBvcnQgdHlwZSB7IEZTV2F0Y2hlciB9IGZyb20gXCJjaG9raWRhclwiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5SW5zdGFuY2UsIEZhc3RpZnlSZXBseSwgRmFzdGlmeVJlcXVlc3QgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlciwgU2VydmVyUmVzcG9uc2UgfSBmcm9tIFwiaHR0cFwiO1xuaW1wb3J0IG1pbWUsIHsgbG9va3VwIGFzIG1pbWVMb29rdXAgfSBmcm9tIFwibWltZS10eXBlc1wiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUG9vbENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuaW1wb3J0IHR5cGUgeyBab2RPYmplY3QgfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQge1xuICBCQVNFX0ZJRUxEX01BUFBJTkdTLFxuICBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkLFxuICBjcmVhdGVNb2NrU1NFRmFjdG9yeSxcbiAgREIsXG4gIGlzRGFlbW9uU2VydmVyLFxuICBtZXJnZSxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG59IGZyb20gXCIuLlwiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZUNvbmZpZywgQ2FjaGVNYW5hZ2VyIH0gZnJvbSBcIi4uL2NhY2hlL3R5cGVzXCI7XG5pbXBvcnQgeyBhcHBseUNhY2hlSGVhZGVycywgQ2FjaGVQcmVzZXRzIH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvY2FjaGUtY29udHJvbFwiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZUNvbnRyb2xDb25maWcsIENhY2hlQ29udHJvbFJlcXVlc3QgfSBmcm9tIFwiLi4vY2FjaGUtY29udHJvbC90eXBlc1wiO1xuaW1wb3J0IHsgdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24gfSBmcm9tIFwiLi4vY29tcHJlc3MvY29tcHJlc3NcIjtcbmltcG9ydCB0eXBlIHsgQ29tcHJlc3NPcHRpb25zIH0gZnJvbSBcIi4uL2NvbXByZXNzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi9kaWN0L3NkXCI7XG5pbXBvcnQgdHlwZSB7IExvY2FsaXplZFN0cmluZyB9IGZyb20gXCIuLi9kaWN0L3R5cGVzXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgQnVmZmVyZWRGaWxlIH0gZnJvbSBcIi4uL3N0b3JhZ2UvYnVmZmVyZWQtZmlsZVwiO1xuaW1wb3J0IHR5cGUgeyBTdG9yYWdlTWFuYWdlciB9IGZyb20gXCIuLi9zdG9yYWdlL3N0b3JhZ2UtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBLZXlHZW5lcmF0b3IgfSBmcm9tIFwiLi4vc3RvcmFnZS90eXBlc1wiO1xuaW1wb3J0IHsgVXBsb2FkZWRGaWxlIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdXBsb2FkZWQtZmlsZVwiO1xuaW1wb3J0IHR5cGUgeyBTeW5jZXIgfSBmcm9tIFwiLi4vc3luY2VyL3N5bmNlclwiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd01hbmFnZXIgfSBmcm9tIFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVGYXN0aWZ5Q29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBleGlzdHMsIGZpbGVFeGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11Q29uZmlnLCBTb25hbXVTZXJ2ZXJPcHRpb25zLCBTb25hbXVUYXNrT3B0aW9ucyB9IGZyb20gXCIuL2NvbmZpZ1wiO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBFeHRlbmRlZEFwaSB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IGdldFNlY3JldHMsIHR5cGUgU29uYW11U2VjcmV0cyB9IGZyb20gXCIuL3NlY3JldFwiO1xuXG5jbGFzcyBTb25hbXVDbGFzcyB7XG4gIHB1YmxpYyBpc0luaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBmb3JUZXN0aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBhc3luY0xvY2FsU3RvcmFnZTogQXN5bmNMb2NhbFN0b3JhZ2U8e1xuICAgIGNvbnRleHQ6IENvbnRleHQ7XG4gIH0+ID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlKCk7XG5cbiAgcHVibGljIGdldENvbnRleHQoKTogQ29udGV4dCB7XG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgaWYgKHN0b3JlPy5jb250ZXh0KSB7XG4gICAgICByZXR1cm4gc3RvcmUuY29udGV4dCBhcyBDb250ZXh0O1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIC8vIO2FjOyKpO2MhSDtmZjqsr3sl5DshJwg7Luo7YWN7Iqk7Yq46rCAIOyjvOyeheuQmOyngCDslYrsnYAg6rK97JqwIOu5iCDsu6jthY3siqTtirgg66as7YS0XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXF1ZXN0OiBudWxsLFxuICAgICAgICByZXBseTogbnVsbCxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGNyZWF0ZVNTRTogKHNjaGVtYTogWm9kT2JqZWN0KSA9PiBjcmVhdGVNb2NrU1NFRmFjdG9yeShzY2hlbWEpLFxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IO2FjOyKpO2MhSDtmZjqsr3sl5DshJwg7Luo7YWN7Iqk7Yq46rCAIOyjvOyeheuQmOyngCDslYrsnYAg6rK97JqwIOu5iCDsu6jthY3siqTtirgg66as7YS0XG4gICAgICAgIG5haXRlU3RvcmU6IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCksXG4gICAgICB9IGFzIHVua25vd24gYXMgQ29udGV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGNhbm5vdCBmaW5kIGNvbnRleHRcIik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXBpUm9vdFBhdGg6IEFic29sdXRlUGF0aCB8IG51bGwgPSBudWxsO1xuICBzZXQgYXBpUm9vdFBhdGgoYXBpUm9vdFBhdGg6IEFic29sdXRlUGF0aCkge1xuICAgIHRoaXMuX2FwaVJvb3RQYXRoID0gYXBpUm9vdFBhdGg7XG4gIH1cbiAgZ2V0IGFwaVJvb3RQYXRoKCk6IEFic29sdXRlUGF0aCB7XG4gICAgaWYgKHRoaXMuX2FwaVJvb3RQYXRoID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYXBpUm9vdFBhdGg7XG4gIH1cbiAgZ2V0IGFwcFJvb3RQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXBpUm9vdFBhdGguc3BsaXQocGF0aC5zZXApLnNsaWNlKDAsIC0xKS5qb2luKHBhdGguc2VwKTtcbiAgfVxuXG4gIHByaXZhdGUgX2RiQ29uZmlnOiBTb25hbXVEQkNvbmZpZyB8IG51bGwgPSBudWxsO1xuICBzZXQgZGJDb25maWcoZGJDb25maWc6IFNvbmFtdURCQ29uZmlnKSB7XG4gICAgdGhpcy5fZGJDb25maWcgPSBkYkNvbmZpZztcbiAgfVxuICBnZXQgZGJDb25maWcoKTogU29uYW11REJDb25maWcge1xuICAgIGlmICh0aGlzLl9kYkNvbmZpZyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2RiQ29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3luY2VyOiBTeW5jZXIgfCBudWxsID0gbnVsbDtcbiAgc2V0IHN5bmNlcihzeW5jZXI6IFN5bmNlcikge1xuICAgIHRoaXMuX3N5bmNlciA9IHN5bmNlcjtcbiAgfVxuICBnZXQgc3luY2VyKCk6IFN5bmNlciB7XG4gICAgaWYgKHRoaXMuX3N5bmNlciA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N5bmNlcjtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbmZpZzogU29uYW11Q29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNldCBjb25maWcoY29uZmlnOiBTb25hbXVDb25maWcpIHtcbiAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gIH1cbiAgZ2V0IGNvbmZpZygpOiBTb25hbXVDb25maWcge1xuICAgIGlmICh0aGlzLl9jb25maWcgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgc2VjcmV0czogU29uYW11U2VjcmV0cyA9IGdldFNlY3JldHMoKTtcblxuICBwcml2YXRlIF9zdG9yYWdlOiBTdG9yYWdlTWFuYWdlciB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogU3RvcmFnZU1hbmFnZXIg7J247Iqk7YS07IqkXG4gICAqL1xuICBnZXQgc3RvcmFnZSgpOiBTdG9yYWdlTWFuYWdlciB7XG4gICAgaWYgKCF0aGlzLl9zdG9yYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdG9yYWdlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgc3RvcmFnZSBjb25maWcuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3RvcmFnZTtcbiAgfVxuXG4gIHByaXZhdGUgX2NhY2hlOiBDYWNoZU1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIENhY2hlTWFuYWdlciDsnbjsiqTthLTsiqQgKEJlbnRvQ2FjaGUpXG4gICAqL1xuICBnZXQgY2FjaGUoKTogQ2FjaGVNYW5hZ2VyIHtcbiAgICBpZiAoIXRoaXMuX2NhY2hlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIENoZWNrIGNhY2hlIGNvbmZpZyBpbiBzb25hbXUuY29uZmlnLnRzLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlO1xuICB9XG5cbiAgcHJpdmF0ZSBfd29ya2Zsb3dzOiBXb3JrZmxvd01hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgZ2V0IHdvcmtmbG93cygpOiBXb3JrZmxvd01hbmFnZXIge1xuICAgIGlmICh0aGlzLl93b3JrZmxvd3MgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3dvcmtmbG93cztcbiAgfVxuXG4gIHByaXZhdGUgX2F1dGg6IEF1dGggfCBudWxsID0gbnVsbDtcbiAgZ2V0IGF1dGgoKTogQXV0aCB7XG4gICAgaWYgKCF0aGlzLl9hdXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdXRoIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgYXV0aCBjb25maWcgaW4gc29uYW11LmNvbmZpZy50cy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hdXRoO1xuICB9XG5cbiAgLy8gSE1SIOyymOumrFxuICBwdWJsaWMgd2F0Y2hlcjogRlNXYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGVuZGluZ0ZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIGhtclN0YXJ0VGltZTogbnVtYmVyID0gMDtcblxuICBwdWJsaWMgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UgfCBudWxsID0gbnVsbDtcblxuICBhc3luYyBpbml0Rm9yVGVzdGluZygpIHtcbiAgICBhd2FpdCB0aGlzLmluaXQodHJ1ZSwgZmFsc2UsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cblxuICBhc3luYyBpbml0KFxuICAgIGRvU2lsZW50OiBib29sZWFuID0gZmFsc2UsXG4gICAgZW5hYmxlU3luYzogYm9vbGVhbiA9IHRydWUsXG4gICAgYXBpUm9vdFBhdGg/OiBBYnNvbHV0ZVBhdGgsXG4gICAgZm9yVGVzdGluZzogYm9vbGVhbiA9IGZhbHNlLFxuICApIHtcbiAgICB0aGlzLmZvclRlc3RpbmcgPSBmb3JUZXN0aW5nO1xuXG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZG9TaWxlbnQpIHtcbiAgICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgICAgY29uc29sZS50aW1lKGNoYWxrLmN5YW4oYFNvbmFtdS5pbml0JHtmb3JUZXN0aW5nID8gXCIgZm9yIHRlc3RpbmdcIiA6IFwiXCJ9YCkpO1xuICAgIH1cblxuICAgIC8vIEFQSSDro6jtirgg7Yyo7IqkXG4gICAgY29uc3QgeyBmaW5kQXBpUm9vdFBhdGggfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3V0aWxzXCIpO1xuICAgIHRoaXMuYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aCA/PyBmaW5kQXBpUm9vdFBhdGgoKTtcblxuICAgIC8vIOyEpOygleydhCDroZzrlKntlZjripQg6rKD67aA7YSwIOyLnOyekVxuICAgIGNvbnN0IHsgbG9hZENvbmZpZyB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jb25maWdcIik7XG4gICAgdGhpcy5jb25maWcgPSBhd2FpdCBsb2FkQ29uZmlnKHRoaXMuYXBpUm9vdFBhdGgpO1xuICAgIC8vIHNvbmFtdS5jb25maWcudHMg6riw67O46rCSIOyEpOyglVxuICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlID0gdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPz8gXCJwZ1wiO1xuICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRlZmF1bHRPcHRpb25zLmNsaWVudCA9IHRoaXMuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlID8/IFwicGdcIjtcblxuICAgIC8vIOuhnOq5hSDshKTsoJVcbiAgICBjb25zdCB7IGNvbmZpZ3VyZUxvZ1RhcGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2xvZ2dlci9jb25maWd1cmVcIik7XG4gICAgaWYgKHRoaXMuY29uZmlnLmxvZ2dpbmcgIT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCBjb25maWd1cmVMb2dUYXBlKHtcbiAgICAgICAgLi4udGhpcy5jb25maWcubG9nZ2luZyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERCIOuhnOuTnFxuICAgIGNvbnN0IHsgREIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2RiXCIpO1xuICAgIHRoaXMuZGJDb25maWcgPSBEQi5nZW5lcmF0ZURCQ29uZmlnKHRoaXMuY29uZmlnLmRhdGFiYXNlKTtcbiAgICBpZiAoIWRvU2lsZW50KSB7XG4gICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKFwiREIgQ29uZmlnIExvYWRlZCFcIikpO1xuICAgIH1cblxuICAgIC8vIEVudGl0eSDroZzrk5xcbiAgICAvLyDthYzsiqTtirjsl5DshJzrj4QgRW50aXR5IOygleuztOuKlCDtlYTsmpTtlanri4jri6QuXG4gICAgLy8gdXBzZXJ06rCAIOygnOuMgOuhnCDsnpHrj5ntlZjroKTrqbQgZW50aXR57J2YIHVuaXF1ZSBpbmRleCDsoJXrs7TqsIAg7ZWE7JqU7ZWY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKGRvU2lsZW50KTtcblxuICAgIC8vIENhY2hlIOy0iOq4sO2ZlFxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUNhY2hlKHRoaXMuY29uZmlnLnNlcnZlci5jYWNoZSwgZm9yVGVzdGluZyk7XG5cbiAgICAvLyDthYzsiqTtjIXsnbgg6rK97JqwIOyLse2BrCDsl4bsnbQg7KSR64uoXG4gICAgaWYgKGZvclRlc3RpbmcpIHtcbiAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGFzayDrk7HroZ1cbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVXb3JrZmxvd3ModGhpcy5jb25maWcudGFza3MpO1xuXG4gICAgLy8gU3luY2VyXG4gICAgY29uc3QgeyBTeW5jZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N5bmNlci9zeW5jZXJcIik7XG4gICAgdGhpcy5zeW5jZXIgPSBuZXcgU3luY2VyKCk7XG5cbiAgICAvLyBBdXRvbG9hZDogTW9kZWxzIC8gVHlwZXMgLyBBUElzIC8gV29ya2Zsb3dzIC8gVGVtcGxhdGVzIC8gU1NSIFJvdXRlc1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkQXBpcygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkV29ya2Zsb3dzKCk7XG4gICAgY29uc3QgeyBUZW1wbGF0ZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3RlbXBsYXRlXCIpO1xuICAgIGF3YWl0IFRlbXBsYXRlTWFuYWdlci5hdXRvbG9hZCgpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkU1NSUm91dGVzKCk7XG5cbiAgICBjb25zdCB7IGlzTG9jYWwsIGlzVGVzdCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICAvLyDroZzsu6zsl5DshJzripQg7L2U65OcIOyDneyEseydhCDsnITtlbQgQmlvbWUg7IWL7JeF7J20IO2VhOyalO2VqCAo7ZiE7J6sIGFwaVJvb3RQYXRoIOyghOuLrO2VmOyXrCDsi6TtlokpXG4gICAgICAoYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvZm9ybWF0dGVyXCIpKS5zZXR1cEJpb21lKHRoaXMuYXBpUm9vdFBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaXNIb3RSZWxvYWRTZXJ2ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIik7XG4gICAgaWYgKGlzTG9jYWwoKSAmJiAhaXNUZXN0KCkgJiYgaXNIb3RSZWxvYWRTZXJ2ZXIoKSAmJiBlbmFibGVTeW5jKSB7XG4gICAgICBhd2FpdCB0aGlzLnN5bmNlci5zeW5jKCk7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0V2F0Y2hlcigpO1xuICAgIH1cblxuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgaWYgKCFkb1NpbGVudCkge1xuICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICBjb25zb2xlLnRpbWVFbmQoY2hhbGsuY3lhbihcIlNvbmFtdS5pbml0XCIpKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVTZXJ2ZXIoaW5pdE9wdGlvbnM/OiB7IGVuYWJsZVN5bmM/OiBib29sZWFuOyBkb1NpbGVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXQoaW5pdE9wdGlvbnM/LmRvU2lsZW50LCBpbml0T3B0aW9ucz8uZW5hYmxlU3luYyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuY29uZmlnLnNlcnZlcjtcbiAgICBjb25zdCB7IGRlZmF1bHQ6IGZhc3RpZnkgfSA9IGF3YWl0IGltcG9ydChcImZhc3RpZnlcIik7XG4gICAgY29uc3QgeyBnZXRMb2dUYXBlRmFzdGlmeUxvZ2dlciB9ID0gYXdhaXQgaW1wb3J0KFwiQGxvZ3RhcGUvZmFzdGlmeVwiKTtcbiAgICBjb25zdCBzZXJ2ZXIgPSBmYXN0aWZ5KHtcbiAgICAgIC4uLm9wdGlvbnMuZmFzdGlmeSxcbiAgICAgIGxvZ2dlcjpcbiAgICAgICAgdGhpcy5jb25maWcubG9nZ2luZyAhPT0gZmFsc2VcbiAgICAgICAgICA/IGdldExvZ1RhcGVGYXN0aWZ5TG9nZ2VyKHtcbiAgICAgICAgICAgICAgY2F0ZWdvcnk6IHRoaXMuY29uZmlnLmxvZ2dpbmc/LmZhc3RpZnlDYXRlZ29yeSA/PyBbXCJmYXN0aWZ5XCJdLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcblxuICAgIC8vIFN0b3JhZ2Ug7ISk7KCVIOKGkiBTdG9yYWdlTWFuYWdlciDsg53shLFcbiAgICBpZiAob3B0aW9ucy5zdG9yYWdlKSB7XG4gICAgICBjb25zdCB7IFN0b3JhZ2VNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zdG9yYWdlL3N0b3JhZ2UtbWFuYWdlclwiKTtcbiAgICAgIHRoaXMuX3N0b3JhZ2UgPSBuZXcgU3RvcmFnZU1hbmFnZXIob3B0aW9ucy5zdG9yYWdlKTtcbiAgICB9XG5cbiAgICAvLyDtlIzrn6zqt7jsnbgg65Ox66GdXG4gICAgaWYgKG9wdGlvbnMucGx1Z2lucykge1xuICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclBsdWdpbnMoc2VydmVyLCBvcHRpb25zLnBsdWdpbnMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmF1dGgpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJCZXR0ZXJBdXRoKHNlcnZlciwgb3B0aW9ucy5hdXRoKTtcbiAgICB9XG5cbiAgICAvLyBBUEkg65287Jqw7YyFIOyEpOyglVxuICAgIGF3YWl0IHRoaXMud2l0aEZhc3RpZnkoc2VydmVyLCBvcHRpb25zLmFwaUNvbmZpZywge1xuICAgICAgZW5hYmxlU3luYzogaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMsXG4gICAgICBkb1NpbGVudDogaW5pdE9wdGlvbnM/LmRvU2lsZW50LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyLnOyekVxuICAgIGF3YWl0IHRoaXMuYm9vdChzZXJ2ZXIsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHNlcnZlcjtcbiAgfVxuXG4gIGFzeW5jIHdpdGhGYXN0aWZ5KFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBlbmFibGVTeW5jPzogYm9vbGVhbjtcbiAgICAgIGRvU2lsZW50PzogYm9vbGVhbjtcbiAgICB9LFxuICApIHtcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0KG9wdGlvbnM/LmRvU2lsZW50LCBvcHRpb25zPy5lbmFibGVTeW5jKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcblxuICAgIC8vIHRpbWV6b25lIOyEpOyglVxuICAgIGNvbnN0IHRpbWV6b25lID0gdGhpcy5jb25maWcuYXBpLnRpbWV6b25lO1xuICAgIGlmICh0aW1lem9uZSkge1xuICAgICAgLy8g7YOA7J6E7KG07JeQIOunnuqyjCDsnZHri7Ug64Kg7KecIOyKpO2KuOungeydhCDrs4DtmZjtlbTso7zslrTslbwg7ZWp64uI64ukLlxuICAgICAgLy8g6rCA66C5IHRpbWV6b25l7J20IFwiQXNpYS9TZW91bFwiIOydtOuptFxuICAgICAgLy8gXCIyMDI1LTExLTIxVDAwOjAwOjAwLjAwMFpcIiDrpbwgXCIyMDI1LTExLTIxVDA5OjAwOjAwKzA5OjAwXCIg7Jy866GcIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICBjb25zdCB7IGZvcm1hdEluVGltZVpvbmUgfSA9IGF3YWl0IGltcG9ydChcImRhdGUtZm5zLXR6XCIpO1xuXG4gICAgICAvLyBJU08gODYwMSDrgqDsp5wg7ZiV7IudIOygleq3nOyLnSAo7JiIOiAyMDI0LTAxLTE1VDA5OjMwOjAwLjAwMFopXG4gICAgICBjb25zdCBJU09fREFURV9SRUdFWCA9IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oXFwuXFxkezN9KT9aJC87XG5cbiAgICAgIC8vIFTrpbwg65GY65+s7Iu8IOyekeydgOuUsOyYtO2RnOqwgCDsl4bri6TrqbQgXCIyMDI1LTExLTE5MTc2MzU0NjE4OTAwMDE4OjU2OjI5KzA5OjAwXCLsmYAg6rCZ7J2AIOqysOqzvOqwgCDrgpjsmLXri4jri6QuXG4gICAgICAvLyDsnbTripQgZGF0ZS1mbnMg7Yq57J6F64uI64ukLlxuICAgICAgLy8g7J2066CH6rKMIO2VtOuPhCDqtJzssK7sirXri4jri6QuIFwiMjAyNS0xMS0xOVQxODo1NjoyOSswOTowMFwiIOuqqOyWkeycvOuhnCDsnpgg64KY7Ji164uI64ukLlxuICAgICAgY29uc3QgREFURV9GT1JNQVQgPSBcInl5eXktTU0tZGQnVCdISDptbTpzc1hYWFwiO1xuXG4gICAgICBzZXJ2ZXIuc2V0UmVwbHlTZXJpYWxpemVyKChwYXlsb2FkKSA9PiB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwYXlsb2FkLCAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIElTT19EQVRFX1JFR0VYLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0SW5UaW1lWm9uZShcbiAgICAgICAgICAgICAgbmV3IERhdGUodmFsdWUpLFxuICAgICAgICAgICAgICB0aW1lem9uZSBhcyBgJHtzdHJpbmd9LyR7c3RyaW5nfWAsXG4gICAgICAgICAgICAgIERBVEVfRk9STUFULFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFvcHRpb25zPy5kb1NpbGVudCkge1xuICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYFRpbWV6b25lIHNldCB0byAke3RpbWV6b25lfWApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDsoITssrQg65287Jqw7YyFIOumrOyKpO2KuFxuICAgIHNlcnZlci5nZXQoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS9yb3V0ZXNgLFxuICAgICAgYXN5bmMgKF9yZXF1ZXN0LCBfcmVwbHkpOiBQcm9taXNlPHR5cGVvZiB0aGlzLnN5bmNlci5hcGlzPiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNlci5hcGlzO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gSGVhbHRoY2hlY2sgQVBJXG4gICAgc2VydmVyLmdldChcbiAgICAgIGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9L2hlYWx0aGNoZWNrYCxcbiAgICAgIGFzeW5jIChfcmVxdWVzdCwgX3JlcGx5KTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgcmV0dXJuIFwib2tcIjtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIFNvbmFtdSBVSSBBUEkgKOuhnOy7rCDtmZjqsr3sl5DshJzrp4wpXG4gICAgY29uc3QgeyBpc0xvY2FsIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIGNvbnN0IHsgc29uYW11VUlBcGlQbHVnaW4gfSA9IGF3YWl0IGltcG9ydChcIi4uL3VpL2FwaVwiKTtcbiAgICAgIHNlcnZlci5yZWdpc3Rlcihzb25hbXVVSUFwaVBsdWdpbik7XG4gICAgfVxuXG4gICAgY29uc3Qgd2ViUGF0aCA9IHBhdGguam9pbih0aGlzLmFwcFJvb3RQYXRoLCBcIndlYlwiKTtcbiAgICBjb25zdCBoYXNXZWIgPSBhd2FpdCBleGlzdHMod2ViUGF0aCk7XG5cbiAgICAvLyDsoITsl60gY29tcHJlc3Mg7Ji17IWYIOqzhOyCsCAocm91dGUuY29tcHJlc3M6IHRydWXsnbwg65WMIOyCrOyaqSlcbiAgICBjb25zdCBwbHVnaW5Db21wcmVzcyA9IHRoaXMuY29uZmlnLnNlcnZlci5wbHVnaW5zPy5jb21wcmVzcztcbiAgICBjb25zdCBnbG9iYWxDb21wcmVzc09wdGlvbnM6IENvbXByZXNzT3B0aW9ucyB8IHVuZGVmaW5lZCA9IHBsdWdpbkNvbXByZXNzXG4gICAgICA/IHBsdWdpbkNvbXByZXNzID09PSB0cnVlXG4gICAgICAgID8geyB0aHJlc2hvbGQ6IDEwMjQsIGVuY29kaW5nczogW1wiYnJcIiwgXCJnemlwXCIsIFwiZGVmbGF0ZVwiXSB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgdGhyZXNob2xkOiBwbHVnaW5Db21wcmVzcy50aHJlc2hvbGQsXG4gICAgICAgICAgICBlbmNvZGluZ3M6IHBsdWdpbkNvbXByZXNzLmVuY29kaW5ncyxcbiAgICAgICAgICAgIGN1c3RvbVR5cGVzOiBwbHVnaW5Db21wcmVzcy5jdXN0b21UeXBlcyxcbiAgICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIC8vIOuhnOy7rCDqsJzrsJwg7ZmY6rK9OiBjYXRjaC1hbGzroZwgQVBJ66W8IOuPmeyggSDrp6Tsua3tlZjsl6wgSE1S7J2EIOyngOybkO2VqeuLiOuLpC5cbiAgICAgIC8vIFNPTkFNVV9ESVNBQkxFX0lOVEVHUkFURURfV0VCPXllc+uhnCDshKTsoJXtlZjrqbQgZGV2X2FwaSDrqqjrk5zsl5DshJwgVml0ZSDthrXtlansnYQg67mE7Zmc7ISx7ZmU7ZWgIOyImCDsnojsirXri4jri6QuXG4gICAgICBjb25zdCBkaXNhYmxlSW50ZWdyYXRlZFdlYiA9IHByb2Nlc3MuZW52LlNPTkFNVV9ESVNBQkxFX0lOVEVHUkFURURfV0VCID09PSBcInllc1wiO1xuICAgICAgaWYgKGhhc1dlYiAmJiAhZGlzYWJsZUludGVncmF0ZWRXZWIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXR1cERldlNlcnZlcldpdGhWaXRlKHNlcnZlciwgd2ViUGF0aCwgY29uZmlnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0dXBEZXZTZXJ2ZXIoc2VydmVyLCBjb25maWcpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyDtlITroZzrjZXshZgg7ZmY6rK9OiDqsJzrs4QgQVBJIOudvOyasO2KuCArIOygleyggSDtjIzsnbwg7ISc67mZXG4gICAgICBmb3IgKGNvbnN0IGFwaSBvZiB0aGlzLnN5bmNlci5hcGlzKSB7XG4gICAgICAgIGlmICh0aGlzLnN5bmNlci5tb2RlbHNbYXBpLm1vZGVsTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KCV7J2Y65CY7KeAIOyViuydgCDrqqjrjbjsl5Ag7KCR6re8ICR7YXBpLm1vZGVsTmFtZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgICAgbWV0aG9kOiBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCIsXG4gICAgICAgICAgdXJsOiB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGgsXG4gICAgICAgICAgaGFuZGxlcjogdGhpcy5jcmVhdGVBcGlIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgICBjb21wcmVzczogdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24oYXBpLm9wdGlvbnMuY29tcHJlc3MsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyDtlITroZzrjZXshZjsl5DshJzripQgd2ViIOyGjOyKpChhcHBSb290L3dlYikg7Jyg66y07JmAIOustOq0gO2VmOqyjCxcbiAgICAgIC8vIGFwaS93ZWItZGlzdCDsobTsnqwg7Jes67aA66W8IHNldHVwU3RhdGljV2ViU2VydmVyIOuCtOu2gOyXkOyEnCDtjJDri6jtlanri4jri6QuXG4gICAgICBhd2FpdCB0aGlzLnNldHVwU3RhdGljV2ViU2VydmVyKHNlcnZlciwgY29uZmlnLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkZXYg66qo65OcIOqzte2GtTogY2F0Y2gtYWxs7JeQ7IScIHN5bmNlci5hcGlz66W8IOuPmeyggeycvOuhnCDtg5Dsg4ntlZjsl6wgQVBJIOyalOyyreydhCDsspjrpqztlanri4jri6QuXG4gICAqIHNlcnZlci5yb3V0ZSgp66GcIOqwnOuzhCDrk7HroZ3tlZjrqbQgaGFuZGxlcuqwgCDqs6DsoJXrkJjslrQgSE1S7J20IOuPmeyeke2VmOyngCDslYrsnLzrr4DroZwsXG4gICAqIOunpCDsmpTssq3rp4jri6Qgc3luY2VyLmFwaXPrpbwg7KGw7ZqM7ZWY64qUIOydtCDrsKnsi53snYQg7IKs7Jqp7ZWp64uI64ukLlxuICAgKlxuICAgKiDsmpTssq3snbQgL2FwaSjsoJXtmZXtnojripQgdGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCnroZwg7Iuc7J6R7ZWY7KeAIOyViuuKlCDqsr3smrDrnbzrqbQgbnVsbOydhCDrsJjtmZjtlZjrqbAg64Gd64OF64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVEZXZBcGlSZXF1ZXN0KFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogKChyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSkgPT4gUHJvbWlzZTx1bmtub3duPikgfCBudWxsIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmdldFBhdGhuYW1lRnJvbVVybChyZXF1ZXN0LnVybCk7XG4gICAgY29uc3QgbWV0aG9kID0gcmVxdWVzdC5tZXRob2Q7XG5cbiAgICBpZiAoIXVybC5zdGFydHNXaXRoKHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBzeW5jZXIuYXBpc+ydmCBwYXRo64qUIDpwYXJhbSDtmJXtg5zrpbwg7Y+s7ZWo7ZWgIOyImCDsnojsnLzrr4DroZwg7IS46re466i87Yq4IOuLqOychOuhnCDrp6Tsua3tlanri4jri6QuXG4gICAgLy8g7KCV6rec7IudIOyDneyEsSDrsKnsi53snYAgcGF0aCDrrLjsnpDsl7Qg64K0IO2KueyImOusuOyekCguLCArLCAoLCBbIOuTsSnroZwg7Jik7J6R64+Z7ZWgIOyImCDsnojslrQg7IKs7Jqp7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICBjb25zdCBtYXRjaGVkQXBpID0gdGhpcy5zeW5jZXIuYXBpcy5maW5kKChhcGkpID0+IHtcbiAgICAgIGlmICh0aGlzLnN5bmNlci5tb2RlbHNbYXBpLm1vZGVsTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBhcGlNZXRob2QgPSBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCI7XG4gICAgICBpZiAoYXBpTWV0aG9kICE9PSBtZXRob2QpIHJldHVybiBmYWxzZTtcblxuICAgICAgY29uc3QgZnVsbFBhdGggPSB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGg7XG4gICAgICByZXR1cm4gdGhpcy5pc1BhdGhQYXR0ZXJuTWF0Y2goZnVsbFBhdGgsIHVybCk7XG4gICAgfSk7XG5cbiAgICBpZiAoIW1hdGNoZWRBcGkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlQXBpSGFuZGxlcihtYXRjaGVkQXBpLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIGRldiBhcGkg66qo65OcOiBWaXRlIOyXhuydtCBBUEkg64+Z7KCBIOudvOyasO2MheunjCDsoJzqs7Xtlanri4jri6QuXG4gICAqIEhNUuydhCDsnITtlbQgY2F0Y2gtYWxs7JeQ7IScIOunpCDsmpTssq3rp4jri6Qgc3luY2VyLmFwaXPrpbwg7KGw7ZqM7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cERldlNlcnZlcihcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogdm9pZCB7XG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiLCBcIlBPU1RcIiwgXCJQVVRcIiwgXCJERUxFVEVcIiwgXCJQQVRDSFwiXSxcbiAgICAgIHVybDogYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIHJldHVybiBoYW5kbGVyKHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyDsgqzsi6QgL2FwaeuhnCDsi5zsnpHtlZjsp4Ag7JWK64qUIOyalOyyreydgCDsl6zquLDsl5Ag65Ok7Ja07Jik7KeA64+EIOyViuydhCDqsbDrnbwg7J20IOudvOyduOydgCDrj4Tri6wg67aI6rCA64ql7J6F64uI64uk66eMLFxuICAgICAgICAvLyDslYjsoITrubXsnLzroZwg64Ko6rKo64aT7Iq164uI64ukLlxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5hcGkubm90Rm91bmRcIikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogVml0ZURldlNlcnZlciDtg4DsnoXsnYQg64+Z7KCB7Jy866GcIOuhnOuTnO2VtOyVvCDtlahcbiAgcHJpdmF0ZSB2aXRlU2VydmVyOiBhbnkgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBkZXYgYWxsIOuqqOuTnDogVml0ZSBEZXYgU2VydmVy66W8IO2Gte2Vqe2VmOyXrCBBUEkgKyBTU1IgKyBDU1LsnYQg66qo65GQIOygnOqzte2VqeuLiOuLpC5cbiAgICogQVBJIOuPmeyggSDrp6Tsua3snYAgaGFuZGxlRGV2QXBpUmVxdWVzdOulvCDqs7XsnKDtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNldHVwRGV2U2VydmVyV2l0aFZpdGUoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgICB3ZWJQYXRoOiBzdHJpbmcsXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBAZmFzdGlmeS9taWRkaWUg65Ox66GdIChDb25uZWN0LXN0eWxlIG1pZGRsZXdhcmUg7KeA7JuQKVxuICAgIGF3YWl0IHNlcnZlci5yZWdpc3RlcigoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvbWlkZGllXCIpKS5kZWZhdWx0KTtcblxuICAgIGNvbnN0IHZpdGUgPSBhd2FpdCBpbXBvcnQoXCJ2aXRlXCIpO1xuXG4gICAgdGhpcy52aXRlU2VydmVyID0gYXdhaXQgdml0ZS5jcmVhdGVTZXJ2ZXIoe1xuICAgICAgcm9vdDogd2ViUGF0aCxcbiAgICAgIHNlcnZlcjoge1xuICAgICAgICBtaWRkbGV3YXJlTW9kZTogdHJ1ZSxcbiAgICAgICAgaG1yOiB7XG4gICAgICAgICAgc2VydmVyOiBzZXJ2ZXIuc2VydmVyLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFwcFR5cGU6IFwiY3VzdG9tXCIsXG4gICAgfSk7XG5cbiAgICAvLyBWaXRlIG1pZGRsZXdhcmUg65Ox66GdIChWaXRlIOyXkOyFiyDsspjrpqwpXG4gICAgc2VydmVyLnVzZSgocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgIC8vIEFQSeyZgCBTb25hbXUgVUnripQgRmFzdGlmeSDrnbzsmrDtirjqsIAg7LKY66as7ZWY64+E66GdIHNraXBcbiAgICAgIGlmIChyZXEudXJsPy5zdGFydHNXaXRoKHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgpIHx8IHJlcS51cmw/LnN0YXJ0c1dpdGgoXCIvc29uYW11LXVpXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgICB9XG4gICAgICAvLyDrgpjrqLjsp4DripQgVml0ZSBtaWRkbGV3YXJl66GcIOyghOuLrFxuICAgICAgcmV0dXJuIHRoaXMudml0ZVNlcnZlci5taWRkbGV3YXJlcyhyZXEsIHJlcywgbmV4dCk7XG4gICAgfSk7XG5cbiAgICAvLyBjYXRjaC1hbGwg65287Jqw7Yq47JeQ7IScIOuPmeyggeycvOuhnCBBUEkvU1NSIOyymOumrFxuICAgIC8vIOqwnOuwnCDtmZjqsr3sl5DshJzripQg65287Jqw7Yq467OEIGNvbXByZXNzIOyYteyFmOydhCDtj6zquLDtlZjqs6AgSE1SIOydtOygkOydhCDst6jtlanri4jri6QuXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiLCBcIlBPU1RcIiwgXCJQVVRcIiwgXCJERUxFVEVcIiwgXCJQQVRDSFwiXSxcbiAgICAgIHVybDogXCIvKlwiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIC8vIDEuIEFQSSDsmpTssq0g7LKY66asXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdChyZXF1ZXN0LCByZXBseSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cmwgPSByZXF1ZXN0LnVybDtcblxuICAgICAgICAvLyAyLiBTU1Ig65287Jqw7Yq4IOyymOumrFxuICAgICAgICBjb25zdCB7IG1hdGNoU1NSUm91dGUsIHJlbmRlclNTUiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyXCIpO1xuICAgICAgICBjb25zdCBzc3JNYXRjaCA9IG1hdGNoU1NSUm91dGUodXJsKTtcbiAgICAgICAgaWYgKHNzck1hdGNoKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFtTU1JdIE1hdGNoZWQgcm91dGU6ICR7c3NyTWF0Y2gucm91dGUucGF0aH1gKTtcbiAgICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVuZGVyU1NSKFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgc3NyTWF0Y2gucm91dGUsXG4gICAgICAgICAgICBzc3JNYXRjaC5wYXJhbXMsXG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgcmVwbHksXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICB0aGlzLnZpdGVTZXJ2ZXIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXBseS50eXBlKFwidGV4dC9odG1sXCIpO1xuICAgICAgICAgIHJldHVybiBodG1sO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gQ1NSIGZhbGxiYWNrXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZnMgPSBhd2FpdCBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpO1xuICAgICAgICAgIGxldCB0ZW1wbGF0ZSA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMudml0ZVNlcnZlci5jb25maWcucm9vdCwgXCJpbmRleC5odG1sXCIpLFxuICAgICAgICAgICAgXCJ1dGYtOFwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGVtcGxhdGUgPSBhd2FpdCB0aGlzLnZpdGVTZXJ2ZXIudHJhbnNmb3JtSW5kZXhIdG1sKHVybCwgdGVtcGxhdGUpO1xuXG4gICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aGlzLnZpdGVTZXJ2ZXIuc3NyRml4U3RhY2t0cmFjZShlIGFzIEVycm9yKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg1MDApO1xuICAgICAgICAgIHJldHVybiAoZSBhcyBFcnJvcikubWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIOyEnOuyhCDsooXro4wg7IucIFZpdGXrj4Qg7KKF66OMXG4gICAgc2VydmVyLmFkZEhvb2soXCJvbkNsb3NlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMudml0ZVNlcnZlci5jbG9zZSgpO1xuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coXCLinJMgVml0ZSBkZXYgc2VydmVyIGludGVncmF0ZWRcIik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldHVwU3RhdGljV2ViU2VydmVyKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIGdsb2JhbENvbXByZXNzT3B0aW9uczogQ29tcHJlc3NPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDqsr3roZwg66qF7ZmV7ZmUOiBhcGkvd2ViLWRpc3QvY2xpZW50ICjsoJXsoIEg7YyM7J28KSwgYXBpL3dlYi1kaXN0L3NlcnZlciAoU1NSIGVudHJ5KSwgYXBpL2Rpc3Qvc3NyIChTU1Igcm91dGVzIC0gQVBJIOyGjOycoClcbiAgICBjb25zdCB3ZWJEaXN0UGF0aCA9IHBhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcIndlYi1kaXN0XCIsIFwiY2xpZW50XCIpO1xuICAgIGNvbnN0IHNzclBhdGggPSBwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJ3ZWItZGlzdFwiLCBcInNlcnZlclwiKTtcbiAgICBjb25zdCBzc3JFbnRyeVBhdGggPSBwYXRoLmpvaW4oc3NyUGF0aCwgXCJlbnRyeS1zZXJ2ZXIuZ2VuZXJhdGVkLmpzXCIpO1xuICAgIGNvbnN0IHNzclJvdXRlc1BhdGggPSBwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJkaXN0XCIsIFwic3NyXCIsIFwicm91dGVzLmpzXCIpO1xuXG4gICAgaWYgKCEoYXdhaXQgZXhpc3RzKHdlYkRpc3RQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2Fybihg4pqgIFdlYiBkaXN0IG5vdCBmb3VuZDogJHt3ZWJEaXN0UGF0aH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTU1IgZW50cnkg7KG07J6sIOyXrOu2gCDtmZXsnbhcbiAgICBjb25zdCBzc3JBdmFpbGFibGUgPSBhd2FpdCBleGlzdHMoc3NyRW50cnlQYXRoKTtcblxuICAgIGlmICghc3NyQXZhaWxhYmxlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYOKaoCBTU1IgZW50cnkgbm90IGZvdW5kOiAke3NzckVudHJ5UGF0aH1gKTtcbiAgICAgIGNvbnNvbGUud2FybihcIiAgU1NSIHdpbGwgYmUgZGlzYWJsZWQuIE9ubHkgQ1NSIHdpbGwgd29yay5cIik7XG4gICAgfVxuXG4gICAgLy8gU1NSIOudvOyasO2KuCDroZzrk5wgKHByb2R1Y3Rpb27sl5DshJzrp4wsIOyCrOyaqeyekCDtlITroZzsoJ3tirjsnZggc3NyL3JvdXRlcy50cylcbiAgICBpZiAoc3NyQXZhaWxhYmxlKSB7XG4gICAgICBpZiAoYXdhaXQgZXhpc3RzKHNzclJvdXRlc1BhdGgpKSB7XG4gICAgICAgIC8vIHRzLWxvYWRlcuudvOuptCBcImZpbGU6Ly9cIuuhnCDsi5zsnpHtlZjripQgZnVsbHktcmVzb2x2ZWQgcGF0aOunjCDrsJvquLDsl5Ag7J2066W8IOyymOumrO2VtOyjvOuKlCBpbXBvcnRNZW1iZXJz66W8IOyCrOyaqe2VtOyVvCDtlojqsqDsp4Drp4wsXG4gICAgICAgIC8vIOyXrOq4sOuKlCDtlITroZzrjZXshZgg7ZmY6rK97JeQ7IScIGxvYWRlciDsl4bsnbQg64+M7JWE6rCA6riwIOuVjOusuOyXkCBcIuynhOynnCBqcyDtjIzsnbxcIuydmCBcIuq3uOuDpVwiIOygiOuMgOqyveuhnOulvCDrsJTroZwgaW1wb3J07ZW064+EIOuQqeuLiOuLpC5cbiAgICAgICAgLy8g7J20IOuCtOyaqeydgCDsnbQg7ZWo7IiYIOuCtOyXkOyEnCDslYTrnpjsl5Ag64KY7JisIOuLpOuluCBpbXBvcnQg7Zi47Lac7JeQ64+EIOuPmeydvO2VmOqyjCDsoIHsmqnrkKnri4jri6QuXG4gICAgICAgIGF3YWl0IGltcG9ydChzc3JSb3V0ZXNQYXRoKTtcbiAgICAgICAgY29uc29sZS5sb2coXCLinJMgU1NSIHJvdXRlcyBsb2FkZWRcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYOKaoCBTU1Igcm91dGVzIG5vdCBmb3VuZDogJHtzc3JSb3V0ZXNQYXRofWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOuhpOungSDsl4XrjbDsnbTtirgg64yA7J2ROiBhc3NldCBoYXNoIOu2iOydvOy5mCDsi5wg7ZiE7J6sIOuyhOyghCDsp4HsoJEg7ISc67mZXG4gICAgc2VydmVyLmdldChcIi9hc3NldHMvOmZpbGVuYW1lXCIsIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdGVkRmlsZSA9IChyZXF1ZXN0LnBhcmFtcyBhcyB7IGZpbGVuYW1lOiBzdHJpbmcgfSkuZmlsZW5hbWU7XG4gICAgICBjb25zdCBhc3NldHNEaXIgPSBwYXRoLmpvaW4od2ViRGlzdFBhdGgsIFwiYXNzZXRzXCIpO1xuICAgICAgY29uc3Qgc2FmZUZpbGVQYXRoID0gdGhpcy5yZXNvbHZlUGF0aFdpdGhpbkJhc2VEaXIoYXNzZXRzRGlyLCByZXF1ZXN0ZWRGaWxlKTtcbiAgICAgIGlmIChzYWZlRmlsZVBhdGggPT09IG51bGwpIHtcbiAgICAgICAgcmVwbHkuc3RhdHVzKDQwMykuc2VuZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBub3JtYWxpemVkUmVxdWVzdGVkRmlsZSA9IHBhdGgucmVsYXRpdmUoYXNzZXRzRGlyLCBzYWZlRmlsZVBhdGgpLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xuXG4gICAgICBjb25zdCBhc3NldFBhdGggPSBgL2Fzc2V0cy8ke25vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlfWA7XG5cbiAgICAgIC8vIENhY2hlLUNvbnRyb2wg7Zek642UIOqysOyglVxuICAgICAgY29uc3QgZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQgPSAoKTogQ2FjaGVDb250cm9sQ29uZmlnID0+IHtcbiAgICAgICAgY29uc3QgY2FjaGVSZXE6IENhY2hlQ29udHJvbFJlcXVlc3QgPSB7XG4gICAgICAgICAgdHlwZTogXCJhc3NldHNcIixcbiAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICAgIHBhdGg6IGFzc2V0UGF0aCxcbiAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIOyCrOyaqeyekCDsoJXsnZgg7ZW465Ok65+sIOyasOyEoFxuICAgICAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjYWNoZVJlcSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOq4sOuzuOqwkjogaW1tdXRhYmxlXG4gICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuaW1tdXRhYmxlO1xuICAgICAgfTtcblxuICAgICAgLy8gaW5kZXgtKi5qcyDrmJDripQgaW5kZXgtKi5jc3Mg7JqU7LKt7J24IOqyveyasFxuICAgICAgaWYgKC9eaW5kZXgtW2EtZjAtOV0rXFwuKGpzfGNzcykkLy50ZXN0KG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlKSkge1xuICAgICAgICBjb25zdCBleHQgPSBub3JtYWxpemVkUmVxdWVzdGVkRmlsZS5zcGxpdChcIi5cIikucG9wKCk7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihhc3NldHNEaXIpO1xuICAgICAgICBjb25zdCBjdXJyZW50RmlsZSA9IGZpbGVzLmZpbmQoKGYpID0+IGYuc3RhcnRzV2l0aChcImluZGV4LVwiKSAmJiBmLmVuZHNXaXRoKGAuJHtleHR9YCkpO1xuXG4gICAgICAgIGlmIChjdXJyZW50RmlsZSkge1xuICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGFzc2V0c0RpciwgY3VycmVudEZpbGUpO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgICAgcmVwbHkudHlwZShleHQgPT09IFwianNcIiA/IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiIDogXCJ0ZXh0L2Nzc1wiKTtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQoKSk7XG4gICAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQoY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7J2867CYIO2MjOydvCDshJzruZlcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gc2FmZUZpbGVQYXRoO1xuICAgICAgaWYgKGF3YWl0IGV4aXN0cyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgZXh0ID0gbm9ybWFsaXplZFJlcXVlc3RlZEZpbGUuc3BsaXQoXCIuXCIpLnBvcCgpO1xuICAgICAgICByZXBseS50eXBlKGV4dCA9PT0gXCJqc1wiID8gXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCIgOiBleHQgPT09IFwiY3NzXCIgPyBcInRleHQvY3NzXCIgOiBcIlwiKTtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVwbHkuc2VuZChjb250ZW50KTtcbiAgICAgIH1cblxuICAgICAgcmVwbHkuc3RhdHVzKDQwNCkuc2VuZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gU1NSIOudvOyasO2KuCDqsJzrs4Qg65Ox66GdIChjb21wcmVzcyDsmLXshZjsnbQg65287Jqw7Yq467OE66GcIOyggeyaqeuQmOuPhOuhnSlcbiAgICBpZiAoc3NyQXZhaWxhYmxlKSB7XG4gICAgICBjb25zdCB7IGdldFNTUlJvdXRlcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyXCIpO1xuICAgICAgY29uc3QgeyByZW5kZXJTU1IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Nzci9yZW5kZXJlclwiKTtcbiAgICAgIGNvbnN0IHNzclJvdXRlcyA9IGdldFNTUlJvdXRlcygpO1xuXG4gICAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHNzclJvdXRlcykge1xuICAgICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiXSxcbiAgICAgICAgICB1cmw6IHJvdXRlLnBhdGgsXG4gICAgICAgICAgY29tcHJlc3M6IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uKHJvdXRlLmNvbXByZXNzID8/IHRydWUsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSByZXF1ZXN0LnVybDtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbU1NSXSBNYXRjaGVkIHJvdXRlOiAke3JvdXRlLnBhdGh9YCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuZXh0cmFjdFBhdGhQYXJhbXMocm91dGUucGF0aCwgdXJsKTtcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZW5kZXJTU1IodXJsLCByb3V0ZSwgcGFyYW1zLCByZXF1ZXN0LCByZXBseSwgY29uZmlnKTtcblxuICAgICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICAgIHJldHVybiBodG1sO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENTUiBvciBTdGF0aWMgRmlsZSBGYWxsYmFjayAoU1NSIOudvOyasO2KuOyXkCDrp6Tsua3rkJjsp4Ag7JWK64qUIOuqqOuToCDsmpTssq0pXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiXSxcbiAgICAgIHVybDogXCIqXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgLy8gL2FwaSwgL3NvbmFtdS11aeuKlCA0MDQg6re464yA66GcXG4gICAgICAgIGlmIChyZXF1ZXN0LnVybC5zdGFydHNXaXRoKFwiL2FwaVwiKSB8fCByZXF1ZXN0LnVybC5zdGFydHNXaXRoKFwiL3NvbmFtdS11aVwiKSkge1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDQpLnNlbmQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDU1LsmqkgQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVXG4gICAgICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IGNzckNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgdHlwZTogXCJjc3JcIixcbiAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgICAgICBwYXRoOiByZXF1ZXN0LnVybC5zcGxpdChcIj9cIilbMF0sXG4gICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgY3NyQ2FjaGVDb25maWcgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjc3JDYWNoZVJlcSk7XG5cbiAgICAgICAgICBpZiAoY3NyQ2FjaGVDb25maWcpIHtcbiAgICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBjc3JDYWNoZUNvbmZpZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g7KCV7KCBIO2MjOydvOydtCDsobTsnqztlaAg6rK97JqwLCDsoJXsoIEg7YyM7J287J2EIOuovOyggCDshJzruZntlbTslbztlahcbiAgICAgICAgY29uc3QgcmVxdWVzdFBhdGggPSB0aGlzLmdldFBhdGhuYW1lRnJvbVVybChyZXF1ZXN0LnVybCk7XG4gICAgICAgIGNvbnN0IHNhZmVGaWxlUGF0aCA9IHRoaXMucmVzb2x2ZVBhdGhXaXRoaW5CYXNlRGlyKHdlYkRpc3RQYXRoLCByZXF1ZXN0UGF0aCk7XG4gICAgICAgIGlmIChzYWZlRmlsZVBhdGggPT09IG51bGwpIHtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNDAzKS5zZW5kKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhd2FpdCBmaWxlRXhpc3RzKHNhZmVGaWxlUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoc2FmZUZpbGVQYXRoKTtcbiAgICAgICAgICByZXR1cm4gcmVwbHkudHlwZShtaW1lTG9va3VwKHNhZmVGaWxlUGF0aCkgfHwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIikuc2VuZChjb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENTUiBmYWxsYmFjazogaW5kZXguaHRtbCDshJzruZlcbiAgICAgICAgY29uc3QgaW5kZXhQYXRoID0gcGF0aC5qb2luKHdlYkRpc3RQYXRoLCBcImluZGV4Lmh0bWxcIik7XG4gICAgICAgIHJldHVybiByZXBseS50eXBlKFwidGV4dC9odG1sXCIpLnNlbmQoYXdhaXQgZnMucmVhZEZpbGUoaW5kZXhQYXRoLCBcInV0Zi04XCIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhg4pyTIFN0YXRpYyB3ZWIgc2VydmVyIGNvbmZpZ3VyZWQgd2l0aCAke3NzckF2YWlsYWJsZSA/IFwiU1NSXCIgOiBcIkNTUiBvbmx5XCJ9IHN1cHBvcnRgKTtcbiAgfVxuXG4gIGNyZWF0ZUFwaUhhbmRsZXIoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6IChyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSkgPT4gUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGFzeW5jIChyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSk6IFByb21pc2U8dW5rbm93bj4gPT4ge1xuICAgICAgLy8gQ29udGV4dCDsg53shLFcbiAgICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSBhd2FpdCB0aGlzLmNyZWF0ZUNvbnRleHQoY29uZmlnLCByZXF1ZXN0LCByZXBseSk7XG5cbiAgICAgIHJldHVybiB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBndWFyZHMg7LKY66asXG4gICAgICAgIChhcGkub3B0aW9ucy5ndWFyZHMgPz8gW10pLmV2ZXJ5KChndWFyZCkgPT4gY29uZmlnLmd1YXJkSGFuZGxlcihndWFyZCwgcmVxdWVzdCwgYXBpKSk7XG5cbiAgICAgICAgLy8g7YyM652866+47YSwIOygleuztOuhnCB6b2Qg7Iqk7YKk66eIIOu5jOuTnFxuICAgICAgICBjb25zdCB7IGdldFpvZE9iamVjdEZyb21BcGkgfSA9IGF3YWl0IGltcG9ydChcIi4vY29kZS1jb252ZXJ0ZXJzXCIpO1xuICAgICAgICBjb25zdCBSZXFUeXBlID0gZ2V0Wm9kT2JqZWN0RnJvbUFwaShhcGksIHRoaXMuc3luY2VyLnR5cGVzKTtcblxuICAgICAgICAvLyByZXF1ZXN0IO2MjOyLsVxuICAgICAgICBjb25zdCB3aGljaCA9IGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPT09IFwiR0VUXCIgPyBcInF1ZXJ5XCIgOiBcImJvZHlcIjtcbiAgICAgICAgbGV0IHJlcUJvZHk6IHtcbiAgICAgICAgICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICAgICAgICB9O1xuICAgICAgICAvLyDtjIzsnbwg7JeF66Gc65OcIOyeiOuKlCDqsr3smrAg7J6E7IucIOuNsOydtO2EsFxuICAgICAgICBjb25zdCBmaWxlczoge1xuICAgICAgICAgIGJ1ZmZlcmVkRmlsZXM6IEJ1ZmZlcmVkRmlsZVtdO1xuICAgICAgICAgIHVwbG9hZGVkRmlsZXM6IFVwbG9hZGVkRmlsZVtdO1xuICAgICAgICB9ID0ge1xuICAgICAgICAgIGJ1ZmZlcmVkRmlsZXM6IFtdLFxuICAgICAgICAgIHVwbG9hZGVkRmlsZXM6IFtdLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYm9keSA9IChyZXF1ZXN0W3doaWNoXSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHJlcXVlc3QucGFydHMoe1xuICAgICAgICAgICAgICBsaW1pdHM6IGFwaS51cGxvYWRPcHRpb25zLmxpbWl0cyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBGb3JtRGF0YeydmCBmaWVsZOuTpOydhCDsnoTsi5zroZwg7KCA7J6lXG4gICAgICAgICAgICBjb25zdCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgICAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPT09IFwiYnVmZmVyXCIgfHwgIWFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUpIHtcbiAgICAgICAgICAgICAgLy8gQnVmZmVyIOuqqOuTnDog66mU66qo66as7JeQIOuhnOuTnFxuICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFydC50eXBlID09PSBcImZpbGVcIikge1xuICAgICAgICAgICAgICAgICAgLy8gQ1JJVElDQUw6IO2MjOydvCDsiqTtirjrprzsnYQg7KaJ7IucIGNvbnN1bWXtlbTslbwg64uk7J2MIHBhcnTroZwg64SY7Ja06rCIIOyImCDsnojsnYxcbiAgICAgICAgICAgICAgICAgIC8vIOydtCDtmLjstpzsnbQg7JeG7Jy866m0IOyiheyihSBtdWx0aXBhcnQg7YyM7Iux7J20IHBlbmRpbmcg7IOB7YOc66GcIO2DgOyehOyVhOybgyDrsJzsg51cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHBhcnQudG9CdWZmZXIoKTtcbiAgICAgICAgICAgICAgICAgIGZpbGVzLmJ1ZmZlcmVkRmlsZXMucHVzaChuZXcgQnVmZmVyZWRGaWxlKHBhcnQsIGJ1ZmZlcikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSBcImZpZWxkXCIpIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkc1twYXJ0LmZpZWxkbmFtZV0gPSBTdHJpbmcocGFydC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPT09IFwic3RyZWFtXCIpIHtcbiAgICAgICAgICAgICAgLy8gU3RyZWFtIOuqqOuTnDog7KaJ7IucIOyggOyepeyGjOuhnCDsiqTtirjrpqzrsI1cbiAgICAgICAgICAgICAgY29uc3QgZGlza05hbWUgPSBhcGkudXBsb2FkT3B0aW9ucy5kZXN0aW5hdGlvbjtcbiAgICAgICAgICAgICAgY29uc3QgZGlzayA9IHRoaXMuc3RvcmFnZS51c2UoZGlza05hbWUpO1xuXG4gICAgICAgICAgICAgIC8vIOyasOyEoOyInOychDog642w7L2U66CI7J207YSwID4g7KCE7JetIOyEpOyglSA+IOq4sOuzuOqwklxuICAgICAgICAgICAgICBjb25zdCBrZXlHZW5lcmF0b3I6IEtleUdlbmVyYXRvciA9XG4gICAgICAgICAgICAgICAgYXBpLnVwbG9hZE9wdGlvbnMua2V5R2VuZXJhdG9yID8/XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2VydmVyLnN0b3JhZ2U/LmtleUdlbmVyYXRvciA/P1xuICAgICAgICAgICAgICAgIGRlZmF1bHRLZXlHZW5lcmF0b3I7XG5cbiAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IGtleUdlbmVyYXRvcih7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBwYXJ0LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBhd2FpdCBkaXNrLnB1dFN0cmVhbShrZXksIHBhcnQuZmlsZSwge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCBkaXNrLmdldFVybChrZXkpO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkVXJsID0gYXdhaXQgZGlzay5nZXRTaWduZWRVcmwoa2V5KTtcblxuICAgICAgICAgICAgICAgICAgZmlsZXMudXBsb2FkZWRGaWxlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBuZXcgVXBsb2FkZWRGaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogcGFydC5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBzaXplOiBwYXJ0LmZpbGUuYnl0ZXNSZWFkLFxuICAgICAgICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICAgICAgICBzaWduZWRVcmwsXG4gICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2tOYW1lLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09IFwiZmllbGRcIikge1xuICAgICAgICAgICAgICAgICAgZmllbGRzW3BhcnQuZmllbGRuYW1lXSA9IFN0cmluZyhwYXJ0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcXProZwg7KSR7LKpIOq1rOyhsCDtjIzsi7E6IHBhcmFtc1tjYXRlZ29yeV0g4oaSIHsgcGFyYW1zOiB7IGNhdGVnb3J5OiBcInRlc3RcIiB9IH1cbiAgICAgICAgICAgIGNvbnN0IHFzID0gYXdhaXQgaW1wb3J0KFwicXNcIik7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBxcy5kZWZhdWx0LnBhcnNlKGZpZWxkcyk7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGJvZHksIHBhcnNlZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgeyBmYXN0aWZ5Q2FzdGVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2Nhc3RlclwiKTtcbiAgICAgICAgICByZXFCb2R5ID0gZmFzdGlmeUNhc3RlcihSZXFUeXBlKS5wYXJzZShib2R5KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnN0IHsgWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcInpvZFwiKTtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFpvZEVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCB7IGh1bWFuaXplWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3pvZC1lcnJvclwiKTtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gaHVtYW5pemVab2RFcnJvcihlKVxuICAgICAgICAgICAgICAubWFwKChpc3N1ZSkgPT4gaXNzdWUubWVzc2FnZSlcbiAgICAgICAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgICAgICAgICAgY29uc3QgeyBCYWRSZXF1ZXN0RXhjZXB0aW9uIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihtZXNzYWdlcyBhcyBMb2NhbGl6ZWRTdHJpbmcsIHtcbiAgICAgICAgICAgICAgem9kRXJyb3I6IGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb250ZW50LVR5cGVcbiAgICAgICAgcmVwbHkudHlwZShhcGkub3B0aW9ucy5jb250ZW50VHlwZSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cbiAgICAgICAgLy8gQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVXG4gICAgICAgIGNvbnN0IGFwaUNhY2hlQ29uZmlnID0gdGhpcy5nZXRBcGlDYWNoZUNvbnRyb2woYXBpLCByZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAoYXBpQ2FjaGVDb25maWcpIHtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgYXBpQ2FjaGVDb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7JeF66Gc65OcIOyYteyFmOydtCDsnojripQg6rK97JqwIO2MjOydvCDrjbDsnbTthLDrpbwgQ29udGV4dOyXkCDstpTqsIBcbiAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zKSB7XG4gICAgICAgICAgY29uc3QgY29uc3VtZSA9IGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPz8gXCJidWZmZXJcIjtcbiAgICAgICAgICBpZiAoY29uc3VtZSA9PT0gXCJidWZmZXJcIikge1xuICAgICAgICAgICAgY29udGV4dC5idWZmZXJlZEZpbGVzID0gZmlsZXMuYnVmZmVyZWRGaWxlcztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbnN1bWUgPT09IFwic3RyZWFtXCIpIHtcbiAgICAgICAgICAgIGNvbnRleHQudXBsb2FkZWRGaWxlcyA9IGZpbGVzLnVwbG9hZGVkRmlsZXM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g66qo6424IOuplOyGjOuTnCBhcmdzIOyDneyEse2VmOyXrCDtmLjstpxcbiAgICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgICBjb25zdCBhcmdzID0gYXBpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICAgIC8vIENvbnRleHQg7J247KCd7IWYXG4gICAgICAgICAgaWYgKEFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxQm9keVtwYXJhbS5uYW1lXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmludm9rZU1vZGVsTWV0aG9kKGFwaSwgYXJncywgcmVwbHkpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVUkzsl5DshJwgcGF0aCBwYXJhbXPrpbwg7LaU7Lac7ZWp64uI64ukLlxuICAgKiDsmIg6IHBhdHRlcm49XCIvYWRtaW4vY29tcGFuaWVzLzpjb21wYW55SWRcIiwgdXJsPVwiL2FkbWluL2NvbXBhbmllcy8xMjNcIiDihpIgeyBjb21wYW55SWQ6IFwiMTIzXCIgfVxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0UGF0aFBhcmFtcyhwYXR0ZXJuOiBzdHJpbmcsIHVybDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgcGF0dGVyblBhcnRzID0gcGF0dGVybi5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IHVybFBhcnRzID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwodXJsKS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChwYXR0ZXJuUGFydHNbaV0uc3RhcnRzV2l0aChcIjpcIikpIHtcbiAgICAgICAgcGFyYW1zW3BhdHRlcm5QYXJ0c1tpXS5zbGljZSgxKV0gPSB1cmxQYXJ0c1tpXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHByaXZhdGUgaXNQYXRoUGF0dGVybk1hdGNoKHBhdHRlcm46IHN0cmluZywgdXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXR0ZXJuUGFydHMgPSBwYXR0ZXJuLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgdXJsUGFydHMgPSB0aGlzLmdldFBhdGhuYW1lRnJvbVVybCh1cmwpLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICBpZiAocGF0dGVyblBhcnRzLmxlbmd0aCAhPT0gdXJsUGFydHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBhdHRlcm5QYXJ0ID0gcGF0dGVyblBhcnRzW2ldO1xuICAgICAgY29uc3QgdXJsUGFydCA9IHVybFBhcnRzW2ldO1xuICAgICAgaWYgKHBhdHRlcm5QYXJ0LnN0YXJ0c1dpdGgoXCI6XCIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHBhdHRlcm5QYXJ0ICE9PSB1cmxQYXJ0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGF0aG5hbWVGcm9tVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdXJsLnNwbGl0KFwiP1wiKVswXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVBhdGhXaXRoaW5CYXNlRGlyKGJhc2VEaXI6IHN0cmluZywgaW5wdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVVSSUNvbXBvbmVudChpbnB1dFBhdGgpLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xuICAgICAgaWYgKGRlY29kZWQuaW5jbHVkZXMoXCJcXDBcIikpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBkZWNvZGVkLnJlcGxhY2UoL15cXC8rLywgXCJcIik7XG4gICAgICBjb25zdCByZXNvbHZlZFBhdGggPSBwYXRoLnJlc29sdmUoYmFzZURpciwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlRnJvbUJhc2UgPSBwYXRoLnJlbGF0aXZlKGJhc2VEaXIsIHJlc29sdmVkUGF0aCk7XG4gICAgICBpZiAocmVsYXRpdmVGcm9tQmFzZS5zdGFydHNXaXRoKFwiLi5cIikgfHwgcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlRnJvbUJhc2UpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmVkUGF0aDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBUEkg7J2R64u17JeQIOyggeyaqe2VoCBDYWNoZS1Db250cm9sIOyEpOygleydhCDqsrDsoJXtlanri4jri6QuXG4gICAqIOyasOyEoOyInOychDog6rCc67OEIOyngOyglSA+IGNhY2hlQ29udHJvbEhhbmRsZXJcbiAgICovXG4gIHByaXZhdGUgZ2V0QXBpQ2FjaGVDb250cm9sKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApIHtcbiAgICAvLyDrjbDsvZTroIjsnbTthLAg7ISk7KCVIOyasOyEoFxuICAgIGlmIChhcGkub3B0aW9ucy5jYWNoZUNvbnRyb2wpIHtcbiAgICAgIHJldHVybiBhcGkub3B0aW9ucy5jYWNoZUNvbnRyb2w7XG4gICAgfVxuXG4gICAgLy8g7KCE7JetIO2VuOuTpOufrFxuICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgICAgY29uc3QgY2FjaGVSZXE6IENhY2hlQ29udHJvbFJlcXVlc3QgPSB7XG4gICAgICAgIHR5cGU6IFwiYXBpXCIsXG4gICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgIHBhdGg6IHJlcXVlc3Qucm91dGVPcHRpb25zPy51cmwgPz8gcmVxdWVzdC51cmwuc3BsaXQoXCI/XCIpWzBdLFxuICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICBhcGksXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIoY2FjaGVSZXEpO1xuICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTU1LsmqkgQVBJIO2YuOy2nCAoSFRUUCDsmKTrsoTtl6Trk5wg7JeG7J20IOyngeygkSDtmLjstpwpXG4gICAqIGNyZWF0ZUFwaUhhbmRsZXLsnZgg66Gc7KeB7J2EIOyerOyCrOyaqe2VmOuQmCwgcmVxdWVzdCDtjIzsi7Eg64yA7IugIHBhcmFtcyDsp4HsoJEg7IKs7JqpXG4gICAqL1xuICBhc3luYyBpbnZva2VBcGlGb3JTU1IoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IFNTUuyXkOyEnCDri6TslpHtlZwg7YOA7J6F7J2YIHBhcmFtc+ulvCDrsJvslYTslbwg7ZWoXG4gICAgcGFyYW1zOiBhbnlbXSxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgLy8gQ29udGV4dCDsg53shLEgKOq4sOyhtCDrqZTshozrk5wg7J6s7IKs7JqpKVxuICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmNyZWF0ZUNvbnRleHQoY29uZmlnLCByZXF1ZXN0LCByZXBseSk7XG5cbiAgICByZXR1cm4gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0IH0sIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIGFyZ3Mg7IOd7ISxOiBDb250ZXh0IO2MjOudvOuvuO2EsOuKlCDso7zsnoUsIOuCmOuouOyngOuKlCBwYXJhbXPsl5DshJwg6rCA7KC47Jik6riwXG4gICAgICBjb25zdCB7IEFwaVBhcmFtVHlwZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIik7XG4gICAgICBsZXQgcGFyYW1zSW5kZXggPSAwO1xuICAgICAgY29uc3QgYXJncyA9IGFwaS5wYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IHtcbiAgICAgICAgaWYgKEFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyYW1zW3BhcmFtc0luZGV4KytdO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIOuqqOuNuCDrqZTshJzrk5wg7Zi47LacICjquLDsobQg66mU7ISc65OcIOyerOyCrOyaqSlcbiAgICAgIHJldHVybiB0aGlzLmludm9rZU1vZGVsTWV0aG9kKGFwaSwgYXJncywgcmVwbHkpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgaW52b2tlTW9kZWxNZXRob2QoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBhcmdzOiB1bmtub3duW10sXG4gICAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLnN5bmNlci5tb2RlbHNbYXBpLm1vZGVsTmFtZV07XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBtb2RlbOydgCDrqqjrjbgg7J247Iqk7YS07Iqk7J2066+A66GcIOuplOyEnOuTnCDtmLjstpwg6rCA64qlXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgKG1vZGVsIGFzIGFueSlbYXBpLm1ldGhvZE5hbWVdLmFwcGx5KG1vZGVsLCBhcmdzKTtcbiAgICByZXBseS50eXBlKGFwaS5vcHRpb25zLmNvbnRlbnRUeXBlID8/IFwiYXBwbGljYXRpb24vanNvblwiKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyBjcmVhdGVDb250ZXh0KFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICByZXBseTogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPENvbnRleHQ+IHtcbiAgICAvLyBjcmVhdGVTU0VGYWN0b3J5IO2VqOyImOyXkCDrr7jrpqwgcmVxdWVzdOydmCBzb2NrZXTqs7wgcmVwbHnrpbwg67CU7J2465SpLlxuICAgIGNvbnN0IHsgY3JlYXRlU1NFRmFjdG9yeSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3RyZWFtL3NzZVwiKTtcbiAgICBjb25zdCBjcmVhdGVTU0UgPSAoPFQgZXh0ZW5kcyBab2RPYmplY3Q+KFxuICAgICAgX3JlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgICAgX3JlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICAgICBfZXZlbnRzOiBULFxuICAgICkgPT4gY3JlYXRlU1NFRmFjdG9yeShfcmVxdWVzdC5zb2NrZXQsIF9yZXBseSwgX2V2ZW50cykpLmJpbmQobnVsbCwgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgLy8gbG9jYWxlIOqwkOyngFxuICAgIGNvbnN0IGxvY2FsZSA9XG4gICAgICB0aGlzLmRldGVjdExvY2FsZShyZXF1ZXN0LmhlYWRlcnNbXCJhY2NlcHQtbGFuZ3VhZ2VcIl0sIHRoaXMuY29uZmlnLmkxOG4uc3VwcG9ydGVkTG9jYWxlcykgPz9cbiAgICAgIHRoaXMuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZTtcblxuICAgIC8vIGF1dGggY29udGV4dCDstpTqsIBcbiAgICBjb25zdCBoZWFkZXJzID0gY29udmVydEZhc3RpZnlIZWFkZXJzVG9TdGFuZGFyZChyZXF1ZXN0LmhlYWRlcnMpO1xuICAgIGNvbnN0IHNlc3Npb24gPSAoYXdhaXQgdGhpcy5fYXV0aD8uYXBpLmdldFNlc3Npb24oeyBoZWFkZXJzIH0pKSA/PyBudWxsO1xuXG4gICAgY29uc3QgY29udGV4dDogQ29udGV4dCA9IHtcbiAgICAgIC4uLihhd2FpdCBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgIGNvbmZpZy5jb250ZXh0UHJvdmlkZXIoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIHJlcGx5LFxuICAgICAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICAgICAgY3JlYXRlU1NFLFxuICAgICAgICAgICAgbmFpdGVTdG9yZTogTmFpdGUuY3JlYXRlU3RvcmUoKSxcbiAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgIC8vIGF1dGhcbiAgICAgICAgICAgIHVzZXI6IHNlc3Npb24/LnVzZXIgPz8gbnVsbCxcbiAgICAgICAgICAgIHNlc3Npb246IHNlc3Npb24/LnNlc3Npb24gPz8gbnVsbCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgcmVwbHksXG4gICAgICAgICksXG4gICAgICApKSxcbiAgICB9O1xuICAgIHJldHVybiBjb250ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdC1MYW5ndWFnZSDtl6TrjZTsl5DshJwg7KeA7JuQ7ZWY64qUIGxvY2FsZeydhCDssL7sirXri4jri6QuXG4gICAqIEBleGFtcGxlIFwia28tS1Isa287cT0wLjksZW47cT0wLjhcIiDihpIgXCJrb1wiXG4gICAqL1xuICBwcml2YXRlIGRldGVjdExvY2FsZShcbiAgICBhY2NlcHRMYW5ndWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHN1cHBvcnRlZDogc3RyaW5nW10sXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFhY2NlcHRMYW5ndWFnZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIC8vIEFjY2VwdC1MYW5ndWFnZToga28tS1Isa287cT0wLjksZW47cT0wLjhcbiAgICBjb25zdCBsYW5ncyA9IGFjY2VwdExhbmd1YWdlLnNwbGl0KFwiLFwiKS5tYXAoKGxhbmcpID0+IHtcbiAgICAgIGNvbnN0IFtjb2RlXSA9IGxhbmcuc3BsaXQoXCI7XCIpO1xuICAgICAgcmV0dXJuIGNvZGUudHJpbSgpLnNwbGl0KFwiLVwiKVswXTsgLy8ga28tS1Ig4oaSIGtvXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbGFuZ3MuZmluZCgobGFuZykgPT4gc3VwcG9ydGVkLmluY2x1ZGVzKGxhbmcpKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0V2F0Y2hlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB3YXRjaFBhdGggPSBbcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwic3JjXCIpXTtcblxuICAgIGNvbnN0IGNob2tpZGFyID0gKGF3YWl0IGltcG9ydChcImNob2tpZGFyXCIpKS5kZWZhdWx0O1xuICAgIHRoaXMud2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKHdhdGNoUGF0aCwge1xuICAgICAgaWdub3JlZDogKHBhdGgsIHN0YXRzKSA9PlxuICAgICAgICAhIXN0YXRzPy5pc0ZpbGUoKSAmJiAhcGF0aC5lbmRzV2l0aChcIi50c1wiKSAmJiAhcGF0aC5lbmRzV2l0aChcIi5qc29uXCIpLFxuICAgICAgcGVyc2lzdGVudDogdHJ1ZSxcbiAgICAgIGlnbm9yZUluaXRpYWw6IHRydWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLndhdGNoZXIub24oXCJhbGxcIiwgYXN5bmMgKGV2ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IGZpbGVQYXRoIGFzIEFic29sdXRlUGF0aDtcbiAgICAgIGFzc2VydChcbiAgICAgICAgYWJzb2x1dGVQYXRoLnN0YXJ0c1dpdGgodGhpcy5hcGlSb290UGF0aCksXG4gICAgICAgIFwiRmlsZSBwYXRoIGlzIG5vdCB3aXRoaW4gdGhlIEFQSSByb290IHBhdGhcIixcbiAgICAgICk7XG5cbiAgICAgIGlmIChldmVudCAhPT0gXCJjaGFuZ2VcIiAmJiBldmVudCAhPT0gXCJhZGRcIikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIHNvbmFtdS5jb25maWcudHMg67OA6rK9IOyLnCDsnqzsi5zsnpFcbiAgICAgICAgY29uc3QgaXNDb25maWdUcyA9IGZpbGVQYXRoID09PSBwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJzb25hbXUuY29uZmlnLnRzXCIpO1xuXG4gICAgICAgIGlmIChpc0NvbmZpZ1RzKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gZmlsZVBhdGgucmVwbGFjZSh0aGlzLmFwaVJvb3RQYXRoLCBcImFwaVwiKTtcbiAgICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNoYWxrLmJvbGQoYERldGVjdGVkKCR7ZXZlbnR9KTogJHtjaGFsay5ibHVlKHJlbGF0aXZlUGF0aCl9IC0gUmVzdGFydGluZy4uLmApLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCBcIlNJR1VTUjJcIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGaWxlQ2hhbmdlKGV2ZW50LCBhYnNvbHV0ZVBhdGgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLypcbiAgICAgQSBmdW5jdGlvbiB0aGF0IGF1dG9tYXRpY2FsbHkgaGFuZGxlcyBpbml0IGFuZCBkZXN0cm95IHdoZW4gdXNpbmcgU29uYW11IHZpYSBzY3JpcHRzLlxuICAqL1xuICBhc3luYyBydW5TY3JpcHQoZm46ICgpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgICBhd2FpdCB0aGlzLmluaXQodHJ1ZSwgZmFsc2UsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyUGx1Z2lucyhzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSwgcGx1Z2luczogU29uYW11U2VydmVyT3B0aW9uc1tcInBsdWdpbnNcIl0pIHtcbiAgICBpZiAoIXBsdWdpbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjb21wcmVzcyDtlIzrn6zqt7jsnbjsnYAg64uk66W4IO2UjOufrOq3uOyduOuztOuLpCDrqLzsoIAg65Ox66Gd65CY7Ja07JW8IO2VqeuLiOuLpC5cbiAgICBpZiAocGx1Z2lucy5jb21wcmVzcykge1xuICAgICAgY29uc3QgY29tcHJlc3NQbHVnaW4gPSAoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvY29tcHJlc3NcIikpLmRlZmF1bHQ7XG4gICAgICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICAgICAgdGhyZXNob2xkOiAxMDI0LFxuICAgICAgICBlbmNvZGluZ3M6IFtcImJyXCIsIFwiZ3ppcFwiLCBcImRlZmxhdGVcIl0gYXMgKFwiYnJcIiB8IFwiZ3ppcFwiIHwgXCJkZWZsYXRlXCIpW10sXG4gICAgICB9O1xuXG4gICAgICBpZiAocGx1Z2lucy5jb21wcmVzcyA9PT0gdHJ1ZSkge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoY29tcHJlc3NQbHVnaW4sIGRlZmF1bHRPcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3Rlcihjb21wcmVzc1BsdWdpbiwge1xuICAgICAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgICAgIC4uLnBsdWdpbnMuY29tcHJlc3MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBsdWdpbnNNb2R1bGVzID0ge1xuICAgICAgY29yczogXCJAZmFzdGlmeS9jb3JzXCIsXG4gICAgICBmb3JtYm9keTogXCJAZmFzdGlmeS9mb3JtYm9keVwiLFxuICAgICAgbXVsdGlwYXJ0OiBcIkBmYXN0aWZ5L211bHRpcGFydFwiLFxuICAgICAgcXM6IFwiZmFzdGlmeS1xc1wiLFxuICAgICAgc3NlOiBcImZhc3RpZnktc3NlLXYyXCIsXG4gICAgICBzdGF0aWM6IFwiQGZhc3RpZnkvc3RhdGljXCIsXG4gICAgfSBhcyBjb25zdDtcblxuICAgIGNvbnN0IHJlZ2lzdGVyUGx1Z2luID0gYXN5bmMgPEsgZXh0ZW5kcyBrZXlvZiBOb25OdWxsYWJsZTx0eXBlb2YgcGx1Z2lucz4+KFxuICAgICAga2V5OiBLLFxuICAgICAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uID0gcGx1Z2luc1trZXldO1xuICAgICAgaWYgKCFvcHRpb24pIHJldHVybjtcblxuICAgICAgaWYgKG9wdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCwgb3B0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBwbHVnaW5OYW1lXSBvZiBPYmplY3QuZW50cmllcyhwbHVnaW5zTW9kdWxlcykpIHtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyUGx1Z2luKGtleSBhcyBrZXlvZiB0eXBlb2YgcGx1Z2lucywgcGx1Z2luTmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBsdWdpbnMuY3VzdG9tKSB7XG4gICAgICBwbHVnaW5zLmN1c3RvbShzZXJ2ZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiZXR0ZXItYXV0aCDrnbzsmrDtirjrpbwg65Ox66Gd7ZWp64uI64ukLlxuICAgKiAvYXBpL2F1dGgvKiDqsr3roZzroZwg7J247KadIEFQSeqwgCDsnpDrj5kg65Ox66Gd65Cp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3RlckJldHRlckF1dGgoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsXG4gICAgb3B0aW9uczogTm9uTnVsbGFibGU8U29uYW11U2VydmVyT3B0aW9uc1tcImF1dGhcIl0+LFxuICApIHtcbiAgICBpZiAoIW9wdGlvbnMpIHJldHVybjtcblxuICAgIGNvbnN0IGJhc2VQYXRoID0gb3B0aW9ucy5iYXNlUGF0aCA/PyBcIi9hcGkvYXV0aFwiO1xuXG4gICAgLy8g7IKs7Jqp7J6QIOyEpOygleqzvCDquLDrs7jqsJLsnYQgbWVyZ2VcbiAgICBjb25zdCBtZXJnZWRGaWVsZE1hcHBpbmdzID0gbWVyZ2UoQkFTRV9GSUVMRF9NQVBQSU5HUywgb3B0aW9ucyk7XG5cbiAgICAvLyBiZXR0ZXItYXV0aCDsnbjsiqTthLTsiqQg7IOd7ISxXG4gICAgY29uc3QgeyBiZXR0ZXJBdXRoIH0gPSBhd2FpdCBpbXBvcnQoXCJiZXR0ZXItYXV0aFwiKTtcbiAgICBjb25zdCB7IFBvb2wgfSA9IGF3YWl0IGltcG9ydChcInBnXCIpO1xuXG4gICAgdGhpcy5fYXV0aCA9IGJldHRlckF1dGgoe1xuICAgICAgZGF0YWJhc2U6IG5ldyBQb29sKERCLmdldERCQ29uZmlnKFwid1wiKS5jb25uZWN0aW9uIGFzIFBvb2xDb25maWcpLFxuICAgICAgLi4ubWVyZ2VkRmllbGRNYXBwaW5ncyxcbiAgICB9KTtcblxuICAgIC8vIGJldHRlci1hdXRoIOudvOyasO2KuCDrk7HroZ1cbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJQT1NUXCJdLFxuICAgICAgdXJsOiBgJHtiYXNlUGF0aH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybCwgYGh0dHA6Ly8ke3JlcXVlc3QuaGVhZGVycy5ob3N0fWApO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0gY29udmVydEZhc3RpZnlIZWFkZXJzVG9TdGFuZGFyZChyZXF1ZXN0LmhlYWRlcnMpO1xuICAgICAgICBjb25zdCByZXEgPSBuZXcgUmVxdWVzdCh1cmwudG9TdHJpbmcoKSwge1xuICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAuLi4ocmVxdWVzdC5ib2R5ID8geyBib2R5OiBKU09OLnN0cmluZ2lmeShyZXF1ZXN0LmJvZHkpIH0gOiB7fSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmhhbmRsZXIocmVxKTtcblxuICAgICAgICByZXBseS5zdGF0dXMocmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5mb3JFYWNoKCh2YWx1ZTogc3RyaW5nLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHJlcGx5LmhlYWRlcihrZXksIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXBseS5zZW5kKHJlc3BvbnNlLmJvZHkgPyBhd2FpdCByZXNwb25zZS50ZXh0KCkgOiBudWxsKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIGJldHRlci1hdXRoIHJlZ2lzdGVyZWQgYXQgJHtiYXNlUGF0aH0vKmApKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZUNhY2hlKGNvbmZpZzogQ2FjaGVDb25maWcgfCB1bmRlZmluZWQsIGZvclRlc3Rpbmc6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB7IHNldENhY2hlTWFuYWdlclJlZiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vY2FjaGUvZGVjb3JhdG9yXCIpO1xuXG4gICAgLy8g7YWM7Iqk7Yq4IO2ZmOqyveyXkOyEnCDrqZTrqqjrpqwg65Oc65287J2067KEIOyekOuPmSDsgqzsmqlcbiAgICBpZiAoZm9yVGVzdGluZykge1xuICAgICAgY29uc3QgeyBjcmVhdGVUZXN0Q2FjaGVNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9jYWNoZS1tYW5hZ2VyXCIpO1xuICAgICAgdGhpcy5fY2FjaGUgPSBjcmVhdGVUZXN0Q2FjaGVNYW5hZ2VyKCk7XG4gICAgICBzZXRDYWNoZU1hbmFnZXJSZWYodGhpcy5fY2FjaGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOyEpOygleydtCDsl4bsnLzrqbQg7LqQ7IucIOu5hO2ZnOyEse2ZlFxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICBzZXRDYWNoZU1hbmFnZXJSZWYobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7ISk7KCV7JeQIOuUsOudvCBDYWNoZU1hbmFnZXIg7IOd7ISxXG4gICAgY29uc3QgeyBjcmVhdGVDYWNoZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2NhY2hlLW1hbmFnZXJcIik7XG4gICAgdGhpcy5fY2FjaGUgPSBjcmVhdGVDYWNoZU1hbmFnZXIoY29uZmlnKTtcbiAgICBzZXRDYWNoZU1hbmFnZXJSZWYodGhpcy5fY2FjaGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplV29ya2Zsb3dzKG9wdGlvbnM6IFNvbmFtdVRhc2tPcHRpb25zIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgeyBXb3JrZmxvd01hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Rhc2tzL3dvcmtmbG93LW1hbmFnZXJcIik7XG4gICAgLy8gTk9URTogQHNvbmFtdS1raXQvdGFza3Mg7JWI7JeQ7ISgIGtuZXggY29uZmln66W8IOyImOygle2VmOq4sCDrlYzrrLjsl5AgY29ubmVjdGlvbuydtCDslYTri4wgY29uZmlnIOynuOuhnCDrs7Trg4Xri4jri6QuXG4gICAgdGhpcy5fd29ya2Zsb3dzID0gbmV3IFdvcmtmbG93TWFuYWdlcihEQi5nZXREQkNvbmZpZyhcIndcIikpO1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVuYWJsZVdvcmtlciA9IG9wdGlvbnMuZW5hYmxlV29ya2VyID8/IGlzRGFlbW9uU2VydmVyKCk7XG4gICAgY29uc3QgZGVmYXVsdFdvcmtlck9wdGlvbnMgPSB7XG4gICAgICBjb25jdXJyZW5jeTogb3MuY3B1cygpLmxlbmd0aCAtIDEsXG4gICAgICB1c2VQdWJTdWI6IHRydWUsXG4gICAgICBsaXN0ZW5EZWxheTogNTAwLFxuICAgIH07XG5cbiAgICBpZiAoZW5hYmxlV29ya2VyKSB7XG4gICAgICB0aGlzLndvcmtmbG93cy5zZXR1cFdvcmtlcih7XG4gICAgICAgIC4uLmRlZmF1bHRXb3JrZXJPcHRpb25zLFxuICAgICAgICAuLi5vcHRpb25zLndvcmtlck9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJvb3Qoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsIG9wdGlvbnM6IFNvbmFtdVNlcnZlck9wdGlvbnMpIHtcbiAgICBjb25zdCBwb3J0ID0gb3B0aW9ucy5saXN0ZW4/LnBvcnQgPz8gMzAwMDtcbiAgICBjb25zdCBob3N0ID0gb3B0aW9ucy5saXN0ZW4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcblxuICAgIHNlcnZlci5hZGRIb29rKFwib25DbG9zZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBvcHRpb25zLmxpZmVjeWNsZT8ub25TaHV0ZG93bj8uKHNlcnZlcik7XG4gICAgICBhd2FpdCB0aGlzLndvcmtmbG93cy5kZXN0cm95KCk7XG4gICAgICBhd2FpdCB0aGlzLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNodXRkb3duID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2VydmVyLmNsb3NlKCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZHVyaW5nIHNodXRkb3duOlwiLCBlcnIpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIHNodXRkb3duKTtcblxuICAgIGlmIChvcHRpb25zLmxpZmVjeWNsZT8ub25FcnJvcikge1xuICAgICAgc2VydmVyLnNldEVycm9ySGFuZGxlcihvcHRpb25zLmxpZmVjeWNsZT8ub25FcnJvcik7XG4gICAgfVxuXG4gICAgc2VydmVyXG4gICAgICAubGlzdGVuKHsgcG9ydCwgaG9zdCB9KVxuICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLndvcmtmbG93cy5zdGFydFdvcmtlcigpO1xuICAgICAgICBhd2FpdCBvcHRpb25zLmxpZmVjeWNsZT8ub25TdGFydD8uKHNlcnZlcik7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGFzeW5jIChlcnIpID0+IHtcbiAgICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiRmFpbGVkIHRvIHN0YXJ0IHNlcnZlcjpcIiwgZXJyKSk7XG4gICAgICAgIGF3YWl0IHNodXRkb3duKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRmlsZUNoYW5nZShldmVudDogc3RyaW5nLCBmaWxlUGF0aDogQWJzb2x1dGVQYXRoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7LKrIOuyiOynuCDtjIzsnbzsnbTrqbQgSE1SIOyLnOyekSDsi5zqsIQg6riw66GdXG4gICAgaWYgKHRoaXMucGVuZGluZ0ZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5obXJTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmdGaWxlcy5wdXNoKGZpbGVQYXRoKTtcblxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUodGhpcy5hcGlSb290UGF0aCwgZmlsZVBhdGgpO1xuICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYERldGVjdGVkKCR7ZXZlbnR9KTogJHtjaGFsay5ibHVlKHJlbGF0aXZlUGF0aCl9YCkpO1xuXG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuc3luY0Zyb21XYXRjaGVyKGV2ZW50LCBmaWxlUGF0aCk7XG5cbiAgICAvLyDsspjrpqwg7JmE66OM65CcIO2MjOydvOydhCDrjIDquLAg66qp66Gd7JeQ7IScIOygnOqxsFxuICAgIHRoaXMucGVuZGluZ0ZpbGVzID0gdGhpcy5wZW5kaW5nRmlsZXMuc2xpY2UoMSk7XG5cbiAgICAvLyDrqqjrk6Ag7YyM7J28IOyymOumrOqwgCDsmYTro4zrkJjrqbQg7LWc7KKFIOuplOyLnOyngCDstpzroKVcbiAgICBpZiAodGhpcy5wZW5kaW5nRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmlzaEhNUigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmluaXNoSE1SKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLnJlbmV3Q2hlY2tzdW1zKCk7XG5cbiAgICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB0b3RhbFRpbWUgPSBlbmRUaW1lIC0gdGhpcy5obXJTdGFydFRpbWU7XG4gICAgY29uc3QgW2NoYWxrLCB7IGNlbnRlclRleHQgfV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQsXG4gICAgICBpbXBvcnQoXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIiksXG4gICAgXSk7XG4gICAgY29uc3QgbXNnID0gYEhNUiBEb25lISAke2NoYWxrLmJvbGQud2hpdGUoYCR7dG90YWxUaW1lfW1zYCl9YDtcblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsYWNrLmJnR3JlZW4oY2VudGVyVGV4dChtc2cpKSk7XG4gIH1cblxuICBhc3luYyBkZXN0cm95KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgQmFzZU1vZGVsIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9kYXRhYmFzZS9iYXNlLW1vZGVsXCIpO1xuICAgIC8vIOuovOyggCDsspjrpqztlbTslbztlaguXG4gICAgYXdhaXQgQmFzZU1vZGVsLmRlc3Ryb3koKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgdGhpcy5fd29ya2Zsb3dzPy5kZXN0cm95KCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICB0aGlzLl9jYWNoZT8uZGlzY29ubmVjdCgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgdGhpcy53YXRjaGVyPy5jbG9zZSgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgbG9ndGFwZURpc3Bvc2UoKSxcbiAgICBdKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgU29uYW11ID0gbmV3IFNvbmFtdUNsYXNzKCk7XG5cbi8qKlxuICogc3RyZWFtIOuqqOuTnOyXkOyEnCDtgqQg7IOd7ISxIO2VqOyImOqwgCDsp4DsoJXrkJjsp4Ag7JWK7JWY7J2EIOuVjCDsgqzsmqntlZjripQg6riw67O4IO2VqOyImOyeheuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEtleUdlbmVyYXRvcihmaWxlOiB7IGZpbGVuYW1lOiBzdHJpbmc7IG1pbWV0eXBlOiBzdHJpbmcgfSk6IHN0cmluZyB7XG4gIGNvbnN0IGV4dCA9IG1pbWUuZXh0ZW5zaW9uKGZpbGUubWltZXR5cGUpIHx8IFwiYmluXCI7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHJhbmRvbSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDgpO1xuICByZXR1cm4gYHVwbG9hZHMvJHt0aW1lc3RhbXB9LSR7cmFuZG9tfS4ke2V4dH1gO1xufVxuIl0sIm5hbWVzIjpbImRpc3Bvc2UiLCJsb2d0YXBlRGlzcG9zZSIsImFzc2VydCIsIkFzeW5jTG9jYWxTdG9yYWdlIiwiZnMiLCJtaW1lIiwibG9va3VwIiwibWltZUxvb2t1cCIsIm9zIiwicGF0aCIsIkJBU0VfRklFTERfTUFQUElOR1MiLCJjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkIiwiY3JlYXRlTW9ja1NTRUZhY3RvcnkiLCJEQiIsImlzRGFlbW9uU2VydmVyIiwibWVyZ2UiLCJOb3RGb3VuZEV4Y2VwdGlvbiIsImFwcGx5Q2FjaGVIZWFkZXJzIiwiQ2FjaGVQcmVzZXRzIiwidG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24iLCJTRCIsIk5haXRlIiwiQnVmZmVyZWRGaWxlIiwiVXBsb2FkZWRGaWxlIiwiZXhpc3RzIiwiZmlsZUV4aXN0cyIsImdldFNlY3JldHMiLCJTb25hbXVDbGFzcyIsImlzSW5pdGlhbGl6ZWQiLCJmb3JUZXN0aW5nIiwiYXN5bmNMb2NhbFN0b3JhZ2UiLCJnZXRDb250ZXh0Iiwic3RvcmUiLCJnZXRTdG9yZSIsImNvbnRleHQiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJyZXF1ZXN0IiwicmVwbHkiLCJoZWFkZXJzIiwiY3JlYXRlU1NFIiwic2NoZW1hIiwibmFpdGVTdG9yZSIsIk1hcCIsIkVycm9yIiwiX2FwaVJvb3RQYXRoIiwiYXBpUm9vdFBhdGgiLCJhcHBSb290UGF0aCIsInNwbGl0Iiwic2VwIiwic2xpY2UiLCJqb2luIiwiX2RiQ29uZmlnIiwiZGJDb25maWciLCJfc3luY2VyIiwic3luY2VyIiwiX2NvbmZpZyIsImNvbmZpZyIsInNlY3JldHMiLCJfc3RvcmFnZSIsInN0b3JhZ2UiLCJfY2FjaGUiLCJjYWNoZSIsIl93b3JrZmxvd3MiLCJ3b3JrZmxvd3MiLCJfYXV0aCIsImF1dGgiLCJ3YXRjaGVyIiwicGVuZGluZ0ZpbGVzIiwiaG1yU3RhcnRUaW1lIiwic2VydmVyIiwiaW5pdEZvclRlc3RpbmciLCJpbml0IiwidW5kZWZpbmVkIiwiZG9TaWxlbnQiLCJlbmFibGVTeW5jIiwiY2hhbGsiLCJkZWZhdWx0IiwiY29uc29sZSIsInRpbWUiLCJjeWFuIiwiZmluZEFwaVJvb3RQYXRoIiwibG9hZENvbmZpZyIsImRhdGFiYXNlIiwiZGVmYXVsdE9wdGlvbnMiLCJjbGllbnQiLCJjb25maWd1cmVMb2dUYXBlIiwibG9nZ2luZyIsImdlbmVyYXRlREJDb25maWciLCJsb2ciLCJncmVlbiIsIkVudGl0eU1hbmFnZXIiLCJhdXRvbG9hZCIsImluaXRpYWxpemVDYWNoZSIsImluaXRpYWxpemVXb3JrZmxvd3MiLCJ0YXNrcyIsIlN5bmNlciIsImF1dG9sb2FkVHlwZXMiLCJhdXRvbG9hZE1vZGVscyIsImF1dG9sb2FkQXBpcyIsImF1dG9sb2FkV29ya2Zsb3dzIiwiVGVtcGxhdGVNYW5hZ2VyIiwiYXV0b2xvYWRTU1JSb3V0ZXMiLCJpc0xvY2FsIiwiaXNUZXN0Iiwic2V0dXBCaW9tZSIsImlzSG90UmVsb2FkU2VydmVyIiwic3luYyIsInN0YXJ0V2F0Y2hlciIsInRpbWVFbmQiLCJjcmVhdGVTZXJ2ZXIiLCJpbml0T3B0aW9ucyIsIm9wdGlvbnMiLCJmYXN0aWZ5IiwiZ2V0TG9nVGFwZUZhc3RpZnlMb2dnZXIiLCJsb2dnZXIiLCJjYXRlZ29yeSIsImZhc3RpZnlDYXRlZ29yeSIsIlN0b3JhZ2VNYW5hZ2VyIiwicGx1Z2lucyIsInJlZ2lzdGVyUGx1Z2lucyIsInJlZ2lzdGVyQmV0dGVyQXV0aCIsIndpdGhGYXN0aWZ5IiwiYXBpQ29uZmlnIiwiYm9vdCIsInRpbWV6b25lIiwiYXBpIiwiZm9ybWF0SW5UaW1lWm9uZSIsIklTT19EQVRFX1JFR0VYIiwiREFURV9GT1JNQVQiLCJzZXRSZXBseVNlcmlhbGl6ZXIiLCJwYXlsb2FkIiwiSlNPTiIsInN0cmluZ2lmeSIsIl9rZXkiLCJ2YWx1ZSIsInRlc3QiLCJEYXRlIiwiZ2V0Iiwicm91dGUiLCJwcmVmaXgiLCJfcmVxdWVzdCIsIl9yZXBseSIsImFwaXMiLCJzb25hbXVVSUFwaVBsdWdpbiIsInJlZ2lzdGVyIiwid2ViUGF0aCIsImhhc1dlYiIsInBsdWdpbkNvbXByZXNzIiwiY29tcHJlc3MiLCJnbG9iYWxDb21wcmVzc09wdGlvbnMiLCJ0aHJlc2hvbGQiLCJlbmNvZGluZ3MiLCJjdXN0b21UeXBlcyIsImRpc2FibGVJbnRlZ3JhdGVkV2ViIiwiU09OQU1VX0RJU0FCTEVfSU5URUdSQVRFRF9XRUIiLCJzZXR1cERldlNlcnZlcldpdGhWaXRlIiwic2V0dXBEZXZTZXJ2ZXIiLCJtb2RlbHMiLCJtb2RlbE5hbWUiLCJtZXRob2QiLCJodHRwTWV0aG9kIiwidXJsIiwiaGFuZGxlciIsImNyZWF0ZUFwaUhhbmRsZXIiLCJzZXR1cFN0YXRpY1dlYlNlcnZlciIsImhhbmRsZURldkFwaVJlcXVlc3QiLCJnZXRQYXRobmFtZUZyb21VcmwiLCJzdGFydHNXaXRoIiwibWF0Y2hlZEFwaSIsImZpbmQiLCJhcGlNZXRob2QiLCJmdWxsUGF0aCIsImlzUGF0aFBhdHRlcm5NYXRjaCIsInZpdGVTZXJ2ZXIiLCJ2aXRlIiwicm9vdCIsIm1pZGRsZXdhcmVNb2RlIiwiaG1yIiwiYXBwVHlwZSIsInVzZSIsInJlcSIsInJlcyIsIm5leHQiLCJtaWRkbGV3YXJlcyIsInJlc3VsdCIsIm1hdGNoU1NSUm91dGUiLCJyZW5kZXJTU1IiLCJzc3JNYXRjaCIsImh0bWwiLCJwYXJhbXMiLCJ0eXBlIiwidGVtcGxhdGUiLCJyZWFkRmlsZSIsInRyYW5zZm9ybUluZGV4SHRtbCIsImUiLCJzc3JGaXhTdGFja3RyYWNlIiwiZXJyb3IiLCJzdGF0dXMiLCJtZXNzYWdlIiwiYWRkSG9vayIsImNsb3NlIiwid2ViRGlzdFBhdGgiLCJzc3JQYXRoIiwic3NyRW50cnlQYXRoIiwic3NyUm91dGVzUGF0aCIsIndhcm4iLCJzc3JBdmFpbGFibGUiLCJyZXF1ZXN0ZWRGaWxlIiwiZmlsZW5hbWUiLCJhc3NldHNEaXIiLCJzYWZlRmlsZVBhdGgiLCJyZXNvbHZlUGF0aFdpdGhpbkJhc2VEaXIiLCJzZW5kIiwibm9ybWFsaXplZFJlcXVlc3RlZEZpbGUiLCJyZWxhdGl2ZSIsInJlcGxhY2UiLCJhc3NldFBhdGgiLCJnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCIsImNhY2hlUmVxIiwiY2FjaGVDb250cm9sSGFuZGxlciIsImltbXV0YWJsZSIsImV4dCIsInBvcCIsImZpbGVzIiwicmVhZGRpciIsImN1cnJlbnRGaWxlIiwiZiIsImVuZHNXaXRoIiwiZmlsZVBhdGgiLCJjb250ZW50IiwiaW5jbHVkZXMiLCJnZXRTU1JSb3V0ZXMiLCJzc3JSb3V0ZXMiLCJleHRyYWN0UGF0aFBhcmFtcyIsImNzckNhY2hlUmVxIiwiY3NyQ2FjaGVDb25maWciLCJyZXF1ZXN0UGF0aCIsImluZGV4UGF0aCIsImNyZWF0ZUNvbnRleHQiLCJydW4iLCJndWFyZHMiLCJldmVyeSIsImd1YXJkIiwiZ3VhcmRIYW5kbGVyIiwiZ2V0Wm9kT2JqZWN0RnJvbUFwaSIsIlJlcVR5cGUiLCJ0eXBlcyIsIndoaWNoIiwicmVxQm9keSIsImJ1ZmZlcmVkRmlsZXMiLCJ1cGxvYWRlZEZpbGVzIiwiYm9keSIsInVwbG9hZE9wdGlvbnMiLCJwYXJ0cyIsImxpbWl0cyIsImZpZWxkcyIsImNvbnN1bWUiLCJwYXJ0IiwiYnVmZmVyIiwidG9CdWZmZXIiLCJwdXNoIiwiZmllbGRuYW1lIiwiU3RyaW5nIiwiZGlza05hbWUiLCJkZXN0aW5hdGlvbiIsImRpc2siLCJrZXlHZW5lcmF0b3IiLCJkZWZhdWx0S2V5R2VuZXJhdG9yIiwia2V5IiwibWltZXR5cGUiLCJwdXRTdHJlYW0iLCJmaWxlIiwiY29udGVudFR5cGUiLCJnZXRVcmwiLCJzaWduZWRVcmwiLCJnZXRTaWduZWRVcmwiLCJzaXplIiwiYnl0ZXNSZWFkIiwicXMiLCJwYXJzZWQiLCJwYXJzZSIsIk9iamVjdCIsImFzc2lnbiIsImZhc3RpZnlDYXN0ZXIiLCJab2RFcnJvciIsImh1bWFuaXplWm9kRXJyb3IiLCJtZXNzYWdlcyIsIm1hcCIsImlzc3VlIiwiQmFkUmVxdWVzdEV4Y2VwdGlvbiIsInpvZEVycm9yIiwiYXBpQ2FjaGVDb25maWciLCJnZXRBcGlDYWNoZUNvbnRyb2wiLCJBcGlQYXJhbVR5cGUiLCJhcmdzIiwicGFyYW1ldGVycyIsInBhcmFtIiwiaXNDb250ZXh0IiwibmFtZSIsImludm9rZU1vZGVsTWV0aG9kIiwicGF0dGVybiIsInBhdHRlcm5QYXJ0cyIsImZpbHRlciIsIkJvb2xlYW4iLCJ1cmxQYXJ0cyIsImkiLCJsZW5ndGgiLCJwYXR0ZXJuUGFydCIsInVybFBhcnQiLCJiYXNlRGlyIiwiaW5wdXRQYXRoIiwiZGVjb2RlZCIsImRlY29kZVVSSUNvbXBvbmVudCIsInJlbGF0aXZlUGF0aCIsInJlc29sdmVkUGF0aCIsInJlc29sdmUiLCJyZWxhdGl2ZUZyb21CYXNlIiwiaXNBYnNvbHV0ZSIsImNhY2hlQ29udHJvbCIsInJvdXRlT3B0aW9ucyIsImludm9rZUFwaUZvclNTUiIsInBhcmFtc0luZGV4IiwibW9kZWwiLCJtZXRob2ROYW1lIiwiYXBwbHkiLCJjcmVhdGVTU0VGYWN0b3J5IiwiX2V2ZW50cyIsInNvY2tldCIsImJpbmQiLCJsb2NhbGUiLCJkZXRlY3RMb2NhbGUiLCJpMThuIiwic3VwcG9ydGVkTG9jYWxlcyIsImRlZmF1bHRMb2NhbGUiLCJzZXNzaW9uIiwiZ2V0U2Vzc2lvbiIsIlByb21pc2UiLCJjb250ZXh0UHJvdmlkZXIiLCJjcmVhdGVTdG9yZSIsInVzZXIiLCJhY2NlcHRMYW5ndWFnZSIsInN1cHBvcnRlZCIsImxhbmdzIiwibGFuZyIsImNvZGUiLCJ0cmltIiwid2F0Y2hQYXRoIiwiY2hva2lkYXIiLCJ3YXRjaCIsImlnbm9yZWQiLCJzdGF0cyIsImlzRmlsZSIsInBlcnNpc3RlbnQiLCJpZ25vcmVJbml0aWFsIiwib24iLCJldmVudCIsImFic29sdXRlUGF0aCIsImlzQ29uZmlnVHMiLCJib2xkIiwiYmx1ZSIsImtpbGwiLCJwaWQiLCJoYW5kbGVGaWxlQ2hhbmdlIiwicnVuU2NyaXB0IiwiZm4iLCJkZXN0cm95IiwiY29tcHJlc3NQbHVnaW4iLCJwbHVnaW5zTW9kdWxlcyIsImNvcnMiLCJmb3JtYm9keSIsIm11bHRpcGFydCIsInNzZSIsInN0YXRpYyIsInJlZ2lzdGVyUGx1Z2luIiwicGx1Z2luTmFtZSIsIm9wdGlvbiIsImVudHJpZXMiLCJjdXN0b20iLCJiYXNlUGF0aCIsIm1lcmdlZEZpZWxkTWFwcGluZ3MiLCJiZXR0ZXJBdXRoIiwiUG9vbCIsImdldERCQ29uZmlnIiwiY29ubmVjdGlvbiIsIlVSTCIsImhvc3QiLCJSZXF1ZXN0IiwidG9TdHJpbmciLCJyZXNwb25zZSIsImZvckVhY2giLCJoZWFkZXIiLCJ0ZXh0Iiwic2V0Q2FjaGVNYW5hZ2VyUmVmIiwiY3JlYXRlVGVzdENhY2hlTWFuYWdlciIsImNyZWF0ZUNhY2hlTWFuYWdlciIsIldvcmtmbG93TWFuYWdlciIsImVuYWJsZVdvcmtlciIsImRlZmF1bHRXb3JrZXJPcHRpb25zIiwiY29uY3VycmVuY3kiLCJjcHVzIiwidXNlUHViU3ViIiwibGlzdGVuRGVsYXkiLCJzZXR1cFdvcmtlciIsIndvcmtlck9wdGlvbnMiLCJwb3J0IiwibGlzdGVuIiwibGlmZWN5Y2xlIiwib25TaHV0ZG93biIsInNodXRkb3duIiwiZXhpdCIsImVyciIsIm9uRXJyb3IiLCJzZXRFcnJvckhhbmRsZXIiLCJ0aGVuIiwic3RhcnRXb3JrZXIiLCJvblN0YXJ0IiwiY2F0Y2giLCJyZWQiLCJub3ciLCJzeW5jRnJvbVdhdGNoZXIiLCJmaW5pc2hITVIiLCJyZW5ld0NoZWNrc3VtcyIsImVuZFRpbWUiLCJ0b3RhbFRpbWUiLCJjZW50ZXJUZXh0IiwiYWxsIiwibXNnIiwid2hpdGUiLCJibGFjayIsImJnR3JlZW4iLCJCYXNlTW9kZWwiLCJhbGxTZXR0bGVkIiwiZGlzY29ubmVjdCIsIlNvbmFtdSIsImV4dGVuc2lvbiIsInRpbWVzdGFtcCIsInJhbmRvbSIsIk1hdGgiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFdBQVdDLGNBQWMsUUFBUSxtQkFBbUI7QUFDN0QsT0FBT0MsWUFBWSxTQUFTO0FBQzVCLFNBQVNDLGlCQUFpQixRQUFRLGNBQWM7QUFJaEQsT0FB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