testcafe 1.13.0 → 1.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. package/CHANGELOG.md +88 -10
  2. package/LICENSE +21 -21
  3. package/README.md +52 -48
  4. package/bin/testcafe-with-v8-flag-filter.js +0 -0
  5. package/lib/api/exportable-lib/index.js +50 -50
  6. package/lib/api/request-hooks/assert-type.js +7 -7
  7. package/lib/api/request-hooks/hook-method-names.js +11 -0
  8. package/lib/api/request-hooks/hook.js +33 -39
  9. package/lib/api/request-hooks/interfaces.js +3 -3
  10. package/lib/api/request-hooks/request-logger.js +113 -111
  11. package/lib/api/request-hooks/request-mock/create-request-mock.js +12 -0
  12. package/lib/api/request-hooks/request-mock/index.js +46 -0
  13. package/lib/api/request-hooks/request-mock.js +47 -48
  14. package/lib/api/structure/base-unit.js +11 -11
  15. package/lib/api/structure/fixture.js +75 -75
  16. package/lib/api/structure/interfaces.js +2 -2
  17. package/lib/api/structure/test-file.js +31 -31
  18. package/lib/api/structure/test-timeout.js +9 -9
  19. package/lib/api/structure/test.js +85 -85
  20. package/lib/api/structure/testing-unit.js +89 -89
  21. package/lib/api/structure/unit-type.js +9 -9
  22. package/lib/api/test-controller/assertion.js +88 -88
  23. package/lib/api/test-controller/execution-context.js +82 -82
  24. package/lib/api/test-controller/index.js +359 -319
  25. package/lib/api/test-controller/proxy.js +28 -28
  26. package/lib/api/test-page-url.js +60 -60
  27. package/lib/api/test-run-tracker.js +68 -68
  28. package/lib/api/wrap-test-function.js +49 -49
  29. package/lib/assertions/executor.js +74 -74
  30. package/lib/assertions/get-fn.js +46 -46
  31. package/lib/assertions/type.js +20 -20
  32. package/lib/assets/content-types.js +9 -9
  33. package/lib/assets/injectables.js +18 -18
  34. package/lib/browser/connection/command.js +10 -10
  35. package/lib/browser/connection/error-hints.js +9 -9
  36. package/lib/browser/connection/gateway.js +159 -159
  37. package/lib/browser/connection/get-hints.js +33 -33
  38. package/lib/browser/connection/heartbeat-status.js +8 -8
  39. package/lib/browser/connection/index.js +328 -328
  40. package/lib/browser/connection/remotes-queue.js +46 -46
  41. package/lib/browser/connection/service-routes.js +12 -12
  42. package/lib/browser/connection/status.js +12 -12
  43. package/lib/browser/interfaces.js +2 -2
  44. package/lib/browser/provider/built-in/dedicated/base.js +80 -80
  45. package/lib/browser/provider/built-in/dedicated/chrome/browser-client.js +204 -204
  46. package/lib/browser/provider/built-in/dedicated/chrome/build-chrome-args.js +17 -17
  47. package/lib/browser/provider/built-in/dedicated/chrome/config.js +110 -110
  48. package/lib/browser/provider/built-in/dedicated/chrome/create-temp-profile.js +45 -45
  49. package/lib/browser/provider/built-in/dedicated/chrome/elapsed-upperbounds.js +15 -15
  50. package/lib/browser/provider/built-in/dedicated/chrome/index.js +102 -102
  51. package/lib/browser/provider/built-in/dedicated/chrome/interfaces.js +2 -2
  52. package/lib/browser/provider/built-in/dedicated/chrome/local-chrome.js +24 -24
  53. package/lib/browser/provider/built-in/dedicated/chrome/runtime-info.js +29 -29
  54. package/lib/browser/provider/built-in/dedicated/edge/index.js +10 -10
  55. package/lib/browser/provider/built-in/dedicated/edge/runtime-info.js +29 -29
  56. package/lib/browser/provider/built-in/dedicated/firefox/config.js +33 -33
  57. package/lib/browser/provider/built-in/dedicated/firefox/create-temp-profile.js +78 -78
  58. package/lib/browser/provider/built-in/dedicated/firefox/index.js +73 -73
  59. package/lib/browser/provider/built-in/dedicated/firefox/local-firefox.js +36 -36
  60. package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/commands.js +13 -13
  61. package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/index.js +200 -200
  62. package/lib/browser/provider/built-in/dedicated/firefox/runtime-info.js +17 -17
  63. package/lib/browser/provider/built-in/index.js +21 -21
  64. package/lib/browser/provider/built-in/locally-installed.js +30 -30
  65. package/lib/browser/provider/built-in/path.js +47 -47
  66. package/lib/browser/provider/built-in/remote.js +58 -58
  67. package/lib/browser/provider/index.js +303 -303
  68. package/lib/browser/provider/parse-provider-name.js +16 -16
  69. package/lib/browser/provider/plugin-host.js +121 -121
  70. package/lib/browser/provider/pool.js +115 -115
  71. package/lib/browser/provider/utils/argument-parsing.js +74 -74
  72. package/lib/browser/provider/utils/browser-starter.js +34 -34
  73. package/lib/browser/provider/utils/client-functions.js +24 -24
  74. package/lib/browser/provider/utils/get-maximized-headless-window-size.js +9 -9
  75. package/lib/cli/argument-parser.js +284 -279
  76. package/lib/cli/authentication-helper.js +35 -35
  77. package/lib/cli/cli.js +134 -134
  78. package/lib/cli/correct-browsers-and-sources.js +40 -40
  79. package/lib/cli/index.js +19 -19
  80. package/lib/cli/log.js +43 -43
  81. package/lib/cli/remotes-wizard.js +36 -36
  82. package/lib/cli/termination-handler.js +38 -38
  83. package/lib/client/automation/index.js +144 -46
  84. package/lib/client/automation/index.min.js +1 -1
  85. package/lib/client/browser/idle-page/index.html.mustache +35 -35
  86. package/lib/client/browser/idle-page/logo.svg +86 -86
  87. package/lib/client/browser/service-worker.js +4 -6
  88. package/lib/client/core/index.js +19 -13
  89. package/lib/client/core/index.min.js +1 -1
  90. package/lib/client/driver/index.js +1807 -451
  91. package/lib/client/driver/index.min.js +1 -1
  92. package/lib/client/driver/internal-properties.js +9 -9
  93. package/lib/client/test-run/iframe.js.mustache +17 -17
  94. package/lib/client/test-run/index.js.mustache +51 -51
  95. package/lib/client/ui/index.js +14 -12
  96. package/lib/client/ui/index.min.js +1 -1
  97. package/lib/client/ui/sprite.svg +42 -42
  98. package/lib/client-functions/builder-symbol.js +4 -4
  99. package/lib/client-functions/client-function-builder.js +156 -135
  100. package/lib/client-functions/replicator.js +61 -61
  101. package/lib/client-functions/return-single-prop-mode.js +8 -8
  102. package/lib/client-functions/selector-api-execution-mode.js +22 -0
  103. package/lib/client-functions/selectors/add-api.js +646 -588
  104. package/lib/client-functions/selectors/create-snapshot-methods.js +13 -13
  105. package/lib/client-functions/selectors/prepare-api-args.js +20 -20
  106. package/lib/client-functions/selectors/selector-attribute-filter.js +22 -22
  107. package/lib/client-functions/selectors/selector-builder.js +154 -150
  108. package/lib/client-functions/selectors/selector-text-filter.js +43 -43
  109. package/lib/client-functions/selectors/snapshot-properties.js +48 -48
  110. package/lib/client-functions/types.js +18 -18
  111. package/lib/compiler/babel/format-babel-produced-code.js +10 -10
  112. package/lib/compiler/babel/get-base-babel-options.js +11 -11
  113. package/lib/compiler/babel/load-libs.js +64 -62
  114. package/lib/compiler/babel/preset-stage-2.js +19 -19
  115. package/lib/compiler/compile-client-function.js +73 -73
  116. package/lib/compiler/compilers.js +33 -33
  117. package/lib/compiler/index.js +92 -92
  118. package/lib/compiler/interfaces.js +2 -2
  119. package/lib/compiler/test-file/api-based.js +146 -146
  120. package/lib/compiler/test-file/base.js +36 -36
  121. package/lib/compiler/test-file/exportble-lib-path.js +5 -5
  122. package/lib/compiler/test-file/formats/coffeescript/compiler.js +38 -38
  123. package/lib/compiler/test-file/formats/coffeescript/get-test-list.js +29 -29
  124. package/lib/compiler/test-file/formats/es-next/compiler.js +43 -43
  125. package/lib/compiler/test-file/formats/es-next/get-test-list.js +166 -166
  126. package/lib/compiler/test-file/formats/es-next/is-flow-code.js +7 -7
  127. package/lib/compiler/test-file/formats/raw.js +85 -85
  128. package/lib/compiler/test-file/formats/typescript/compiler.js +135 -135
  129. package/lib/compiler/test-file/formats/typescript/get-test-list.js +185 -185
  130. package/lib/compiler/test-file/test-file-parser-base.js +214 -214
  131. package/lib/configuration/configuration-base.js +165 -165
  132. package/lib/configuration/constants.js +9 -9
  133. package/lib/configuration/customizable-compilers.js +7 -7
  134. package/lib/configuration/default-values.js +51 -51
  135. package/lib/configuration/interfaces.js +3 -3
  136. package/lib/configuration/option-names.js +53 -53
  137. package/lib/configuration/option-source.js +9 -9
  138. package/lib/configuration/option.js +14 -14
  139. package/lib/configuration/quarantine-option-names.js +10 -0
  140. package/lib/configuration/run-option-names.js +26 -26
  141. package/lib/configuration/screenshot-option-names.js +10 -10
  142. package/lib/configuration/testcafe-configuration.js +164 -165
  143. package/lib/configuration/types.js +2 -2
  144. package/lib/configuration/typescript-configuration.js +62 -62
  145. package/lib/custom-client-scripts/assert-type.js +7 -7
  146. package/lib/custom-client-scripts/client-script-init.js +3 -3
  147. package/lib/custom-client-scripts/client-script.js +107 -108
  148. package/lib/custom-client-scripts/get-code.js +11 -11
  149. package/lib/custom-client-scripts/get-url.js +6 -6
  150. package/lib/custom-client-scripts/load.js +15 -15
  151. package/lib/custom-client-scripts/problematic-scripts.js +2 -2
  152. package/lib/custom-client-scripts/routing.js +36 -36
  153. package/lib/custom-client-scripts/utils.js +60 -60
  154. package/lib/embedding-utils.js +83 -83
  155. package/lib/errors/create-stack-filter.js +18 -18
  156. package/lib/errors/error-list.js +26 -26
  157. package/lib/errors/get-callsite.js +31 -31
  158. package/lib/errors/internal-modules-prefix.js +8 -8
  159. package/lib/errors/is-internal-stack-frame.js +46 -46
  160. package/lib/errors/process-test-fn-error.js +37 -37
  161. package/lib/errors/runtime/index.js +123 -123
  162. package/lib/errors/runtime/templates.js +116 -114
  163. package/lib/errors/runtime/type-assertions.js +112 -112
  164. package/lib/errors/stack-cleaning-hook.js +64 -64
  165. package/lib/errors/test-run/formattable-adapter.js +59 -59
  166. package/lib/errors/test-run/index.js +302 -302
  167. package/lib/errors/test-run/render-error-template.js +31 -31
  168. package/lib/errors/test-run/templates.js +93 -95
  169. package/lib/errors/test-run/utils.js +90 -85
  170. package/lib/errors/types.js +157 -155
  171. package/lib/index.js +81 -81
  172. package/lib/live/bootstrapper.js +44 -44
  173. package/lib/live/controller.js +107 -107
  174. package/lib/live/file-watcher/index.js +67 -67
  175. package/lib/live/file-watcher/modules-graph.js +58 -58
  176. package/lib/live/keyboard-observer.js +76 -76
  177. package/lib/live/logger/index.js +64 -64
  178. package/lib/live/test-run-controller.js +96 -96
  179. package/lib/live/test-run-state.js +6 -6
  180. package/lib/live/test-run.js +56 -56
  181. package/lib/live/test-runner.js +168 -168
  182. package/lib/load-assets.js +29 -29
  183. package/lib/notifications/add-rendered-warning.js +16 -16
  184. package/lib/notifications/debug-logger.js +78 -78
  185. package/lib/notifications/deprecated.js +24 -24
  186. package/lib/notifications/information-message.js +12 -12
  187. package/lib/notifications/warning-log.js +32 -31
  188. package/lib/notifications/warning-message.js +48 -48
  189. package/lib/reporter/command/command-formatter.js +120 -109
  190. package/lib/reporter/command/format-command.js +8 -8
  191. package/lib/reporter/command/interfaces.js +2 -2
  192. package/lib/reporter/index.js +319 -314
  193. package/lib/reporter/interfaces.js +2 -2
  194. package/lib/reporter/plugin-host.js +136 -137
  195. package/lib/reporter/plugin-methods.js +12 -12
  196. package/lib/role/index.js +74 -74
  197. package/lib/role/marker-symbol.js +7 -7
  198. package/lib/role/phase.js +9 -9
  199. package/lib/runner/bootstrapper.js +272 -272
  200. package/lib/runner/browser-job-result.js +9 -9
  201. package/lib/runner/browser-job.js +153 -123
  202. package/lib/runner/browser-set.js +114 -114
  203. package/lib/runner/fixture-hook-controller.js +85 -85
  204. package/lib/runner/index.js +450 -442
  205. package/lib/runner/interfaces.js +3 -3
  206. package/lib/runner/reporter-stream-controller.js +28 -28
  207. package/lib/runner/task/index.js +152 -133
  208. package/lib/runner/task/phase.js +9 -9
  209. package/lib/runner/test-run-controller.js +166 -185
  210. package/lib/runner/tested-app.js +73 -72
  211. package/lib/screenshots/capturer.js +141 -141
  212. package/lib/screenshots/constants.js +11 -11
  213. package/lib/screenshots/crop.js +111 -111
  214. package/lib/screenshots/default-extension.js +4 -4
  215. package/lib/screenshots/index.js +67 -67
  216. package/lib/screenshots/utils.js +39 -39
  217. package/lib/services/compiler/host.js +190 -106
  218. package/lib/services/compiler/io.js +9 -9
  219. package/lib/services/compiler/protocol.js +17 -16
  220. package/lib/services/compiler/service.js +225 -106
  221. package/lib/services/compiler/test-run-proxy.js +111 -73
  222. package/lib/services/interfaces.js +3 -0
  223. package/lib/services/process-title.js +8 -8
  224. package/lib/services/serialization/prepare-options.js +17 -17
  225. package/lib/services/serialization/replicator/create-replicator.js +27 -0
  226. package/lib/services/serialization/replicator/custom-error-transform.js +28 -0
  227. package/lib/services/serialization/test-structure.js +93 -77
  228. package/lib/services/utils/ipc/interfaces.js +30 -30
  229. package/lib/services/utils/ipc/io.js +108 -108
  230. package/lib/services/utils/ipc/message.js +76 -73
  231. package/lib/services/utils/ipc/packet.js +55 -55
  232. package/lib/services/utils/ipc/proxy.js +110 -118
  233. package/lib/services/utils/ipc/transport.js +64 -64
  234. package/lib/shared/errors/index.js +382 -382
  235. package/lib/shared/node-modules-folder-name.js +4 -4
  236. package/lib/test-run/bookmark.js +90 -90
  237. package/lib/test-run/browser-console-messages.js +73 -73
  238. package/lib/test-run/browser-manipulation-queue.js +92 -92
  239. package/lib/test-run/client-messages.js +9 -9
  240. package/lib/test-run/commands/actions.js +486 -425
  241. package/lib/test-run/commands/assertion.js +45 -45
  242. package/lib/test-run/commands/base.js +14 -14
  243. package/lib/test-run/commands/browser-manipulation.js +95 -95
  244. package/lib/test-run/commands/from-object.js +82 -82
  245. package/lib/test-run/commands/observation.js +61 -61
  246. package/lib/test-run/commands/options.js +231 -215
  247. package/lib/test-run/commands/service.js +54 -48
  248. package/lib/test-run/commands/type.js +65 -60
  249. package/lib/test-run/commands/utils.js +87 -87
  250. package/lib/test-run/commands/validations/argument.js +90 -90
  251. package/lib/test-run/commands/validations/factories.js +47 -47
  252. package/lib/test-run/commands/validations/initializers.js +44 -44
  253. package/lib/test-run/debug-log.js +32 -32
  254. package/lib/test-run/execute-js-expression.js +74 -74
  255. package/lib/test-run/index.js +823 -752
  256. package/lib/test-run/marker-symbol.js +7 -7
  257. package/lib/test-run/observed-callsites-storage.js +17 -17
  258. package/lib/test-run/phase.js +16 -16
  259. package/lib/test-run/session-controller.js +104 -104
  260. package/lib/testcafe.js +119 -114
  261. package/lib/utils/assignable.js +39 -39
  262. package/lib/utils/async-event-emitter.js +28 -28
  263. package/lib/utils/async-queue.js +14 -14
  264. package/lib/utils/browser-connection-timeouts.js +19 -19
  265. package/lib/utils/callsite.js +17 -17
  266. package/lib/utils/check-file-path.js +31 -31
  267. package/lib/utils/check-url.js +51 -51
  268. package/lib/utils/convert-to-best-fit-type.js +16 -16
  269. package/lib/utils/correct-file-path.js +21 -21
  270. package/lib/utils/define-lazy-property.js +13 -13
  271. package/lib/utils/delay.js +6 -6
  272. package/lib/utils/delegated-api.js +44 -44
  273. package/lib/utils/detect-display.js +6 -6
  274. package/lib/utils/detect-ffmpeg.js +44 -44
  275. package/lib/utils/diff/colors.js +29 -29
  276. package/lib/utils/diff/index.js +53 -53
  277. package/lib/utils/diff/util.js +24 -22
  278. package/lib/utils/diff.js +29 -29
  279. package/lib/utils/escape-user-agent.js +10 -10
  280. package/lib/utils/flag-list.js +17 -17
  281. package/lib/utils/get-any-key.js +8 -8
  282. package/lib/utils/get-browser.js +8 -8
  283. package/lib/utils/get-common-path.js +34 -34
  284. package/lib/utils/get-filter-fn.js +40 -40
  285. package/lib/utils/get-options/base.js +36 -36
  286. package/lib/utils/get-options/compiler.js +33 -33
  287. package/lib/utils/get-options/grep.js +15 -15
  288. package/lib/utils/get-options/index.js +21 -19
  289. package/lib/utils/get-options/meta.js +22 -22
  290. package/lib/utils/get-options/quarantine.js +92 -0
  291. package/lib/utils/get-options/screenshot.js +17 -17
  292. package/lib/utils/get-options/ssl.js +45 -45
  293. package/lib/utils/get-options/video.js +10 -10
  294. package/lib/utils/get-viewport-width.js +18 -18
  295. package/lib/utils/guard-time-execution.js +10 -10
  296. package/lib/utils/handle-errors.js +74 -74
  297. package/lib/utils/handle-tag-args.js +8 -8
  298. package/lib/utils/http.js +30 -30
  299. package/lib/utils/is-localhost.js +11 -11
  300. package/lib/utils/is-password-input.js +11 -0
  301. package/lib/utils/is-repl.js +12 -0
  302. package/lib/utils/is-window-in-iframe.js +6 -6
  303. package/lib/utils/limit-number.js +10 -10
  304. package/lib/utils/make-reg-exp.js +7 -7
  305. package/lib/utils/moment-loader.js +20 -20
  306. package/lib/utils/parse-file-list.js +71 -71
  307. package/lib/utils/parse-user-agent.js +55 -55
  308. package/lib/utils/path-pattern.js +114 -114
  309. package/lib/utils/prepare-reporters.js +30 -30
  310. package/lib/utils/prerender-callsite.js +18 -18
  311. package/lib/utils/process.js +119 -119
  312. package/lib/utils/promisified-functions.js +46 -46
  313. package/lib/utils/re-executable-promise.js +39 -39
  314. package/lib/utils/render-callsite-sync.js +29 -29
  315. package/lib/utils/render-template.js +10 -10
  316. package/lib/utils/reporter.js +30 -30
  317. package/lib/utils/resolve-path-relatively-cwd.js +7 -7
  318. package/lib/utils/string.js +105 -105
  319. package/lib/utils/temp-directory/cleanup-process/commands.js +7 -7
  320. package/lib/utils/temp-directory/cleanup-process/index.js +143 -143
  321. package/lib/utils/temp-directory/cleanup-process/worker.js +58 -58
  322. package/lib/utils/temp-directory/index.js +87 -87
  323. package/lib/utils/temp-directory/lockfile.js +56 -56
  324. package/lib/utils/thennable.js +7 -7
  325. package/lib/utils/timer.js +15 -15
  326. package/lib/utils/to-posix-path.js +8 -8
  327. package/lib/utils/types.js +2 -2
  328. package/lib/video-recorder/interfaces.js +2 -2
  329. package/lib/video-recorder/process.js +126 -126
  330. package/lib/video-recorder/recorder.js +136 -136
  331. package/lib/video-recorder/test-run-video-recorder.js +69 -69
  332. package/lib/video-recorder/videos.js +37 -37
  333. package/package.json +7 -7
  334. package/ts-defs/index.d.ts +109 -17
  335. package/ts-defs/selectors.d.ts +95 -7
  336. package/ts-defs/testcafe-scripts.d.ts +96 -8
@@ -1,588 +1,646 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.addAPI = exports.addCustomMethods = void 0;
7
- const util_1 = require("util");
8
- const lodash_1 = require("lodash");
9
- const builder_symbol_1 = __importDefault(require("../builder-symbol"));
10
- const snapshot_properties_1 = require("./snapshot-properties");
11
- const get_callsite_1 = require("../../errors/get-callsite");
12
- const client_function_builder_1 = __importDefault(require("../client-function-builder"));
13
- const re_executable_promise_1 = __importDefault(require("../../utils/re-executable-promise"));
14
- const type_assertions_1 = require("../../errors/runtime/type-assertions");
15
- const make_reg_exp_1 = __importDefault(require("../../utils/make-reg-exp"));
16
- const selector_text_filter_1 = __importDefault(require("./selector-text-filter"));
17
- const selector_attribute_filter_1 = __importDefault(require("./selector-attribute-filter"));
18
- const prepare_api_args_1 = __importDefault(require("./prepare-api-args"));
19
- const callsite_1 = require("../../utils/callsite");
20
- const VISIBLE_PROP_NAME = 'visible';
21
- const SNAPSHOT_PROP_PRIMITIVE = `[object ${re_executable_promise_1.default.name}]`;
22
- const filterNodes = (new client_function_builder_1.default((nodes, filter, querySelectorRoot, originNode, ...filterArgs) => {
23
- if (typeof filter === 'number') {
24
- const matchingNode = filter < 0 ? nodes[nodes.length + filter] : nodes[filter];
25
- return matchingNode ? [matchingNode] : [];
26
- }
27
- const result = [];
28
- if (typeof filter === 'string') {
29
- // NOTE: we can search for elements only in document/element/shadow root.
30
- if (querySelectorRoot.nodeType !== 1 && querySelectorRoot.nodeType !== 9 && querySelectorRoot.nodeType !== 11)
31
- return null;
32
- const matching = querySelectorRoot.querySelectorAll(filter);
33
- const matchingArr = [];
34
- for (let i = 0; i < matching.length; i++)
35
- matchingArr.push(matching[i]);
36
- filter = node => matchingArr.indexOf(node) > -1;
37
- }
38
- if (typeof filter === 'function') {
39
- for (let j = 0; j < nodes.length; j++) {
40
- if (filter(nodes[j], j, originNode, ...filterArgs))
41
- result.push(nodes[j]);
42
- }
43
- }
44
- return result;
45
- })).getFunction();
46
- const expandSelectorResults = (new client_function_builder_1.default((selector, populateDerivativeNodes) => {
47
- const nodes = selector();
48
- if (!nodes.length)
49
- return null;
50
- const result = [];
51
- for (let i = 0; i < nodes.length; i++) {
52
- const derivativeNodes = populateDerivativeNodes(nodes[i]);
53
- if (derivativeNodes) {
54
- for (let j = 0; j < derivativeNodes.length; j++) {
55
- if (result.indexOf(derivativeNodes[j]) < 0)
56
- result.push(derivativeNodes[j]);
57
- }
58
- }
59
- }
60
- return result;
61
- })).getFunction();
62
- async function getSnapshot(getSelector, callsite, SelectorBuilder, getVisibleValueMode) {
63
- let node = null;
64
- const selector = new SelectorBuilder(getSelector(), { getVisibleValueMode, needError: true }, { instantiation: 'Selector' }).getFunction();
65
- try {
66
- node = await selector();
67
- }
68
- catch (err) {
69
- err.callsite = callsite;
70
- throw err;
71
- }
72
- return node;
73
- }
74
- function assertAddCustomDOMPropertiesOptions(properties) {
75
- type_assertions_1.assertType(type_assertions_1.is.nonNullObject, 'addCustomDOMProperties', '"addCustomDOMProperties" option', properties);
76
- Object.keys(properties).forEach(prop => {
77
- type_assertions_1.assertType(type_assertions_1.is.function, 'addCustomDOMProperties', `Custom DOM properties method '${prop}'`, properties[prop]);
78
- });
79
- }
80
- function assertAddCustomMethods(properties, opts) {
81
- type_assertions_1.assertType(type_assertions_1.is.nonNullObject, 'addCustomMethods', '"addCustomMethods" option', properties);
82
- if (opts !== void 0)
83
- type_assertions_1.assertType(type_assertions_1.is.nonNullObject, 'addCustomMethods', '"addCustomMethods" option', opts);
84
- Object.keys(properties).forEach(prop => {
85
- type_assertions_1.assertType(type_assertions_1.is.function, 'addCustomMethods', `Custom method '${prop}'`, properties[prop]);
86
- });
87
- }
88
- function getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, additionalDependencies) {
89
- return Object.assign({}, options, { selectorFn, apiFn, filter, additionalDependencies });
90
- }
91
- function createPrimitiveGetterWrapper(observedCallsites, callsite) {
92
- return (depth, options) => {
93
- const isTestCafeInspect = options === null || options === void 0 ? void 0 : options.isTestCafeInspect;
94
- if (observedCallsites && !isTestCafeInspect)
95
- observedCallsites.unawaitedSnapshotCallsites.add(callsite);
96
- return SNAPSHOT_PROP_PRIMITIVE;
97
- };
98
- }
99
- function checkForExcessiveAwaits(snapshotPropertyCallsites, checkedCallsite) {
100
- const callsiteId = callsite_1.getCallsiteId(checkedCallsite);
101
- // NOTE: If there is an asserted callsite, it means that .expect() was already called.
102
- // We don't raise a warning and delete the callsite.
103
- if (snapshotPropertyCallsites[callsiteId] && snapshotPropertyCallsites[callsiteId].checked)
104
- delete snapshotPropertyCallsites[callsiteId];
105
- // NOTE: If the calliste already exists, but is not asserted, it means that there are
106
- // multiple awaited callsites in one assertion. We raise a warning for each of them.
107
- else if (snapshotPropertyCallsites[callsiteId] && !snapshotPropertyCallsites[callsiteId].checked)
108
- snapshotPropertyCallsites[callsiteId].callsites.push(checkedCallsite);
109
- else
110
- snapshotPropertyCallsites[callsiteId] = { callsites: [checkedCallsite], checked: false };
111
- }
112
- function addSnapshotProperties(obj, getSelector, SelectorBuilder, properties, observedCallsites) {
113
- properties.forEach(prop => {
114
- Object.defineProperty(obj, prop, {
115
- get: () => {
116
- const callsite = get_callsite_1.getCallsiteForMethod('get');
117
- const propertyPromise = re_executable_promise_1.default.fromFn(async () => {
118
- const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder);
119
- return snapshot[prop];
120
- });
121
- const primitiveGetterWrapper = createPrimitiveGetterWrapper(observedCallsites, callsite);
122
- propertyPromise[Symbol.toPrimitive] = primitiveGetterWrapper;
123
- propertyPromise[util_1.inspect.custom] = primitiveGetterWrapper;
124
- propertyPromise.then = function (onFulfilled, onRejected) {
125
- if (observedCallsites)
126
- checkForExcessiveAwaits(observedCallsites.snapshotPropertyCallsites, callsite);
127
- this._ensureExecuting();
128
- return this._taskPromise.then(onFulfilled, onRejected);
129
- };
130
- return propertyPromise;
131
- }
132
- });
133
- });
134
- }
135
- function addVisibleProperty({ obj, getSelector, SelectorBuilder }) {
136
- Object.defineProperty(obj, VISIBLE_PROP_NAME, {
137
- get: () => {
138
- const callsite = get_callsite_1.getCallsiteForMethod('get');
139
- return re_executable_promise_1.default.fromFn(async () => {
140
- const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder, true);
141
- return !!snapshot && snapshot[VISIBLE_PROP_NAME];
142
- });
143
- }
144
- });
145
- }
146
- function addCustomMethods(obj, getSelector, SelectorBuilder, customMethods) {
147
- const customMethodProps = customMethods ? Object.keys(customMethods) : [];
148
- customMethodProps.forEach(prop => {
149
- const { returnDOMNodes = false, method } = customMethods[prop];
150
- const dependencies = {
151
- customMethod: method,
152
- selector: getSelector()
153
- };
154
- const callsiteNames = { instantiation: prop };
155
- if (returnDOMNodes) {
156
- obj[prop] = (...args) => {
157
- const selectorFn = () => {
158
- /* eslint-disable no-undef */
159
- const nodes = selector();
160
- return customMethod.apply(customMethod, [nodes].concat(args));
161
- /* eslint-enable no-undef */
162
- };
163
- const apiFn = prepare_api_args_1.default(prop, ...args);
164
- const filter = () => true;
165
- const additionalDependencies = {
166
- args,
167
- customMethod: method
168
- };
169
- return createDerivativeSelectorWithFilter({ getSelector, SelectorBuilder, selectorFn, apiFn, filter, additionalDependencies });
170
- };
171
- }
172
- else {
173
- obj[prop] = (new client_function_builder_1.default((...args) => {
174
- /* eslint-disable no-undef */
175
- const node = selector();
176
- return customMethod.apply(customMethod, [node].concat(args));
177
- /* eslint-enable no-undef */
178
- }, { dependencies }, callsiteNames)).getFunction();
179
- }
180
- });
181
- }
182
- exports.addCustomMethods = addCustomMethods;
183
- function prepareSnapshotPropertyList(customDOMProperties) {
184
- let properties = [...snapshot_properties_1.SNAPSHOT_PROPERTIES];
185
- // NOTE: The 'visible' snapshot property has a separate handler.
186
- lodash_1.pull(properties, VISIBLE_PROP_NAME);
187
- if (customDOMProperties)
188
- properties = properties.concat(Object.keys(customDOMProperties));
189
- return properties;
190
- }
191
- function addSnapshotPropertyShorthands({ obj, getSelector, SelectorBuilder, customDOMProperties, customMethods, observedCallsites }) {
192
- const properties = prepareSnapshotPropertyList(customDOMProperties);
193
- addSnapshotProperties(obj, getSelector, SelectorBuilder, properties, observedCallsites);
194
- addCustomMethods(obj, getSelector, SelectorBuilder, customMethods);
195
- obj.getStyleProperty = prop => {
196
- const callsite = get_callsite_1.getCallsiteForMethod('getStyleProperty');
197
- return re_executable_promise_1.default.fromFn(async () => {
198
- const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder);
199
- return snapshot.style ? snapshot.style[prop] : void 0;
200
- });
201
- };
202
- obj.getAttribute = attrName => {
203
- const callsite = get_callsite_1.getCallsiteForMethod('getAttribute');
204
- return re_executable_promise_1.default.fromFn(async () => {
205
- const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder);
206
- return snapshot.attributes ? snapshot.attributes[attrName] : void 0;
207
- });
208
- };
209
- obj.hasAttribute = attrName => {
210
- const callsite = get_callsite_1.getCallsiteForMethod('hasAttribute');
211
- return re_executable_promise_1.default.fromFn(async () => {
212
- const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder);
213
- return snapshot.attributes ? snapshot.attributes.hasOwnProperty(attrName) : false;
214
- });
215
- };
216
- obj.getBoundingClientRectProperty = prop => {
217
- const callsite = get_callsite_1.getCallsiteForMethod('getBoundingClientRectProperty');
218
- return re_executable_promise_1.default.fromFn(async () => {
219
- const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder);
220
- return snapshot.boundingClientRect ? snapshot.boundingClientRect[prop] : void 0;
221
- });
222
- };
223
- obj.hasClass = name => {
224
- const callsite = get_callsite_1.getCallsiteForMethod('hasClass');
225
- return re_executable_promise_1.default.fromFn(async () => {
226
- const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder);
227
- return snapshot.classNames ? snapshot.classNames.indexOf(name) > -1 : false;
228
- });
229
- };
230
- }
231
- function createCounter(getSelector, SelectorBuilder) {
232
- const builder = new SelectorBuilder(getSelector(), { counterMode: true }, { instantiation: 'Selector' });
233
- const counter = builder.getFunction();
234
- const callsite = get_callsite_1.getCallsiteForMethod('get');
235
- return async () => {
236
- try {
237
- return await counter();
238
- }
239
- catch (err) {
240
- err.callsite = callsite;
241
- throw err;
242
- }
243
- };
244
- }
245
- function addCounterProperties({ obj, getSelector, SelectorBuilder }) {
246
- Object.defineProperty(obj, 'count', {
247
- get: () => {
248
- const counter = createCounter(getSelector, SelectorBuilder);
249
- return re_executable_promise_1.default.fromFn(() => counter());
250
- }
251
- });
252
- Object.defineProperty(obj, 'exists', {
253
- get: () => {
254
- const counter = createCounter(getSelector, SelectorBuilder);
255
- return re_executable_promise_1.default.fromFn(async () => await counter() > 0);
256
- }
257
- });
258
- }
259
- function convertFilterToClientFunctionIfNecessary(callsiteName, filter, dependencies) {
260
- if (typeof filter === 'function') {
261
- const builder = filter[builder_symbol_1.default];
262
- const fn = builder ? builder.fn : filter;
263
- const options = builder ? lodash_1.assign({}, builder.options, { dependencies }) : { dependencies };
264
- return (new client_function_builder_1.default(fn, options, { instantiation: callsiteName })).getFunction();
265
- }
266
- return filter;
267
- }
268
- function createDerivativeSelectorWithFilter({ getSelector, SelectorBuilder, selectorFn, apiFn, filter, additionalDependencies }) {
269
- const collectionModeSelectorBuilder = new SelectorBuilder(getSelector(), { collectionMode: true });
270
- const customDOMProperties = collectionModeSelectorBuilder.options.customDOMProperties;
271
- const customMethods = collectionModeSelectorBuilder.options.customMethods;
272
- let dependencies = {
273
- selector: collectionModeSelectorBuilder.getFunction(),
274
- filter: filter,
275
- filterNodes: filterNodes
276
- };
277
- const { boundTestRun, timeout, visibilityCheck, apiFnChain } = collectionModeSelectorBuilder.options;
278
- dependencies = lodash_1.assign(dependencies, additionalDependencies);
279
- const builder = new SelectorBuilder(selectorFn, {
280
- dependencies,
281
- customDOMProperties,
282
- customMethods,
283
- boundTestRun,
284
- timeout,
285
- visibilityCheck,
286
- apiFnChain,
287
- apiFn
288
- }, { instantiation: 'Selector' });
289
- return builder.getFunction();
290
- }
291
- const filterByText = convertFilterToClientFunctionIfNecessary('filter', selector_text_filter_1.default);
292
- const filterByAttr = convertFilterToClientFunctionIfNecessary('filter', selector_attribute_filter_1.default);
293
- function ensureRegExpContext(str) {
294
- // NOTE: if a regexp is created in a separate context (via the 'vm' module) we
295
- // should wrap it with new RegExp() to make the `instanceof RegExp` check successful.
296
- if (typeof str !== 'string' && !(str instanceof RegExp))
297
- return new RegExp(str);
298
- return str;
299
- }
300
- function addFilterMethods(options) {
301
- const { obj, getSelector, SelectorBuilder } = options;
302
- obj.nth = index => {
303
- type_assertions_1.assertType(type_assertions_1.is.number, 'nth', '"index" argument', index);
304
- const apiFn = prepare_api_args_1.default('nth', index);
305
- const builder = new SelectorBuilder(getSelector(), { index, apiFn }, { instantiation: 'Selector' });
306
- return builder.getFunction();
307
- };
308
- obj.withText = text => {
309
- type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.regExp], 'withText', '"text" argument', text);
310
- const apiFn = prepare_api_args_1.default('withText', text);
311
- text = ensureRegExpContext(text);
312
- const selectorFn = () => {
313
- /* eslint-disable no-undef */
314
- const nodes = selector();
315
- if (!nodes.length)
316
- return null;
317
- return filterNodes(nodes, filter, document, void 0, textRe);
318
- /* eslint-enable no-undef */
319
- };
320
- const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filterByText, { textRe: make_reg_exp_1.default(text) });
321
- return createDerivativeSelectorWithFilter(args);
322
- };
323
- obj.withExactText = text => {
324
- type_assertions_1.assertType(type_assertions_1.is.string, 'withExactText', '"text" argument', text);
325
- const selectorFn = () => {
326
- /* eslint-disable no-undef */
327
- const nodes = selector();
328
- if (!nodes.length)
329
- return null;
330
- return filterNodes(nodes, filter, document, void 0, exactText);
331
- /* eslint-enable no-undef */
332
- };
333
- const apiFn = prepare_api_args_1.default('withExactText', text);
334
- const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filterByText, { exactText: text });
335
- return createDerivativeSelectorWithFilter(args);
336
- };
337
- obj.withAttribute = (attrName, attrValue) => {
338
- type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.regExp], 'withAttribute', '"attrName" argument', attrName);
339
- const apiFn = prepare_api_args_1.default('withAttribute', attrName, attrValue);
340
- attrName = ensureRegExpContext(attrName);
341
- if (attrValue !== void 0) {
342
- type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.regExp], 'withAttribute', '"attrValue" argument', attrValue);
343
- attrValue = ensureRegExpContext(attrValue);
344
- }
345
- const selectorFn = () => {
346
- /* eslint-disable no-undef */
347
- const nodes = selector();
348
- if (!nodes.length)
349
- return null;
350
- return filterNodes(nodes, filter, document, void 0, attrName, attrValue);
351
- /* eslint-enable no-undef */
352
- };
353
- const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filterByAttr, {
354
- attrName,
355
- attrValue
356
- });
357
- return createDerivativeSelectorWithFilter(args);
358
- };
359
- obj.filter = (filter, dependencies) => {
360
- type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function], 'filter', '"filter" argument', filter);
361
- const apiFn = prepare_api_args_1.default('filter', filter);
362
- filter = convertFilterToClientFunctionIfNecessary('filter', filter, dependencies);
363
- const selectorFn = () => {
364
- /* eslint-disable no-undef */
365
- const nodes = selector();
366
- if (!nodes.length)
367
- return null;
368
- return filterNodes(nodes, filter, document, void 0);
369
- /* eslint-enable no-undef */
370
- };
371
- const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter);
372
- return createDerivativeSelectorWithFilter(args);
373
- };
374
- obj.filterVisible = () => {
375
- const apiFn = prepare_api_args_1.default('filterVisible');
376
- const builder = new SelectorBuilder(getSelector(), { filterVisible: true, apiFn }, { instantiation: 'Selector' });
377
- return builder.getFunction();
378
- };
379
- obj.filterHidden = () => {
380
- const apiFn = prepare_api_args_1.default('filterHidden');
381
- const builder = new SelectorBuilder(getSelector(), { filterHidden: true, apiFn }, { instantiation: 'Selector' });
382
- return builder.getFunction();
383
- };
384
- }
385
- function addCustomDOMPropertiesMethod({ obj, getSelector, SelectorBuilder }) {
386
- obj.addCustomDOMProperties = customDOMProperties => {
387
- assertAddCustomDOMPropertiesOptions(customDOMProperties);
388
- const builder = new SelectorBuilder(getSelector(), { customDOMProperties }, { instantiation: 'Selector' });
389
- return builder.getFunction();
390
- };
391
- }
392
- function addCustomMethodsMethod({ obj, getSelector, SelectorBuilder }) {
393
- obj.addCustomMethods = function (methods, opts) {
394
- assertAddCustomMethods(methods, opts);
395
- const customMethods = {};
396
- Object.keys(methods).forEach(methodName => {
397
- customMethods[methodName] = {
398
- method: methods[methodName],
399
- returnDOMNodes: opts && !!opts.returnDOMNodes
400
- };
401
- });
402
- const builder = new SelectorBuilder(getSelector(), { customMethods }, { instantiation: 'Selector' });
403
- return builder.getFunction();
404
- };
405
- }
406
- function addHierarchicalSelectors(options) {
407
- const { obj } = options;
408
- // Find
409
- obj.find = (filter, dependencies) => {
410
- type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function], 'find', '"filter" argument', filter);
411
- const apiFn = prepare_api_args_1.default('find', filter);
412
- filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies);
413
- const selectorFn = () => {
414
- /* eslint-disable no-undef */
415
- return expandSelectorResults(selector, node => {
416
- if (typeof filter === 'string') {
417
- return typeof node.querySelectorAll === 'function' ?
418
- node.querySelectorAll(filter) :
419
- null;
420
- }
421
- const results = [];
422
- const visitNode = currentNode => {
423
- const cnLength = currentNode.childNodes.length;
424
- for (let i = 0; i < cnLength; i++) {
425
- const child = currentNode.childNodes[i];
426
- results.push(child);
427
- visitNode(child);
428
- }
429
- };
430
- visitNode(node);
431
- return filterNodes(results, filter, null, node);
432
- });
433
- /* eslint-enable no-undef */
434
- };
435
- const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults });
436
- return createDerivativeSelectorWithFilter(args);
437
- };
438
- // Parent
439
- obj.parent = (filter, dependencies) => {
440
- if (filter !== void 0)
441
- type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'parent', '"filter" argument', filter);
442
- const apiFn = prepare_api_args_1.default('parent', filter);
443
- filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies);
444
- const selectorFn = () => {
445
- /* eslint-disable no-undef */
446
- return expandSelectorResults(selector, node => {
447
- const parents = [];
448
- for (let parent = node.parentNode; parent; parent = parent.parentNode)
449
- parents.push(parent);
450
- return filter !== void 0 ? filterNodes(parents, filter, document, node) : parents;
451
- });
452
- /* eslint-enable no-undef */
453
- };
454
- const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults });
455
- return createDerivativeSelectorWithFilter(args);
456
- };
457
- // Child
458
- obj.child = (filter, dependencies) => {
459
- if (filter !== void 0)
460
- type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'child', '"filter" argument', filter);
461
- const apiFn = prepare_api_args_1.default('child', filter);
462
- filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies);
463
- const selectorFn = () => {
464
- /* eslint-disable no-undef */
465
- return expandSelectorResults(selector, node => {
466
- const childElements = [];
467
- const cnLength = node.childNodes.length;
468
- for (let i = 0; i < cnLength; i++) {
469
- const child = node.childNodes[i];
470
- if (child.nodeType === 1)
471
- childElements.push(child);
472
- }
473
- return filter !== void 0 ? filterNodes(childElements, filter, node, node) : childElements;
474
- });
475
- /* eslint-enable no-undef */
476
- };
477
- const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults });
478
- return createDerivativeSelectorWithFilter(args);
479
- };
480
- // Sibling
481
- obj.sibling = (filter, dependencies) => {
482
- if (filter !== void 0)
483
- type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'sibling', '"filter" argument', filter);
484
- const apiFn = prepare_api_args_1.default('sibling', filter);
485
- filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies);
486
- const selectorFn = () => {
487
- /* eslint-disable no-undef */
488
- return expandSelectorResults(selector, node => {
489
- const parent = node.parentNode;
490
- if (!parent)
491
- return null;
492
- const siblings = [];
493
- const cnLength = parent.childNodes.length;
494
- for (let i = 0; i < cnLength; i++) {
495
- const child = parent.childNodes[i];
496
- if (child.nodeType === 1 && child !== node)
497
- siblings.push(child);
498
- }
499
- return filter !== void 0 ? filterNodes(siblings, filter, parent, node) : siblings;
500
- });
501
- /* eslint-enable no-undef */
502
- };
503
- const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults });
504
- return createDerivativeSelectorWithFilter(args);
505
- };
506
- // Next sibling
507
- obj.nextSibling = (filter, dependencies) => {
508
- if (filter !== void 0)
509
- type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'nextSibling', '"filter" argument', filter);
510
- const apiFn = prepare_api_args_1.default('nextSibling', filter);
511
- filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies);
512
- const selectorFn = () => {
513
- /* eslint-disable no-undef */
514
- return expandSelectorResults(selector, node => {
515
- const parent = node.parentNode;
516
- if (!parent)
517
- return null;
518
- const siblings = [];
519
- const cnLength = parent.childNodes.length;
520
- let afterNode = false;
521
- for (let i = 0; i < cnLength; i++) {
522
- const child = parent.childNodes[i];
523
- if (child === node)
524
- afterNode = true;
525
- else if (afterNode && child.nodeType === 1)
526
- siblings.push(child);
527
- }
528
- return filter !== void 0 ? filterNodes(siblings, filter, parent, node) : siblings;
529
- });
530
- /* eslint-enable no-undef */
531
- };
532
- const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults });
533
- return createDerivativeSelectorWithFilter(args);
534
- };
535
- // Prev sibling
536
- obj.prevSibling = (filter, dependencies) => {
537
- if (filter !== void 0)
538
- type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'prevSibling', '"filter" argument', filter);
539
- const apiFn = prepare_api_args_1.default('prevSibling', filter);
540
- filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies);
541
- const selectorFn = () => {
542
- /* eslint-disable no-undef */
543
- return expandSelectorResults(selector, node => {
544
- const parent = node.parentNode;
545
- if (!parent)
546
- return null;
547
- const siblings = [];
548
- const cnLength = parent.childNodes.length;
549
- for (let i = 0; i < cnLength; i++) {
550
- const child = parent.childNodes[i];
551
- if (child === node)
552
- break;
553
- if (child.nodeType === 1)
554
- siblings.push(child);
555
- }
556
- return filter !== void 0 ? filterNodes(siblings, filter, parent, node) : siblings;
557
- });
558
- /* eslint-enable no-undef */
559
- };
560
- const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults });
561
- return createDerivativeSelectorWithFilter(args);
562
- };
563
- // ShadowRoot
564
- obj.shadowRoot = () => {
565
- const apiFn = prepare_api_args_1.default('shadowRoot');
566
- const selectorFn = () => {
567
- /* eslint-disable no-undef */
568
- return expandSelectorResults(selector, node => {
569
- return !node.shadowRoot ? null : [node.shadowRoot];
570
- });
571
- /* eslint-enable no-undef */
572
- };
573
- const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, void 0, { expandSelectorResults });
574
- return createDerivativeSelectorWithFilter(args);
575
- };
576
- }
577
- function addAPI(selector, getSelector, SelectorBuilder, customDOMProperties, customMethods, observedCallsites) {
578
- const options = { obj: selector, getSelector, SelectorBuilder, customDOMProperties, customMethods, observedCallsites };
579
- addFilterMethods(options);
580
- addHierarchicalSelectors(options);
581
- addSnapshotPropertyShorthands(options);
582
- addCustomDOMPropertiesMethod(options);
583
- addCustomMethodsMethod(options);
584
- addCounterProperties(options);
585
- addVisibleProperty(options);
586
- }
587
- exports.addAPI = addAPI;
588
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbGllbnQtZnVuY3Rpb25zL3NlbGVjdG9ycy9hZGQtYXBpLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBZ0Q7QUFDaEQsdUVBQTREO0FBQzVELCtEQUE0RDtBQUM1RCw0REFBaUU7QUFDakUseUZBQStEO0FBQy9ELDhGQUFvRTtBQUNwRSwwRUFBc0U7QUFDdEUsNEVBQWtEO0FBQ2xELGtGQUF3RDtBQUN4RCw0RkFBa0U7QUFDbEUsMEVBQWtEO0FBQ2xELG1EQUFxRDtBQUVyRCxNQUFNLGlCQUFpQixHQUFTLFNBQVMsQ0FBQztBQUMxQyxNQUFNLHVCQUF1QixHQUFHLFdBQVcsK0JBQW1CLENBQUMsSUFBSSxHQUFHLENBQUM7QUFFdkUsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFJLGlDQUFxQixDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsR0FBRyxVQUFVLEVBQUUsRUFBRTtJQUMzRyxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRTtRQUM1QixNQUFNLFlBQVksR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRS9FLE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDN0M7SUFFRCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFFbEIsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7UUFDNUIseUVBQXlFO1FBQ3pFLElBQUksaUJBQWlCLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLEtBQUssQ0FB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LEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQzFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3ZELENBQUMsQ0FBQyxDQUFDO1lBQ0gsNEJBQTRCO1FBQ2hDLENBQUMsQ0FBQztRQUVGLE1BQU0sSUFBSSxHQUFHLHlCQUF5QixDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1FBRXRHLE9BQU8sa0NBQWtDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEQsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQUVELFNBQWdCLE1BQU0sQ0FBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxhQUFhLEVBQUUsaUJBQWlCO0lBQ2pILE1BQU0sT0FBTyxHQUFHLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxDQUFDO0lBRXZILGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFCLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLDRCQUE0QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFWRCx3QkFVQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluc3BlY3QgfSBmcm9tICd1dGlsJztcbmltcG9ydCB7IGFzc2lnbiwgcHVsbCBhcyByZW1vdmUgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGNsaWVudEZ1bmN0aW9uQnVpbGRlclN5bWJvbCBmcm9tICcuLi9idWlsZGVyLXN5bWJvbCc7XG5pbXBvcnQgeyBTTkFQU0hPVF9QUk9QRVJUSUVTIH0gZnJvbSAnLi9zbmFwc2hvdC1wcm9wZXJ0aWVzJztcbmltcG9ydCB7IGdldENhbGxzaXRlRm9yTWV0aG9kIH0gZnJvbSAnLi4vLi4vZXJyb3JzL2dldC1jYWxsc2l0ZSc7XG5pbXBvcnQgQ2xpZW50RnVuY3Rpb25CdWlsZGVyIGZyb20gJy4uL2NsaWVudC1mdW5jdGlvbi1idWlsZGVyJztcbmltcG9ydCBSZUV4ZWN1dGFibGVQcm9taXNlIGZyb20gJy4uLy4uL3V0aWxzL3JlLWV4ZWN1dGFibGUtcHJvbWlzZSc7XG5pbXBvcnQgeyBhc3NlcnRUeXBlLCBpcyB9IGZyb20gJy4uLy4uL2Vycm9ycy9ydW50aW1lL3R5cGUtYXNzZXJ0aW9ucyc7XG5pbXBvcnQgbWFrZVJlZ0V4cCBmcm9tICcuLi8uLi91dGlscy9tYWtlLXJlZy1leHAnO1xuaW1wb3J0IHNlbGVjdG9yVGV4dEZpbHRlciBmcm9tICcuL3NlbGVjdG9yLXRleHQtZmlsdGVyJztcbmltcG9ydCBzZWxlY3RvckF0dHJpYnV0ZUZpbHRlciBmcm9tICcuL3NlbGVjdG9yLWF0dHJpYnV0ZS1maWx0ZXInO1xuaW1wb3J0IHByZXBhcmVBcGlGbkFyZ3MgZnJvbSAnLi9wcmVwYXJlLWFwaS1hcmdzJztcbmltcG9ydCB7IGdldENhbGxzaXRlSWQgfSBmcm9tICcuLi8uLi91dGlscy9jYWxsc2l0ZSc7XG5cbmNvbnN0IFZJU0lCTEVfUFJPUF9OQU1FICAgICAgID0gJ3Zpc2libGUnO1xuY29uc3QgU05BUFNIT1RfUFJPUF9QUklNSVRJVkUgPSBgW29iamVjdCAke1JlRXhlY3V0YWJsZVByb21pc2UubmFtZX1dYDtcblxuY29uc3QgZmlsdGVyTm9kZXMgPSAobmV3IENsaWVudEZ1bmN0aW9uQnVpbGRlcigobm9kZXMsIGZpbHRlciwgcXVlcnlTZWxlY3RvclJvb3QsIG9yaWdpbk5vZGUsIC4uLmZpbHRlckFyZ3MpID0+IHtcbiAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdOb2RlID0gZmlsdGVyIDwgMCA/IG5vZGVzW25vZGVzLmxlbmd0aCArIGZpbHRlcl0gOiBub2Rlc1tmaWx0ZXJdO1xuXG4gICAgICAgIHJldHVybiBtYXRjaGluZ05vZGUgPyBbbWF0Y2hpbmdOb2RlXSA6IFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIE5PVEU6IHdlIGNhbiBzZWFyY2ggZm9yIGVsZW1lbnRzIG9ubHkgaW4gZG9jdW1lbnQvZWxlbWVudC9zaGFkb3cgcm9vdC5cbiAgICAgICAgaWYgKHF1ZXJ5U2VsZWN0b3JSb290Lm5vZGVUeXBlICE9PSAxICYmIHF1ZXJ5U2VsZWN0b3JSb290Lm5vZGVUeXBlICE9PSA5ICYmIHF1ZXJ5U2VsZWN0b3JSb290Lm5vZGVUeXBlICE9PSAxMSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoaW5nICAgID0gcXVlcnlTZWxlY3RvclJvb3QucXVlcnlTZWxlY3RvckFsbChmaWx0ZXIpO1xuICAgICAgICBjb25zdCBtYXRjaGluZ0FyciA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2hpbmcubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBtYXRjaGluZ0Fyci5wdXNoKG1hdGNoaW5nW2ldKTtcblxuICAgICAgICBmaWx0ZXIgPSBub2RlID0+IG1hdGNoaW5nQXJyLmluZGV4T2Yobm9kZSkgPiAtMTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5vZGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyKG5vZGVzW2pdLCBqLCBvcmlnaW5Ob2RlLCAuLi5maWx0ZXJBcmdzKSlcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChub2Rlc1tqXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufSkpLmdldEZ1bmN0aW9uKCk7XG5cbmNvbnN0IGV4cGFuZFNlbGVjdG9yUmVzdWx0cyA9IChuZXcgQ2xpZW50RnVuY3Rpb25CdWlsZGVyKChzZWxlY3RvciwgcG9wdWxhdGVEZXJpdmF0aXZlTm9kZXMpID0+IHtcbiAgICBjb25zdCBub2RlcyA9IHNlbGVjdG9yKCk7XG5cbiAgICBpZiAoIW5vZGVzLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGVyaXZhdGl2ZU5vZGVzID0gcG9wdWxhdGVEZXJpdmF0aXZlTm9kZXMobm9kZXNbaV0pO1xuXG4gICAgICAgIGlmIChkZXJpdmF0aXZlTm9kZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGVyaXZhdGl2ZU5vZGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pbmRleE9mKGRlcml2YXRpdmVOb2Rlc1tqXSkgPCAwKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChkZXJpdmF0aXZlTm9kZXNbal0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcblxufSkpLmdldEZ1bmN0aW9uKCk7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFNuYXBzaG90IChnZXRTZWxlY3RvciwgY2FsbHNpdGUsIFNlbGVjdG9yQnVpbGRlciwgZ2V0VmlzaWJsZVZhbHVlTW9kZSkge1xuICAgIGxldCBub2RlICAgICAgID0gbnVsbDtcbiAgICBjb25zdCBzZWxlY3RvciA9IG5ldyBTZWxlY3RvckJ1aWxkZXIoZ2V0U2VsZWN0b3IoKSwgeyBnZXRWaXNpYmxlVmFsdWVNb2RlLCBuZWVkRXJyb3I6IHRydWUgfSwgeyBpbnN0YW50aWF0aW9uOiAnU2VsZWN0b3InIH0pLmdldEZ1bmN0aW9uKCk7XG5cbiAgICB0cnkge1xuICAgICAgICBub2RlID0gYXdhaXQgc2VsZWN0b3IoKTtcbiAgICB9XG5cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGVyci5jYWxsc2l0ZSA9IGNhbGxzaXRlO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGFzc2VydEFkZEN1c3RvbURPTVByb3BlcnRpZXNPcHRpb25zIChwcm9wZXJ0aWVzKSB7XG4gICAgYXNzZXJ0VHlwZShpcy5ub25OdWxsT2JqZWN0LCAnYWRkQ3VzdG9tRE9NUHJvcGVydGllcycsICdcImFkZEN1c3RvbURPTVByb3BlcnRpZXNcIiBvcHRpb24nLCBwcm9wZXJ0aWVzKTtcblxuICAgIE9iamVjdC5rZXlzKHByb3BlcnRpZXMpLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgIGFzc2VydFR5cGUoaXMuZnVuY3Rpb24sICdhZGRDdXN0b21ET01Qcm9wZXJ0aWVzJywgYEN1c3RvbSBET00gcHJvcGVydGllcyBtZXRob2QgJyR7cHJvcH0nYCwgcHJvcGVydGllc1twcm9wXSk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydEFkZEN1c3RvbU1ldGhvZHMgKHByb3BlcnRpZXMsIG9wdHMpIHtcbiAgICBhc3NlcnRUeXBlKGlzLm5vbk51bGxPYmplY3QsICdhZGRDdXN0b21NZXRob2RzJywgJ1wiYWRkQ3VzdG9tTWV0aG9kc1wiIG9wdGlvbicsIHByb3BlcnRpZXMpO1xuXG4gICAgaWYgKG9wdHMgIT09IHZvaWQgMClcbiAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OdWxsT2JqZWN0LCAnYWRkQ3VzdG9tTWV0aG9kcycsICdcImFkZEN1c3RvbU1ldGhvZHNcIiBvcHRpb24nLCBvcHRzKTtcblxuICAgIE9iamVjdC5rZXlzKHByb3BlcnRpZXMpLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgIGFzc2VydFR5cGUoaXMuZnVuY3Rpb24sICdhZGRDdXN0b21NZXRob2RzJywgYEN1c3RvbSBtZXRob2QgJyR7cHJvcH0nYCwgcHJvcGVydGllc1twcm9wXSk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldERlcml2YXRpdmVTZWxlY3RvckFyZ3MgKG9wdGlvbnMsIHNlbGVjdG9yRm4sIGFwaUZuLCBmaWx0ZXIsIGFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywgeyBzZWxlY3RvckZuLCBhcGlGbiwgZmlsdGVyLCBhZGRpdGlvbmFsRGVwZW5kZW5jaWVzIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQcmltaXRpdmVHZXR0ZXJXcmFwcGVyIChvYnNlcnZlZENhbGxzaXRlcywgY2FsbHNpdGUpIHtcbiAgICByZXR1cm4gKGRlcHRoLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzVGVzdENhZmVJbnNwZWN0ID0gb3B0aW9ucz8uaXNUZXN0Q2FmZUluc3BlY3Q7XG5cbiAgICAgICAgaWYgKG9ic2VydmVkQ2FsbHNpdGVzICYmICFpc1Rlc3RDYWZlSW5zcGVjdClcbiAgICAgICAgICAgIG9ic2VydmVkQ2FsbHNpdGVzLnVuYXdhaXRlZFNuYXBzaG90Q2FsbHNpdGVzLmFkZChjYWxsc2l0ZSk7XG5cbiAgICAgICAgcmV0dXJuIFNOQVBTSE9UX1BST1BfUFJJTUlUSVZFO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGNoZWNrRm9yRXhjZXNzaXZlQXdhaXRzIChzbmFwc2hvdFByb3BlcnR5Q2FsbHNpdGVzLCBjaGVja2VkQ2FsbHNpdGUpIHtcbiAgICBjb25zdCBjYWxsc2l0ZUlkID0gZ2V0Q2FsbHNpdGVJZChjaGVja2VkQ2FsbHNpdGUpO1xuXG4gICAgLy8gTk9URTogSWYgdGhlcmUgaXMgYW4gYXNzZXJ0ZWQgY2FsbHNpdGUsIGl0IG1lYW5zIHRoYXQgLmV4cGVjdCgpIHdhcyBhbHJlYWR5IGNhbGxlZC5cbiAgICAvLyBXZSBkb24ndCByYWlzZSBhIHdhcm5pbmcgYW5kIGRlbGV0ZSB0aGUgY2FsbHNpdGUuXG4gICAgaWYgKHNuYXBzaG90UHJvcGVydHlDYWxsc2l0ZXNbY2FsbHNpdGVJZF0gJiYgc25hcHNob3RQcm9wZXJ0eUNhbGxzaXRlc1tjYWxsc2l0ZUlkXS5jaGVja2VkKVxuICAgICAgICBkZWxldGUgc25hcHNob3RQcm9wZXJ0eUNhbGxzaXRlc1tjYWxsc2l0ZUlkXTtcbiAgICAvLyBOT1RFOiBJZiB0aGUgY2FsbGlzdGUgYWxyZWFkeSBleGlzdHMsIGJ1dCBpcyBub3QgYXNzZXJ0ZWQsIGl0IG1lYW5zIHRoYXQgdGhlcmUgYXJlXG4gICAgLy8gbXVsdGlwbGUgYXdhaXRlZCBjYWxsc2l0ZXMgaW4gb25lIGFzc2VydGlvbi4gV2UgcmFpc2UgYSB3YXJuaW5nIGZvciBlYWNoIG9mIHRoZW0uXG4gICAgZWxzZSBpZiAoc25hcHNob3RQcm9wZXJ0eUNhbGxzaXRlc1tjYWxsc2l0ZUlkXSAmJiAhc25hcHNob3RQcm9wZXJ0eUNhbGxzaXRlc1tjYWxsc2l0ZUlkXS5jaGVja2VkKVxuICAgICAgICBzbmFwc2hvdFByb3BlcnR5Q2FsbHNpdGVzW2NhbGxzaXRlSWRdLmNhbGxzaXRlcy5wdXNoKGNoZWNrZWRDYWxsc2l0ZSk7XG4gICAgZWxzZVxuICAgICAgICBzbmFwc2hvdFByb3BlcnR5Q2FsbHNpdGVzW2NhbGxzaXRlSWRdID0geyBjYWxsc2l0ZXM6IFsgY2hlY2tlZENhbGxzaXRlIF0sIGNoZWNrZWQ6IGZhbHNlIH07XG59XG5cbmZ1bmN0aW9uIGFkZFNuYXBzaG90UHJvcGVydGllcyAob2JqLCBnZXRTZWxlY3RvciwgU2VsZWN0b3JCdWlsZGVyLCBwcm9wZXJ0aWVzLCBvYnNlcnZlZENhbGxzaXRlcykge1xuICAgIHByb3BlcnRpZXMuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwge1xuICAgICAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FsbHNpdGUgPSBnZXRDYWxsc2l0ZUZvck1ldGhvZCgnZ2V0Jyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eVByb21pc2UgPSBSZUV4ZWN1dGFibGVQcm9taXNlLmZyb21Gbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZ2V0U25hcHNob3QoZ2V0U2VsZWN0b3IsIGNhbGxzaXRlLCBTZWxlY3RvckJ1aWxkZXIpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzbmFwc2hvdFtwcm9wXTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHByaW1pdGl2ZUdldHRlcldyYXBwZXIgPSBjcmVhdGVQcmltaXRpdmVHZXR0ZXJXcmFwcGVyKG9ic2VydmVkQ2FsbHNpdGVzLCBjYWxsc2l0ZSk7XG5cbiAgICAgICAgICAgICAgICBwcm9wZXJ0eVByb21pc2VbU3ltYm9sLnRvUHJpbWl0aXZlXSA9IHByaW1pdGl2ZUdldHRlcldyYXBwZXI7XG4gICAgICAgICAgICAgICAgcHJvcGVydHlQcm9taXNlW2luc3BlY3QuY3VzdG9tXSAgICAgPSBwcmltaXRpdmVHZXR0ZXJXcmFwcGVyO1xuXG4gICAgICAgICAgICAgICAgcHJvcGVydHlQcm9taXNlLnRoZW4gPSBmdW5jdGlvbiAob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9ic2VydmVkQ2FsbHNpdGVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tGb3JFeGNlc3NpdmVBd2FpdHMob2JzZXJ2ZWRDYWxsc2l0ZXMuc25hcHNob3RQcm9wZXJ0eUNhbGxzaXRlcywgY2FsbHNpdGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Vuc3VyZUV4ZWN1dGluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90YXNrUHJvbWlzZS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5UHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZFZpc2libGVQcm9wZXJ0eSAoeyBvYmosIGdldFNlbGVjdG9yLCBTZWxlY3RvckJ1aWxkZXIgfSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIFZJU0lCTEVfUFJPUF9OQU1FLCB7XG4gICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2FsbHNpdGUgPSBnZXRDYWxsc2l0ZUZvck1ldGhvZCgnZ2V0Jyk7XG5cbiAgICAgICAgICAgIHJldHVybiBSZUV4ZWN1dGFibGVQcm9taXNlLmZyb21Gbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBnZXRTbmFwc2hvdChnZXRTZWxlY3RvciwgY2FsbHNpdGUsIFNlbGVjdG9yQnVpbGRlciwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gISFzbmFwc2hvdCAmJiBzbmFwc2hvdFtWSVNJQkxFX1BST1BfTkFNRV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkQ3VzdG9tTWV0aG9kcyAob2JqLCBnZXRTZWxlY3RvciwgU2VsZWN0b3JCdWlsZGVyLCBjdXN0b21NZXRob2RzKSB7XG4gICAgY29uc3QgY3VzdG9tTWV0aG9kUHJvcHMgPSBjdXN0b21NZXRob2RzID8gT2JqZWN0LmtleXMoY3VzdG9tTWV0aG9kcykgOiBbXTtcblxuICAgIGN1c3RvbU1ldGhvZFByb3BzLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgIGNvbnN0IHsgcmV0dXJuRE9NTm9kZXMgPSBmYWxzZSwgbWV0aG9kIH0gPSBjdXN0b21NZXRob2RzW3Byb3BdO1xuXG4gICAgICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHtcbiAgICAgICAgICAgIGN1c3RvbU1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgc2VsZWN0b3I6ICAgICBnZXRTZWxlY3RvcigpXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY2FsbHNpdGVOYW1lcyA9IHsgaW5zdGFudGlhdGlvbjogcHJvcCB9O1xuXG4gICAgICAgIGlmIChyZXR1cm5ET01Ob2Rlcykge1xuICAgICAgICAgICAgb2JqW3Byb3BdID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvckZuID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlcyA9IHNlbGVjdG9yKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbU1ldGhvZC5hcHBseShjdXN0b21NZXRob2QsIFtub2Rlc10uY29uY2F0KGFyZ3MpKTtcbiAgICAgICAgICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby11bmRlZiAqL1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBhcGlGbiA9IHByZXBhcmVBcGlGbkFyZ3MocHJvcCwgLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gKCkgPT4gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxEZXBlbmRlbmNpZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbU1ldGhvZDogbWV0aG9kXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVEZXJpdmF0aXZlU2VsZWN0b3JXaXRoRmlsdGVyKHsgZ2V0U2VsZWN0b3IsIFNlbGVjdG9yQnVpbGRlciwgc2VsZWN0b3JGbiwgYXBpRm4sIGZpbHRlciwgYWRkaXRpb25hbERlcGVuZGVuY2llcyB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvYmpbcHJvcF0gPSAobmV3IENsaWVudEZ1bmN0aW9uQnVpbGRlcigoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHNlbGVjdG9yKCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9tTWV0aG9kLmFwcGx5KGN1c3RvbU1ldGhvZCwgW25vZGVdLmNvbmNhdChhcmdzKSk7XG4gICAgICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby11bmRlZiAqL1xuICAgICAgICAgICAgfSwgeyBkZXBlbmRlbmNpZXMgfSwgY2FsbHNpdGVOYW1lcykpLmdldEZ1bmN0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVNuYXBzaG90UHJvcGVydHlMaXN0IChjdXN0b21ET01Qcm9wZXJ0aWVzKSB7XG4gICAgbGV0IHByb3BlcnRpZXMgPSBbLi4uU05BUFNIT1RfUFJPUEVSVElFU107XG5cbiAgICAvLyBOT1RFOiBUaGUgJ3Zpc2libGUnIHNuYXBzaG90IHByb3BlcnR5IGhhcyBhIHNlcGFyYXRlIGhhbmRsZXIuXG4gICAgcmVtb3ZlKHByb3BlcnRpZXMsIFZJU0lCTEVfUFJPUF9OQU1FKTtcblxuICAgIGlmIChjdXN0b21ET01Qcm9wZXJ0aWVzKVxuICAgICAgICBwcm9wZXJ0aWVzID0gcHJvcGVydGllcy5jb25jYXQoT2JqZWN0LmtleXMoY3VzdG9tRE9NUHJvcGVydGllcykpO1xuXG4gICAgcmV0dXJuIHByb3BlcnRpZXM7XG59XG5cbmZ1bmN0aW9uIGFkZFNuYXBzaG90UHJvcGVydHlTaG9ydGhhbmRzICh7IG9iaiwgZ2V0U2VsZWN0b3IsIFNlbGVjdG9yQnVpbGRlciwgY3VzdG9tRE9NUHJvcGVydGllcywgY3VzdG9tTWV0aG9kcywgb2JzZXJ2ZWRDYWxsc2l0ZXMgfSkge1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBwcmVwYXJlU25hcHNob3RQcm9wZXJ0eUxpc3QoY3VzdG9tRE9NUHJvcGVydGllcyk7XG5cbiAgICBhZGRTbmFwc2hvdFByb3BlcnRpZXMob2JqLCBnZXRTZWxlY3RvciwgU2VsZWN0b3JCdWlsZGVyLCBwcm9wZXJ0aWVzLCBvYnNlcnZlZENhbGxzaXRlcyk7XG4gICAgYWRkQ3VzdG9tTWV0aG9kcyhvYmosIGdldFNlbGVjdG9yLCBTZWxlY3RvckJ1aWxkZXIsIGN1c3RvbU1ldGhvZHMpO1xuXG4gICAgb2JqLmdldFN0eWxlUHJvcGVydHkgPSBwcm9wID0+IHtcbiAgICAgICAgY29uc3QgY2FsbHNpdGUgPSBnZXRDYWxsc2l0ZUZvck1ldGhvZCgnZ2V0U3R5bGVQcm9wZXJ0eScpO1xuXG4gICAgICAgIHJldHVybiBSZUV4ZWN1dGFibGVQcm9taXNlLmZyb21Gbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IGdldFNuYXBzaG90KGdldFNlbGVjdG9yLCBjYWxsc2l0ZSwgU2VsZWN0b3JCdWlsZGVyKTtcblxuICAgICAgICAgICAgcmV0dXJuIHNuYXBzaG90LnN0eWxlID8gc25hcHNob3Quc3R5bGVbcHJvcF0gOiB2b2lkIDA7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBvYmouZ2V0QXR0cmlidXRlID0gYXR0ck5hbWUgPT4ge1xuICAgICAgICBjb25zdCBjYWxsc2l0ZSA9IGdldENhbGxzaXRlRm9yTWV0aG9kKCdnZXRBdHRyaWJ1dGUnKTtcblxuICAgICAgICByZXR1cm4gUmVFeGVjdXRhYmxlUHJvbWlzZS5mcm9tRm4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBnZXRTbmFwc2hvdChnZXRTZWxlY3RvciwgY2FsbHNpdGUsIFNlbGVjdG9yQnVpbGRlcik7XG5cbiAgICAgICAgICAgIHJldHVybiBzbmFwc2hvdC5hdHRyaWJ1dGVzID8gc25hcHNob3QuYXR0cmlidXRlc1thdHRyTmFtZV0gOiB2b2lkIDA7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBvYmouaGFzQXR0cmlidXRlID0gYXR0ck5hbWUgPT4ge1xuICAgICAgICBjb25zdCBjYWxsc2l0ZSA9IGdldENhbGxzaXRlRm9yTWV0aG9kKCdoYXNBdHRyaWJ1dGUnKTtcblxuICAgICAgICByZXR1cm4gUmVFeGVjdXRhYmxlUHJvbWlzZS5mcm9tRm4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBnZXRTbmFwc2hvdChnZXRTZWxlY3RvciwgY2FsbHNpdGUsIFNlbGVjdG9yQnVpbGRlcik7XG5cbiAgICAgICAgICAgIHJldHVybiBzbmFwc2hvdC5hdHRyaWJ1dGVzID8gc25hcHNob3QuYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShhdHRyTmFtZSkgOiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIG9iai5nZXRCb3VuZGluZ0NsaWVudFJlY3RQcm9wZXJ0eSA9IHByb3AgPT4ge1xuICAgICAgICBjb25zdCBjYWxsc2l0ZSA9IGdldENhbGxzaXRlRm9yTWV0aG9kKCdnZXRCb3VuZGluZ0NsaWVudFJlY3RQcm9wZXJ0eScpO1xuXG4gICAgICAgIHJldHVybiBSZUV4ZWN1dGFibGVQcm9taXNlLmZyb21Gbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IGdldFNuYXBzaG90KGdldFNlbGVjdG9yLCBjYWxsc2l0ZSwgU2VsZWN0b3JCdWlsZGVyKTtcblxuICAgICAgICAgICAgcmV0dXJuIHNuYXBzaG90LmJvdW5kaW5nQ2xpZW50UmVjdCA/IHNuYXBzaG90LmJvdW5kaW5nQ2xpZW50UmVjdFtwcm9wXSA6IHZvaWQgMDtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIG9iai5oYXNDbGFzcyA9IG5hbWUgPT4ge1xuICAgICAgICBjb25zdCBjYWxsc2l0ZSA9IGdldENhbGxzaXRlRm9yTWV0aG9kKCdoYXNDbGFzcycpO1xuXG4gICAgICAgIHJldHVybiBSZUV4ZWN1dGFibGVQcm9taXNlLmZyb21Gbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IGdldFNuYXBzaG90KGdldFNlbGVjdG9yLCBjYWxsc2l0ZSwgU2VsZWN0b3JCdWlsZGVyKTtcblxuICAgICAgICAgICAgcmV0dXJuIHNuYXBzaG90LmNsYXNzTmFtZXMgPyBzbmFwc2hvdC5jbGFzc05hbWVzLmluZGV4T2YobmFtZSkgPiAtMSA6IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb3VudGVyIChnZXRTZWxlY3RvciwgU2VsZWN0b3JCdWlsZGVyKSB7XG4gICAgY29uc3QgYnVpbGRlciAgPSBuZXcgU2VsZWN0b3JCdWlsZGVyKGdldFNlbGVjdG9yKCksIHsgY291bnRlck1vZGU6IHRydWUgfSwgeyBpbnN0YW50aWF0aW9uOiAnU2VsZWN0b3InIH0pO1xuICAgIGNvbnN0IGNvdW50ZXIgID0gYnVpbGRlci5nZXRGdW5jdGlvbigpO1xuICAgIGNvbnN0IGNhbGxzaXRlID0gZ2V0Q2FsbHNpdGVGb3JNZXRob2QoJ2dldCcpO1xuXG4gICAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBjb3VudGVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBlcnIuY2FsbHNpdGUgPSBjYWxsc2l0ZTtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGFkZENvdW50ZXJQcm9wZXJ0aWVzICh7IG9iaiwgZ2V0U2VsZWN0b3IsIFNlbGVjdG9yQnVpbGRlciB9KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgJ2NvdW50Jywge1xuICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ZXIgPSBjcmVhdGVDb3VudGVyKGdldFNlbGVjdG9yLCBTZWxlY3RvckJ1aWxkZXIpO1xuXG4gICAgICAgICAgICByZXR1cm4gUmVFeGVjdXRhYmxlUHJvbWlzZS5mcm9tRm4oKCkgPT4gY291bnRlcigpKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgJ2V4aXN0cycsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb3VudGVyID0gY3JlYXRlQ291bnRlcihnZXRTZWxlY3RvciwgU2VsZWN0b3JCdWlsZGVyKTtcblxuICAgICAgICAgICAgcmV0dXJuIFJlRXhlY3V0YWJsZVByb21pc2UuZnJvbUZuKGFzeW5jICgpID0+IGF3YWl0IGNvdW50ZXIoKSA+IDApO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRGaWx0ZXJUb0NsaWVudEZ1bmN0aW9uSWZOZWNlc3NhcnkgKGNhbGxzaXRlTmFtZSwgZmlsdGVyLCBkZXBlbmRlbmNpZXMpIHtcbiAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmlsdGVyW2NsaWVudEZ1bmN0aW9uQnVpbGRlclN5bWJvbF07XG4gICAgICAgIGNvbnN0IGZuICAgICAgPSBidWlsZGVyID8gYnVpbGRlci5mbiA6IGZpbHRlcjtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGJ1aWxkZXIgPyBhc3NpZ24oe30sIGJ1aWxkZXIub3B0aW9ucywgeyBkZXBlbmRlbmNpZXMgfSkgOiB7IGRlcGVuZGVuY2llcyB9O1xuXG4gICAgICAgIHJldHVybiAobmV3IENsaWVudEZ1bmN0aW9uQnVpbGRlcihmbiwgb3B0aW9ucywgeyBpbnN0YW50aWF0aW9uOiBjYWxsc2l0ZU5hbWUgfSkpLmdldEZ1bmN0aW9uKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbHRlcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGVyaXZhdGl2ZVNlbGVjdG9yV2l0aEZpbHRlciAoeyBnZXRTZWxlY3RvciwgU2VsZWN0b3JCdWlsZGVyLCBzZWxlY3RvckZuLCBhcGlGbiwgZmlsdGVyLCBhZGRpdGlvbmFsRGVwZW5kZW5jaWVzIH0pIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uTW9kZVNlbGVjdG9yQnVpbGRlciA9IG5ldyBTZWxlY3RvckJ1aWxkZXIoZ2V0U2VsZWN0b3IoKSwgeyBjb2xsZWN0aW9uTW9kZTogdHJ1ZSB9KTtcbiAgICBjb25zdCBjdXN0b21ET01Qcm9wZXJ0aWVzICAgICAgICAgICA9IGNvbGxlY3Rpb25Nb2RlU2VsZWN0b3JCdWlsZGVyLm9wdGlvbnMuY3VzdG9tRE9NUHJvcGVydGllcztcbiAgICBjb25zdCBjdXN0b21NZXRob2RzICAgICAgICAgICAgICAgICA9IGNvbGxlY3Rpb25Nb2RlU2VsZWN0b3JCdWlsZGVyLm9wdGlvbnMuY3VzdG9tTWV0aG9kcztcblxuICAgIGxldCBkZXBlbmRlbmNpZXMgPSB7XG4gICAgICAgIHNlbGVjdG9yOiAgICBjb2xsZWN0aW9uTW9kZVNlbGVjdG9yQnVpbGRlci5nZXRGdW5jdGlvbigpLFxuICAgICAgICBmaWx0ZXI6ICAgICAgZmlsdGVyLFxuICAgICAgICBmaWx0ZXJOb2RlczogZmlsdGVyTm9kZXNcbiAgICB9O1xuXG4gICAgY29uc3QgeyBib3VuZFRlc3RSdW4sIHRpbWVvdXQsIHZpc2liaWxpdHlDaGVjaywgYXBpRm5DaGFpbiB9ID0gY29sbGVjdGlvbk1vZGVTZWxlY3RvckJ1aWxkZXIub3B0aW9ucztcblxuICAgIGRlcGVuZGVuY2llcyA9IGFzc2lnbihkZXBlbmRlbmNpZXMsIGFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBTZWxlY3RvckJ1aWxkZXIoc2VsZWN0b3JGbiwge1xuICAgICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICAgIGN1c3RvbURPTVByb3BlcnRpZXMsXG4gICAgICAgIGN1c3RvbU1ldGhvZHMsXG4gICAgICAgIGJvdW5kVGVzdFJ1bixcbiAgICAgICAgdGltZW91dCxcbiAgICAgICAgdmlzaWJpbGl0eUNoZWNrLFxuICAgICAgICBhcGlGbkNoYWluLFxuICAgICAgICBhcGlGblxuICAgIH0sIHsgaW5zdGFudGlhdGlvbjogJ1NlbGVjdG9yJyB9KTtcblxuICAgIHJldHVybiBidWlsZGVyLmdldEZ1bmN0aW9uKCk7XG59XG5cbmNvbnN0IGZpbHRlckJ5VGV4dCA9IGNvbnZlcnRGaWx0ZXJUb0NsaWVudEZ1bmN0aW9uSWZOZWNlc3NhcnkoJ2ZpbHRlcicsIHNlbGVjdG9yVGV4dEZpbHRlcik7XG5jb25zdCBmaWx0ZXJCeUF0dHIgPSBjb252ZXJ0RmlsdGVyVG9DbGllbnRGdW5jdGlvbklmTmVjZXNzYXJ5KCdmaWx0ZXInLCBzZWxlY3RvckF0dHJpYnV0ZUZpbHRlcik7XG5cbmZ1bmN0aW9uIGVuc3VyZVJlZ0V4cENvbnRleHQgKHN0cikge1xuICAgIC8vIE5PVEU6IGlmIGEgcmVnZXhwIGlzIGNyZWF0ZWQgaW4gYSBzZXBhcmF0ZSBjb250ZXh0ICh2aWEgdGhlICd2bScgbW9kdWxlKSB3ZVxuICAgIC8vIHNob3VsZCB3cmFwIGl0IHdpdGggbmV3IFJlZ0V4cCgpIHRvIG1ha2UgdGhlIGBpbnN0YW5jZW9mIFJlZ0V4cGAgY2hlY2sgc3VjY2Vzc2Z1bC5cbiAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycgJiYgIShzdHIgaW5zdGFuY2VvZiBSZWdFeHApKVxuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChzdHIpO1xuXG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZnVuY3Rpb24gYWRkRmlsdGVyTWV0aG9kcyAob3B0aW9ucykge1xuICAgIGNvbnN0IHsgb2JqLCBnZXRTZWxlY3RvciwgU2VsZWN0b3JCdWlsZGVyIH0gPSBvcHRpb25zO1xuXG4gICAgb2JqLm50aCA9IGluZGV4ID0+IHtcbiAgICAgICAgYXNzZXJ0VHlwZShpcy5udW1iZXIsICdudGgnLCAnXCJpbmRleFwiIGFyZ3VtZW50JywgaW5kZXgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUZuICAgPSBwcmVwYXJlQXBpRm5BcmdzKCdudGgnLCBpbmRleCk7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgU2VsZWN0b3JCdWlsZGVyKGdldFNlbGVjdG9yKCksIHsgaW5kZXgsIGFwaUZuIH0sIHsgaW5zdGFudGlhdGlvbjogJ1NlbGVjdG9yJyB9KTtcblxuICAgICAgICByZXR1cm4gYnVpbGRlci5nZXRGdW5jdGlvbigpO1xuICAgIH07XG5cbiAgICBvYmoud2l0aFRleHQgPSB0ZXh0ID0+IHtcbiAgICAgICAgYXNzZXJ0VHlwZShbaXMuc3RyaW5nLCBpcy5yZWdFeHBdLCAnd2l0aFRleHQnLCAnXCJ0ZXh0XCIgYXJndW1lbnQnLCB0ZXh0KTtcblxuICAgICAgICBjb25zdCBhcGlGbiA9IHByZXBhcmVBcGlGbkFyZ3MoJ3dpdGhUZXh0JywgdGV4dCk7XG5cbiAgICAgICAgdGV4dCA9IGVuc3VyZVJlZ0V4cENvbnRleHQodGV4dCk7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0b3JGbiA9ICgpID0+IHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgICAgICAgICBjb25zdCBub2RlcyA9IHNlbGVjdG9yKCk7XG5cbiAgICAgICAgICAgIGlmICghbm9kZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyTm9kZXMobm9kZXMsIGZpbHRlciwgZG9jdW1lbnQsIHZvaWQgMCwgdGV4dFJlKTtcbiAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW5kZWYgKi9cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBhcmdzID0gZ2V0RGVyaXZhdGl2ZVNlbGVjdG9yQXJncyhvcHRpb25zLCBzZWxlY3RvckZuLCBhcGlGbiwgZmlsdGVyQnlUZXh0LCB7IHRleHRSZTogbWFrZVJlZ0V4cCh0ZXh0KSB9KTtcblxuICAgICAgICByZXR1cm4gY3JlYXRlRGVyaXZhdGl2ZVNlbGVjdG9yV2l0aEZpbHRlcihhcmdzKTtcbiAgICB9O1xuXG4gICAgb2JqLndpdGhFeGFjdFRleHQgPSB0ZXh0ID0+IHtcbiAgICAgICAgYXNzZXJ0VHlwZShpcy5zdHJpbmcsICd3aXRoRXhhY3RUZXh0JywgJ1widGV4dFwiIGFyZ3VtZW50JywgdGV4dCk7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0b3JGbiA9ICgpID0+IHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgICAgICAgICBjb25zdCBub2RlcyA9IHNlbGVjdG9yKCk7XG5cbiAgICAgICAgICAgIGlmICghbm9kZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyTm9kZXMobm9kZXMsIGZpbHRlciwgZG9jdW1lbnQsIHZvaWQgMCwgZXhhY3RUZXh0KTtcbiAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW5kZWYgKi9cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBhcGlGbiA9IHByZXBhcmVBcGlGbkFyZ3MoJ3dpdGhFeGFjdFRleHQnLCB0ZXh0KTtcbiAgICAgICAgY29uc3QgYXJncyAgPSBnZXREZXJpdmF0aXZlU2VsZWN0b3JBcmdzKG9wdGlvbnMsIHNlbGVjdG9yRm4sIGFwaUZuLCBmaWx0ZXJCeVRleHQsIHsgZXhhY3RUZXh0OiB0ZXh0IH0pO1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVEZXJpdmF0aXZlU2VsZWN0b3JXaXRoRmlsdGVyKGFyZ3MpO1xuICAgIH07XG5cbiAgICBvYmoud2l0aEF0dHJpYnV0ZSA9IChhdHRyTmFtZSwgYXR0clZhbHVlKSA9PiB7XG4gICAgICAgIGFzc2VydFR5cGUoW2lzLnN0cmluZywgaXMucmVnRXhwXSwgJ3dpdGhBdHRyaWJ1dGUnLCAnXCJhdHRyTmFtZVwiIGFyZ3VtZW50JywgYXR0ck5hbWUpO1xuXG4gICAgICAgIGNvbnN0IGFwaUZuID0gcHJlcGFyZUFwaUZuQXJncygnd2l0aEF0dHJpYnV0ZScsIGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuXG4gICAgICAgIGF0dHJOYW1lID0gZW5zdXJlUmVnRXhwQ29udGV4dChhdHRyTmFtZSk7XG5cbiAgICAgICAgaWYgKGF0dHJWYWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBhc3NlcnRUeXBlKFtpcy5zdHJpbmcsIGlzLnJlZ0V4cF0sICd3aXRoQXR0cmlidXRlJywgJ1wiYXR0clZhbHVlXCIgYXJndW1lbnQnLCBhdHRyVmFsdWUpO1xuICAgICAgICAgICAgYXR0clZhbHVlID0gZW5zdXJlUmVnRXhwQ29udGV4dChhdHRyVmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0b3JGbiA9ICgpID0+IHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgICAgICAgICBjb25zdCBub2RlcyA9IHNlbGVjdG9yKCk7XG5cbiAgICAgICAgICAgIGlmICghbm9kZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyTm9kZXMobm9kZXMsIGZpbHRlciwgZG9jdW1lbnQsIHZvaWQgMCwgYXR0ck5hbWUsIGF0dHJWYWx1ZSk7XG4gICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVuZGVmICovXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgYXJncyA9IGdldERlcml2YXRpdmVTZWxlY3RvckFyZ3Mob3B0aW9ucywgc2VsZWN0b3JGbiwgYXBpRm4sIGZpbHRlckJ5QXR0ciwge1xuICAgICAgICAgICAgYXR0ck5hbWUsXG4gICAgICAgICAgICBhdHRyVmFsdWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZURlcml2YXRpdmVTZWxlY3RvcldpdGhGaWx0ZXIoYXJncyk7XG4gICAgfTtcblxuICAgIG9iai5maWx0ZXIgPSAoZmlsdGVyLCBkZXBlbmRlbmNpZXMpID0+IHtcbiAgICAgICAgYXNzZXJ0VHlwZShbaXMuc3RyaW5nLCBpcy5mdW5jdGlvbl0sICdmaWx0ZXInLCAnXCJmaWx0ZXJcIiBhcmd1bWVudCcsIGZpbHRlcik7XG5cbiAgICAgICAgY29uc3QgYXBpRm4gPSBwcmVwYXJlQXBpRm5BcmdzKCdmaWx0ZXInLCBmaWx0ZXIpO1xuXG4gICAgICAgIGZpbHRlciA9IGNvbnZlcnRGaWx0ZXJUb0NsaWVudEZ1bmN0aW9uSWZOZWNlc3NhcnkoJ2ZpbHRlcicsIGZpbHRlciwgZGVwZW5kZW5jaWVzKTtcblxuICAgICAgICBjb25zdCBzZWxlY3RvckZuID0gKCkgPT4ge1xuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbiAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gc2VsZWN0b3IoKTtcblxuICAgICAgICAgICAgaWYgKCFub2Rlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJOb2Rlcyhub2RlcywgZmlsdGVyLCBkb2N1bWVudCwgdm9pZCAwKTtcbiAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW5kZWYgKi9cbiAgICAgICAgfTtcblxuXG4gICAgICAgIGNvbnN0IGFyZ3MgPSBnZXREZXJpdmF0aXZlU2VsZWN0b3JBcmdzKG9wdGlvbnMsIHNlbGVjdG9yRm4sIGFwaUZuLCBmaWx0ZXIpO1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVEZXJpdmF0aXZlU2VsZWN0b3JXaXRoRmlsdGVyKGFyZ3MpO1xuICAgIH07XG5cbiAgICBvYmouZmlsdGVyVmlzaWJsZSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgYXBpRm4gICA9IHByZXBhcmVBcGlGbkFyZ3MoJ2ZpbHRlclZpc2libGUnKTtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBTZWxlY3RvckJ1aWxkZXIoZ2V0U2VsZWN0b3IoKSwgeyBmaWx0ZXJWaXNpYmxlOiB0cnVlLCBhcGlGbiB9LCB7IGluc3RhbnRpYXRpb246ICdTZWxlY3RvcicgfSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0RnVuY3Rpb24oKTtcbiAgICB9O1xuXG4gICAgb2JqLmZpbHRlckhpZGRlbiA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgYXBpRm4gICA9IHByZXBhcmVBcGlGbkFyZ3MoJ2ZpbHRlckhpZGRlbicpO1xuICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IFNlbGVjdG9yQnVpbGRlcihnZXRTZWxlY3RvcigpLCB7IGZpbHRlckhpZGRlbjogdHJ1ZSwgYXBpRm4gfSwgeyBpbnN0YW50aWF0aW9uOiAnU2VsZWN0b3InIH0pO1xuXG4gICAgICAgIHJldHVybiBidWlsZGVyLmdldEZ1bmN0aW9uKCk7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gYWRkQ3VzdG9tRE9NUHJvcGVydGllc01ldGhvZCAoeyBvYmosIGdldFNlbGVjdG9yLCBTZWxlY3RvckJ1aWxkZXIgfSkge1xuICAgIG9iai5hZGRDdXN0b21ET01Qcm9wZXJ0aWVzID0gY3VzdG9tRE9NUHJvcGVydGllcyA9PiB7XG4gICAgICAgIGFzc2VydEFkZEN1c3RvbURPTVByb3BlcnRpZXNPcHRpb25zKGN1c3RvbURPTVByb3BlcnRpZXMpO1xuXG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgU2VsZWN0b3JCdWlsZGVyKGdldFNlbGVjdG9yKCksIHsgY3VzdG9tRE9NUHJvcGVydGllcyB9LCB7IGluc3RhbnRpYXRpb246ICdTZWxlY3RvcicgfSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0RnVuY3Rpb24oKTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBhZGRDdXN0b21NZXRob2RzTWV0aG9kICh7IG9iaiwgZ2V0U2VsZWN0b3IsIFNlbGVjdG9yQnVpbGRlciB9KSB7XG4gICAgb2JqLmFkZEN1c3RvbU1ldGhvZHMgPSBmdW5jdGlvbiAobWV0aG9kcywgb3B0cykge1xuICAgICAgICBhc3NlcnRBZGRDdXN0b21NZXRob2RzKG1ldGhvZHMsIG9wdHMpO1xuXG4gICAgICAgIGNvbnN0IGN1c3RvbU1ldGhvZHMgPSB7fTtcblxuICAgICAgICBPYmplY3Qua2V5cyhtZXRob2RzKS5mb3JFYWNoKG1ldGhvZE5hbWUgPT4ge1xuICAgICAgICAgICAgY3VzdG9tTWV0aG9kc1ttZXRob2ROYW1lXSA9IHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICAgICAgICAgbWV0aG9kc1ttZXRob2ROYW1lXSxcbiAgICAgICAgICAgICAgICByZXR1cm5ET01Ob2Rlczogb3B0cyAmJiAhIW9wdHMucmV0dXJuRE9NTm9kZXNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgU2VsZWN0b3JCdWlsZGVyKGdldFNlbGVjdG9yKCksIHsgY3VzdG9tTWV0aG9kcyB9LCB7IGluc3RhbnRpYXRpb246ICdTZWxlY3RvcicgfSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0RnVuY3Rpb24oKTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBhZGRIaWVyYXJjaGljYWxTZWxlY3RvcnMgKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IG9iaiB9ID0gb3B0aW9ucztcblxuICAgIC8vIEZpbmRcbiAgICBvYmouZmluZCA9IChmaWx0ZXIsIGRlcGVuZGVuY2llcykgPT4ge1xuICAgICAgICBhc3NlcnRUeXBlKFtpcy5zdHJpbmcsIGlzLmZ1bmN0aW9uXSwgJ2ZpbmQnLCAnXCJmaWx0ZXJcIiBhcmd1bWVudCcsIGZpbHRlcik7XG5cbiAgICAgICAgY29uc3QgYXBpRm4gPSBwcmVwYXJlQXBpRm5BcmdzKCdmaW5kJywgZmlsdGVyKTtcblxuICAgICAgICBmaWx0ZXIgPSBjb252ZXJ0RmlsdGVyVG9DbGllbnRGdW5jdGlvbklmTmVjZXNzYXJ5KCdmaW5kJywgZmlsdGVyLCBkZXBlbmRlbmNpZXMpO1xuXG4gICAgICAgIGNvbnN0IHNlbGVjdG9yRm4gPSAoKSA9PiB7XG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuICAgICAgICAgICAgcmV0dXJuIGV4cGFuZFNlbGVjdG9yUmVzdWx0cyhzZWxlY3Rvciwgbm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2Ygbm9kZS5xdWVyeVNlbGVjdG9yQWxsID09PSAnZnVuY3Rpb24nID9cbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucXVlcnlTZWxlY3RvckFsbChmaWx0ZXIpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdmlzaXROb2RlID0gY3VycmVudE5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbkxlbmd0aCA9IGN1cnJlbnROb2RlLmNoaWxkTm9kZXMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY25MZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBjdXJyZW50Tm9kZS5jaGlsZE5vZGVzW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goY2hpbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpdE5vZGUoY2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHZpc2l0Tm9kZShub2RlKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJOb2RlcyhyZXN1bHRzLCBmaWx0ZXIsIG51bGwsIG5vZGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVuZGVmICovXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgYXJncyA9IGdldERlcml2YXRpdmVTZWxlY3RvckFyZ3Mob3B0aW9ucywgc2VsZWN0b3JGbiwgYXBpRm4sIGZpbHRlciwgeyBleHBhbmRTZWxlY3RvclJlc3VsdHMgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZURlcml2YXRpdmVTZWxlY3RvcldpdGhGaWx0ZXIoYXJncyk7XG4gICAgfTtcblxuICAgIC8vIFBhcmVudFxuICAgIG9iai5wYXJlbnQgPSAoZmlsdGVyLCBkZXBlbmRlbmNpZXMpID0+IHtcbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdm9pZCAwKVxuICAgICAgICAgICAgYXNzZXJ0VHlwZShbaXMuc3RyaW5nLCBpcy5mdW5jdGlvbiwgaXMubnVtYmVyXSwgJ3BhcmVudCcsICdcImZpbHRlclwiIGFyZ3VtZW50JywgZmlsdGVyKTtcblxuICAgICAgICBjb25zdCBhcGlGbiA9IHByZXBhcmVBcGlGbkFyZ3MoJ3BhcmVudCcsIGZpbHRlcik7XG5cbiAgICAgICAgZmlsdGVyID0gY29udmVydEZpbHRlclRvQ2xpZW50RnVuY3Rpb25JZk5lY2Vzc2FyeSgnZmluZCcsIGZpbHRlciwgZGVwZW5kZW5jaWVzKTtcblxuICAgICAgICBjb25zdCBzZWxlY3RvckZuID0gKCkgPT4ge1xuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbiAgICAgICAgICAgIHJldHVybiBleHBhbmRTZWxlY3RvclJlc3VsdHMoc2VsZWN0b3IsIG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudHMgPSBbXTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTsgcGFyZW50OyBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50cy5wdXNoKHBhcmVudCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyICE9PSB2b2lkIDAgPyBmaWx0ZXJOb2RlcyhwYXJlbnRzLCBmaWx0ZXIsIGRvY3VtZW50LCBub2RlKSA6IHBhcmVudHM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW5kZWYgKi9cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBhcmdzID0gZ2V0RGVyaXZhdGl2ZVNlbGVjdG9yQXJncyhvcHRpb25zLCBzZWxlY3RvckZuLCBhcGlGbiwgZmlsdGVyLCB7IGV4cGFuZFNlbGVjdG9yUmVzdWx0cyB9KTtcblxuICAgICAgICByZXR1cm4gY3JlYXRlRGVyaXZhdGl2ZVNlbGVjdG9yV2l0aEZpbHRlcihhcmdzKTtcbiAgICB9O1xuXG4gICAgLy8gQ2hpbGRcbiAgICBvYmouY2hpbGQgPSAoZmlsdGVyLCBkZXBlbmRlbmNpZXMpID0+IHtcbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdm9pZCAwKVxuICAgICAgICAgICAgYXNzZXJ0VHlwZShbaXMuc3RyaW5nLCBpcy5mdW5jdGlvbiwgaXMubnVtYmVyXSwgJ2NoaWxkJywgJ1wiZmlsdGVyXCIgYXJndW1lbnQnLCBmaWx0ZXIpO1xuXG4gICAgICAgIGNvbnN0IGFwaUZuID0gcHJlcGFyZUFwaUZuQXJncygnY2hpbGQnLCBmaWx0ZXIpO1xuXG4gICAgICAgIGZpbHRlciA9IGNvbnZlcnRGaWx0ZXJUb0NsaWVudEZ1bmN0aW9uSWZOZWNlc3NhcnkoJ2ZpbmQnLCBmaWx0ZXIsIGRlcGVuZGVuY2llcyk7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0b3JGbiA9ICgpID0+IHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgICAgICAgICByZXR1cm4gZXhwYW5kU2VsZWN0b3JSZXN1bHRzKHNlbGVjdG9yLCBub2RlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEVsZW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgY25MZW5ndGggICAgICA9IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNuTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkTm9kZXNbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50cy5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyICE9PSB2b2lkIDAgPyBmaWx0ZXJOb2RlcyhjaGlsZEVsZW1lbnRzLCBmaWx0ZXIsIG5vZGUsIG5vZGUpIDogY2hpbGRFbGVtZW50cztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby11bmRlZiAqL1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGFyZ3MgPSBnZXREZXJpdmF0aXZlU2VsZWN0b3JBcmdzKG9wdGlvbnMsIHNlbGVjdG9yRm4sIGFwaUZuLCBmaWx0ZXIsIHsgZXhwYW5kU2VsZWN0b3JSZXN1bHRzIH0pO1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVEZXJpdmF0aXZlU2VsZWN0b3JXaXRoRmlsdGVyKGFyZ3MpO1xuICAgIH07XG5cbiAgICAvLyBTaWJsaW5nXG4gICAgb2JqLnNpYmxpbmcgPSAoZmlsdGVyLCBkZXBlbmRlbmNpZXMpID0+IHtcbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdm9pZCAwKVxuICAgICAgICAgICAgYXNzZXJ0VHlwZShbaXMuc3RyaW5nLCBpcy5mdW5jdGlvbiwgaXMubnVtYmVyXSwgJ3NpYmxpbmcnLCAnXCJmaWx0ZXJcIiBhcmd1bWVudCcsIGZpbHRlcik7XG5cbiAgICAgICAgY29uc3QgYXBpRm4gPSBwcmVwYXJlQXBpRm5BcmdzKCdzaWJsaW5nJywgZmlsdGVyKTtcblxuICAgICAgICBmaWx0ZXIgPSBjb252ZXJ0RmlsdGVyVG9DbGllbnRGdW5jdGlvbklmTmVjZXNzYXJ5KCdmaW5kJywgZmlsdGVyLCBkZXBlbmRlbmNpZXMpO1xuXG4gICAgICAgIGNvbnN0IHNlbGVjdG9yRm4gPSAoKSA9PiB7XG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuICAgICAgICAgICAgcmV0dXJuIGV4cGFuZFNlbGVjdG9yUmVzdWx0cyhzZWxlY3Rvciwgbm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc2libGluZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBjbkxlbmd0aCA9IHBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY25MZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IHBhcmVudC5jaGlsZE5vZGVzW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMSAmJiBjaGlsZCAhPT0gbm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXIgIT09IHZvaWQgMCA/IGZpbHRlck5vZGVzKHNpYmxpbmdzLCBmaWx0ZXIsIHBhcmVudCwgbm9kZSkgOiBzaWJsaW5ncztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby11bmRlZiAqL1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGFyZ3MgPSBnZXREZXJpdmF0aXZlU2VsZWN0b3JBcmdzKG9wdGlvbnMsIHNlbGVjdG9yRm4sIGFwaUZuLCBmaWx0ZXIsIHsgZXhwYW5kU2VsZWN0b3JSZXN1bHRzIH0pO1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVEZXJpdmF0aXZlU2VsZWN0b3JXaXRoRmlsdGVyKGFyZ3MpO1xuICAgIH07XG5cbiAgICAvLyBOZXh0IHNpYmxpbmdcbiAgICBvYmoubmV4dFNpYmxpbmcgPSAoZmlsdGVyLCBkZXBlbmRlbmNpZXMpID0+IHtcbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdm9pZCAwKVxuICAgICAgICAgICAgYXNzZXJ0VHlwZShbaXMuc3RyaW5nLCBpcy5mdW5jdGlvbiwgaXMubnVtYmVyXSwgJ25leHRTaWJsaW5nJywgJ1wiZmlsdGVyXCIgYXJndW1lbnQnLCBmaWx0ZXIpO1xuXG4gICAgICAgIGNvbnN0IGFwaUZuID0gcHJlcGFyZUFwaUZuQXJncygnbmV4dFNpYmxpbmcnLCBmaWx0ZXIpO1xuXG4gICAgICAgIGZpbHRlciA9IGNvbnZlcnRGaWx0ZXJUb0NsaWVudEZ1bmN0aW9uSWZOZWNlc3NhcnkoJ2ZpbmQnLCBmaWx0ZXIsIGRlcGVuZGVuY2llcyk7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0b3JGbiA9ICgpID0+IHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgICAgICAgICByZXR1cm4gZXhwYW5kU2VsZWN0b3JSZXN1bHRzKHNlbGVjdG9yLCBub2RlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNuTGVuZ3RoID0gcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGxldCBhZnRlck5vZGUgID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNuTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBwYXJlbnQuY2hpbGROb2Rlc1tpXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQgPT09IG5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBhZnRlck5vZGUgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFmdGVyTm9kZSAmJiBjaGlsZC5ub2RlVHlwZSA9PT0gMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXIgIT09IHZvaWQgMCA/IGZpbHRlck5vZGVzKHNpYmxpbmdzLCBmaWx0ZXIsIHBhcmVudCwgbm9kZSkgOiBzaWJsaW5ncztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby11bmRlZiAqL1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGFyZ3MgPSBnZXREZXJpdmF0aXZlU2VsZWN0b3JBcmdzKG9wdGlvbnMsIHNlbGVjdG9yRm4sIGFwaUZuLCBmaWx0ZXIsIHsgZXhwYW5kU2VsZWN0b3JSZXN1bHRzIH0pO1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVEZXJpdmF0aXZlU2VsZWN0b3JXaXRoRmlsdGVyKGFyZ3MpO1xuICAgIH07XG5cbiAgICAvLyBQcmV2IHNpYmxpbmdcbiAgICBvYmoucHJldlNpYmxpbmcgPSAoZmlsdGVyLCBkZXBlbmRlbmNpZXMpID0+IHtcbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdm9pZCAwKVxuICAgICAgICAgICAgYXNzZXJ0VHlwZShbaXMuc3RyaW5nLCBpcy5mdW5jdGlvbiwgaXMubnVtYmVyXSwgJ3ByZXZTaWJsaW5nJywgJ1wiZmlsdGVyXCIgYXJndW1lbnQnLCBmaWx0ZXIpO1xuXG4gICAgICAgIGNvbnN0IGFwaUZuID0gcHJlcGFyZUFwaUZuQXJncygncHJldlNpYmxpbmcnLCBmaWx0ZXIpO1xuXG4gICAgICAgIGZpbHRlciA9IGNvbnZlcnRGaWx0ZXJUb0NsaWVudEZ1bmN0aW9uSWZOZWNlc3NhcnkoJ2ZpbmQnLCBmaWx0ZXIsIGRlcGVuZGVuY2llcyk7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0b3JGbiA9ICgpID0+IHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgICAgICAgICByZXR1cm4gZXhwYW5kU2VsZWN0b3JSZXN1bHRzKHNlbGVjdG9yLCBub2RlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNuTGVuZ3RoID0gcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbkxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gcGFyZW50LmNoaWxkTm9kZXNbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkID09PSBub2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlciAhPT0gdm9pZCAwID8gZmlsdGVyTm9kZXMoc2libGluZ3MsIGZpbHRlciwgcGFyZW50LCBub2RlKSA6IHNpYmxpbmdzO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVuZGVmICovXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgYXJncyA9IGdldERlcml2YXRpdmVTZWxlY3RvckFyZ3Mob3B0aW9ucywgc2VsZWN0b3JGbiwgYXBpRm4sIGZpbHRlciwgeyBleHBhbmRTZWxlY3RvclJlc3VsdHMgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZURlcml2YXRpdmVTZWxlY3RvcldpdGhGaWx0ZXIoYXJncyk7XG4gICAgfTtcblxuICAgIC8vIFNoYWRvd1Jvb3RcbiAgICBvYmouc2hhZG93Um9vdCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgYXBpRm4gPSBwcmVwYXJlQXBpRm5BcmdzKCdzaGFkb3dSb290Jyk7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0b3JGbiA9ICgpID0+IHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgICAgICAgICByZXR1cm4gZXhwYW5kU2VsZWN0b3JSZXN1bHRzKHNlbGVjdG9yLCBub2RlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gIW5vZGUuc2hhZG93Um9vdCA/IG51bGwgOiBbbm9kZS5zaGFkb3dSb290XTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby11bmRlZiAqL1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGFyZ3MgPSBnZXREZXJpdmF0aXZlU2VsZWN0b3JBcmdzKG9wdGlvbnMsIHNlbGVjdG9yRm4sIGFwaUZuLCB2b2lkIDAsIHsgZXhwYW5kU2VsZWN0b3JSZXN1bHRzIH0pO1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVEZXJpdmF0aXZlU2VsZWN0b3JXaXRoRmlsdGVyKGFyZ3MpO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRBUEkgKHNlbGVjdG9yLCBnZXRTZWxlY3RvciwgU2VsZWN0b3JCdWlsZGVyLCBjdXN0b21ET01Qcm9wZXJ0aWVzLCBjdXN0b21NZXRob2RzLCBvYnNlcnZlZENhbGxzaXRlcykge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IG9iajogc2VsZWN0b3IsIGdldFNlbGVjdG9yLCBTZWxlY3RvckJ1aWxkZXIsIGN1c3RvbURPTVByb3BlcnRpZXMsIGN1c3RvbU1ldGhvZHMsIG9ic2VydmVkQ2FsbHNpdGVzIH07XG5cbiAgICBhZGRGaWx0ZXJNZXRob2RzKG9wdGlvbnMpO1xuICAgIGFkZEhpZXJhcmNoaWNhbFNlbGVjdG9ycyhvcHRpb25zKTtcbiAgICBhZGRTbmFwc2hvdFByb3BlcnR5U2hvcnRoYW5kcyhvcHRpb25zKTtcbiAgICBhZGRDdXN0b21ET01Qcm9wZXJ0aWVzTWV0aG9kKG9wdGlvbnMpO1xuICAgIGFkZEN1c3RvbU1ldGhvZHNNZXRob2Qob3B0aW9ucyk7XG4gICAgYWRkQ291bnRlclByb3BlcnRpZXMob3B0aW9ucyk7XG4gICAgYWRkVmlzaWJsZVByb3BlcnR5KG9wdGlvbnMpO1xufVxuIl19
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.addAPI = exports.addCustomMethods = void 0;
7
+ const util_1 = require("util");
8
+ const lodash_1 = require("lodash");
9
+ const builder_symbol_1 = __importDefault(require("../builder-symbol"));
10
+ const snapshot_properties_1 = require("./snapshot-properties");
11
+ const get_callsite_1 = require("../../errors/get-callsite");
12
+ const client_function_builder_1 = __importDefault(require("../client-function-builder"));
13
+ const re_executable_promise_1 = __importDefault(require("../../utils/re-executable-promise"));
14
+ const type_assertions_1 = require("../../errors/runtime/type-assertions");
15
+ const make_reg_exp_1 = __importDefault(require("../../utils/make-reg-exp"));
16
+ const selector_text_filter_1 = __importDefault(require("./selector-text-filter"));
17
+ const selector_attribute_filter_1 = __importDefault(require("./selector-attribute-filter"));
18
+ const prepare_api_args_1 = __importDefault(require("./prepare-api-args"));
19
+ const callsite_1 = require("../../utils/callsite");
20
+ const selector_api_execution_mode_1 = __importDefault(require("../selector-api-execution-mode"));
21
+ const VISIBLE_PROP_NAME = 'visible';
22
+ const SNAPSHOT_PROP_PRIMITIVE = `[object ${re_executable_promise_1.default.name}]`;
23
+ const filterNodes = (new client_function_builder_1.default((nodes, filter, querySelectorRoot, originNode, ...filterArgs) => {
24
+ if (typeof filter === 'number') {
25
+ const matchingNode = filter < 0 ? nodes[nodes.length + filter] : nodes[filter];
26
+ return matchingNode ? [matchingNode] : [];
27
+ }
28
+ const result = [];
29
+ if (typeof filter === 'string') {
30
+ // NOTE: we can search for elements only in document/element/shadow root.
31
+ if (querySelectorRoot.nodeType !== 1 && querySelectorRoot.nodeType !== 9 && querySelectorRoot.nodeType !== 11)
32
+ return null;
33
+ const matching = querySelectorRoot.querySelectorAll(filter);
34
+ const matchingArr = [];
35
+ for (let i = 0; i < matching.length; i++)
36
+ matchingArr.push(matching[i]);
37
+ filter = node => matchingArr.indexOf(node) > -1;
38
+ }
39
+ if (typeof filter === 'function') {
40
+ for (let j = 0; j < nodes.length; j++) {
41
+ if (filter(nodes[j], j, originNode, ...filterArgs))
42
+ result.push(nodes[j]);
43
+ }
44
+ }
45
+ return result;
46
+ })).getFunction();
47
+ const expandSelectorResults = (new client_function_builder_1.default((selector, populateDerivativeNodes) => {
48
+ const nodes = selector();
49
+ if (!nodes.length)
50
+ return null;
51
+ const result = [];
52
+ for (let i = 0; i < nodes.length; i++) {
53
+ const derivativeNodes = populateDerivativeNodes(nodes[i]);
54
+ if (derivativeNodes) {
55
+ for (let j = 0; j < derivativeNodes.length; j++) {
56
+ if (result.indexOf(derivativeNodes[j]) < 0)
57
+ result.push(derivativeNodes[j]);
58
+ }
59
+ }
60
+ }
61
+ return result;
62
+ })).getFunction();
63
+ async function getSnapshot(getSelector, callsite, SelectorBuilder, getVisibleValueMode) {
64
+ let node = null;
65
+ const selector = new SelectorBuilder(getSelector(), { getVisibleValueMode, needError: true }, { instantiation: 'Selector' }).getFunction();
66
+ try {
67
+ node = await selector();
68
+ }
69
+ catch (err) {
70
+ err.callsite = callsite;
71
+ throw err;
72
+ }
73
+ return node;
74
+ }
75
+ function getSnapshotSync(getSelector, callsite, SelectorBuilder, getVisibleValueMode) {
76
+ let node = null;
77
+ const selector = new SelectorBuilder(getSelector(), { getVisibleValueMode, needError: true }, { instantiation: 'Selector' }).getFunction();
78
+ try {
79
+ node = selector();
80
+ }
81
+ catch (err) {
82
+ err.callsite = callsite;
83
+ throw err;
84
+ }
85
+ return node;
86
+ }
87
+ function assertAddCustomDOMPropertiesOptions(properties) {
88
+ type_assertions_1.assertType(type_assertions_1.is.nonNullObject, 'addCustomDOMProperties', '"addCustomDOMProperties" option', properties);
89
+ Object.keys(properties).forEach(prop => {
90
+ type_assertions_1.assertType(type_assertions_1.is.function, 'addCustomDOMProperties', `Custom DOM properties method '${prop}'`, properties[prop]);
91
+ });
92
+ }
93
+ function assertAddCustomMethods(properties, opts) {
94
+ type_assertions_1.assertType(type_assertions_1.is.nonNullObject, 'addCustomMethods', '"addCustomMethods" option', properties);
95
+ if (opts !== void 0)
96
+ type_assertions_1.assertType(type_assertions_1.is.nonNullObject, 'addCustomMethods', '"addCustomMethods" option', opts);
97
+ Object.keys(properties).forEach(prop => {
98
+ type_assertions_1.assertType(type_assertions_1.is.function, 'addCustomMethods', `Custom method '${prop}'`, properties[prop]);
99
+ });
100
+ }
101
+ function getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, additionalDependencies) {
102
+ return Object.assign({}, options, { selectorFn, apiFn, filter, additionalDependencies });
103
+ }
104
+ function createPrimitiveGetterWrapper(observedCallsites, callsite) {
105
+ return (depth, options) => {
106
+ const isTestCafeInspect = options === null || options === void 0 ? void 0 : options.isTestCafeInspect;
107
+ if (observedCallsites && !isTestCafeInspect)
108
+ observedCallsites.unawaitedSnapshotCallsites.add(callsite);
109
+ return SNAPSHOT_PROP_PRIMITIVE;
110
+ };
111
+ }
112
+ function checkForExcessiveAwaits(snapshotPropertyCallsites, checkedCallsite) {
113
+ const callsiteId = callsite_1.getCallsiteId(checkedCallsite);
114
+ // NOTE: If there is an asserted callsite, it means that .expect() was already called.
115
+ // We don't raise a warning and delete the callsite.
116
+ if (snapshotPropertyCallsites[callsiteId] && snapshotPropertyCallsites[callsiteId].checked)
117
+ delete snapshotPropertyCallsites[callsiteId];
118
+ // NOTE: If the calliste already exists, but is not asserted, it means that there are
119
+ // multiple awaited callsites in one assertion. We raise a warning for each of them.
120
+ else if (snapshotPropertyCallsites[callsiteId] && !snapshotPropertyCallsites[callsiteId].checked)
121
+ snapshotPropertyCallsites[callsiteId].callsites.push(checkedCallsite);
122
+ else
123
+ snapshotPropertyCallsites[callsiteId] = { callsites: [checkedCallsite], checked: false };
124
+ }
125
+ function addSnapshotProperties(obj, getSelector, SelectorBuilder, properties, observedCallsites) {
126
+ properties.forEach(prop => {
127
+ Object.defineProperty(obj, prop, {
128
+ get: () => {
129
+ const callsite = get_callsite_1.getCallsiteForMethod('get');
130
+ if (selector_api_execution_mode_1.default.isSync)
131
+ return getSnapshotSync(getSelector, callsite, SelectorBuilder)[prop];
132
+ const propertyPromise = re_executable_promise_1.default.fromFn(async () => {
133
+ const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder);
134
+ return snapshot[prop];
135
+ });
136
+ const primitiveGetterWrapper = createPrimitiveGetterWrapper(observedCallsites, callsite);
137
+ propertyPromise[Symbol.toPrimitive] = primitiveGetterWrapper;
138
+ propertyPromise[util_1.inspect.custom] = primitiveGetterWrapper;
139
+ propertyPromise.then = function (onFulfilled, onRejected) {
140
+ if (observedCallsites)
141
+ checkForExcessiveAwaits(observedCallsites.snapshotPropertyCallsites, callsite);
142
+ this._ensureExecuting();
143
+ return this._taskPromise.then(onFulfilled, onRejected);
144
+ };
145
+ return propertyPromise;
146
+ }
147
+ });
148
+ });
149
+ }
150
+ function addVisibleProperty({ obj, getSelector, SelectorBuilder }) {
151
+ Object.defineProperty(obj, VISIBLE_PROP_NAME, {
152
+ get: () => {
153
+ const callsite = get_callsite_1.getCallsiteForMethod('get');
154
+ if (selector_api_execution_mode_1.default.isSync) {
155
+ const snapshot = getSnapshotSync(getSelector, callsite, SelectorBuilder, true);
156
+ return !!snapshot && snapshot[VISIBLE_PROP_NAME];
157
+ }
158
+ return re_executable_promise_1.default.fromFn(async () => {
159
+ const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder, true);
160
+ return !!snapshot && snapshot[VISIBLE_PROP_NAME];
161
+ });
162
+ }
163
+ });
164
+ }
165
+ function addCustomMethods(obj, getSelector, SelectorBuilder, customMethods) {
166
+ const customMethodProps = customMethods ? Object.keys(customMethods) : [];
167
+ customMethodProps.forEach(prop => {
168
+ const { returnDOMNodes = false, method } = customMethods[prop];
169
+ const dependencies = {
170
+ customMethod: method,
171
+ selector: getSelector()
172
+ };
173
+ const callsiteNames = { instantiation: prop };
174
+ if (returnDOMNodes) {
175
+ obj[prop] = (...args) => {
176
+ const selectorFn = () => {
177
+ /* eslint-disable no-undef */
178
+ const nodes = selector();
179
+ return customMethod.apply(customMethod, [nodes].concat(args));
180
+ /* eslint-enable no-undef */
181
+ };
182
+ const apiFn = prepare_api_args_1.default(prop, ...args);
183
+ const filter = () => true;
184
+ const additionalDependencies = {
185
+ args,
186
+ customMethod: method
187
+ };
188
+ return createDerivativeSelectorWithFilter({ getSelector, SelectorBuilder, selectorFn, apiFn, filter, additionalDependencies });
189
+ };
190
+ }
191
+ else {
192
+ obj[prop] = (new client_function_builder_1.default((...args) => {
193
+ /* eslint-disable no-undef */
194
+ const node = selector();
195
+ return customMethod.apply(customMethod, [node].concat(args));
196
+ /* eslint-enable no-undef */
197
+ }, { dependencies }, callsiteNames)).getFunction();
198
+ }
199
+ });
200
+ }
201
+ exports.addCustomMethods = addCustomMethods;
202
+ function prepareSnapshotPropertyList(customDOMProperties) {
203
+ let properties = [...snapshot_properties_1.SNAPSHOT_PROPERTIES];
204
+ // NOTE: The 'visible' snapshot property has a separate handler.
205
+ lodash_1.pull(properties, VISIBLE_PROP_NAME);
206
+ if (customDOMProperties)
207
+ properties = properties.concat(Object.keys(customDOMProperties));
208
+ return properties;
209
+ }
210
+ function addSnapshotPropertyShorthands({ obj, getSelector, SelectorBuilder, customDOMProperties, customMethods, observedCallsites }) {
211
+ const properties = prepareSnapshotPropertyList(customDOMProperties);
212
+ addSnapshotProperties(obj, getSelector, SelectorBuilder, properties, observedCallsites);
213
+ addCustomMethods(obj, getSelector, SelectorBuilder, customMethods);
214
+ obj.getStyleProperty = prop => {
215
+ const callsite = get_callsite_1.getCallsiteForMethod('getStyleProperty');
216
+ if (selector_api_execution_mode_1.default.isSync) {
217
+ const snapshot = getSnapshotSync(getSelector, callsite, SelectorBuilder);
218
+ return snapshot.style ? snapshot.style[prop] : void 0;
219
+ }
220
+ return re_executable_promise_1.default.fromFn(async () => {
221
+ const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder);
222
+ return snapshot.style ? snapshot.style[prop] : void 0;
223
+ });
224
+ };
225
+ obj.getAttribute = attrName => {
226
+ const callsite = get_callsite_1.getCallsiteForMethod('getAttribute');
227
+ if (selector_api_execution_mode_1.default.isSync) {
228
+ const snapshot = getSnapshotSync(getSelector, callsite, SelectorBuilder);
229
+ return snapshot.attributes ? snapshot.attributes[attrName] : void 0;
230
+ }
231
+ return re_executable_promise_1.default.fromFn(async () => {
232
+ const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder);
233
+ return snapshot.attributes ? snapshot.attributes[attrName] : void 0;
234
+ });
235
+ };
236
+ obj.hasAttribute = attrName => {
237
+ const callsite = get_callsite_1.getCallsiteForMethod('hasAttribute');
238
+ if (selector_api_execution_mode_1.default.isSync) {
239
+ const snapshot = getSnapshotSync(getSelector, callsite, SelectorBuilder);
240
+ return snapshot.attributes ? snapshot.attributes.hasOwnProperty(attrName) : false;
241
+ }
242
+ return re_executable_promise_1.default.fromFn(async () => {
243
+ const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder);
244
+ return snapshot.attributes ? snapshot.attributes.hasOwnProperty(attrName) : false;
245
+ });
246
+ };
247
+ obj.getBoundingClientRectProperty = prop => {
248
+ const callsite = get_callsite_1.getCallsiteForMethod('getBoundingClientRectProperty');
249
+ if (selector_api_execution_mode_1.default.isSync) {
250
+ const snapshot = getSnapshotSync(getSelector, callsite, SelectorBuilder);
251
+ return snapshot.boundingClientRect ? snapshot.boundingClientRect[prop] : void 0;
252
+ }
253
+ return re_executable_promise_1.default.fromFn(async () => {
254
+ const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder);
255
+ return snapshot.boundingClientRect ? snapshot.boundingClientRect[prop] : void 0;
256
+ });
257
+ };
258
+ obj.hasClass = name => {
259
+ const callsite = get_callsite_1.getCallsiteForMethod('hasClass');
260
+ if (selector_api_execution_mode_1.default.isSync) {
261
+ const snapshot = getSnapshotSync(getSelector, callsite, SelectorBuilder);
262
+ return snapshot.classNames ? snapshot.classNames.includes(name) : false;
263
+ }
264
+ return re_executable_promise_1.default.fromFn(async () => {
265
+ const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder);
266
+ return snapshot.classNames ? snapshot.classNames.includes(name) : false;
267
+ });
268
+ };
269
+ }
270
+ function createCounter(getSelector, SelectorBuilder) {
271
+ const builder = new SelectorBuilder(getSelector(), { counterMode: true }, { instantiation: 'Selector' });
272
+ const counter = builder.getFunction();
273
+ const callsite = get_callsite_1.getCallsiteForMethod('get');
274
+ return async () => {
275
+ try {
276
+ return await counter();
277
+ }
278
+ catch (err) {
279
+ err.callsite = callsite;
280
+ throw err;
281
+ }
282
+ };
283
+ }
284
+ function createCounterSync(getSelector, SelectorBuilder) {
285
+ const builder = new SelectorBuilder(getSelector(), { counterMode: true }, { instantiation: 'Selector' });
286
+ const counter = builder.getFunction();
287
+ const callsite = get_callsite_1.getCallsiteForMethod('get');
288
+ return () => {
289
+ try {
290
+ return counter();
291
+ }
292
+ catch (err) {
293
+ err.callsite = callsite;
294
+ throw err;
295
+ }
296
+ };
297
+ }
298
+ function addCounterProperties({ obj, getSelector, SelectorBuilder }) {
299
+ Object.defineProperty(obj, 'count', {
300
+ get: () => {
301
+ if (selector_api_execution_mode_1.default.isSync)
302
+ return createCounterSync(getSelector, SelectorBuilder)();
303
+ const counter = createCounter(getSelector, SelectorBuilder);
304
+ return re_executable_promise_1.default.fromFn(() => counter());
305
+ }
306
+ });
307
+ Object.defineProperty(obj, 'exists', {
308
+ get: () => {
309
+ if (selector_api_execution_mode_1.default.isSync)
310
+ return createCounterSync(getSelector, SelectorBuilder)() > 0;
311
+ const counter = createCounter(getSelector, SelectorBuilder);
312
+ return re_executable_promise_1.default.fromFn(async () => await counter() > 0);
313
+ }
314
+ });
315
+ }
316
+ function convertFilterToClientFunctionIfNecessary(callsiteName, filter, dependencies) {
317
+ if (typeof filter === 'function') {
318
+ const builder = filter[builder_symbol_1.default];
319
+ const fn = builder ? builder.fn : filter;
320
+ const options = builder ? lodash_1.assign({}, builder.options, { dependencies }) : { dependencies };
321
+ return (new client_function_builder_1.default(fn, options, { instantiation: callsiteName })).getFunction();
322
+ }
323
+ return filter;
324
+ }
325
+ function createDerivativeSelectorWithFilter({ getSelector, SelectorBuilder, selectorFn, apiFn, filter, additionalDependencies }) {
326
+ const collectionModeSelectorBuilder = new SelectorBuilder(getSelector(), { collectionMode: true });
327
+ const customDOMProperties = collectionModeSelectorBuilder.options.customDOMProperties;
328
+ const customMethods = collectionModeSelectorBuilder.options.customMethods;
329
+ let dependencies = {
330
+ selector: collectionModeSelectorBuilder.getFunction(),
331
+ filter: filter,
332
+ filterNodes: filterNodes
333
+ };
334
+ const { boundTestRun, timeout, visibilityCheck, apiFnChain } = collectionModeSelectorBuilder.options;
335
+ dependencies = lodash_1.assign(dependencies, additionalDependencies);
336
+ const builder = new SelectorBuilder(selectorFn, {
337
+ dependencies,
338
+ customDOMProperties,
339
+ customMethods,
340
+ boundTestRun,
341
+ timeout,
342
+ visibilityCheck,
343
+ apiFnChain,
344
+ apiFn
345
+ }, { instantiation: 'Selector' });
346
+ return builder.getFunction();
347
+ }
348
+ const filterByText = convertFilterToClientFunctionIfNecessary('filter', selector_text_filter_1.default);
349
+ const filterByAttr = convertFilterToClientFunctionIfNecessary('filter', selector_attribute_filter_1.default);
350
+ function ensureRegExpContext(str) {
351
+ // NOTE: if a regexp is created in a separate context (via the 'vm' module) we
352
+ // should wrap it with new RegExp() to make the `instanceof RegExp` check successful.
353
+ if (typeof str !== 'string' && !(str instanceof RegExp))
354
+ return new RegExp(str);
355
+ return str;
356
+ }
357
+ function addFilterMethods(options) {
358
+ const { obj, getSelector, SelectorBuilder } = options;
359
+ obj.nth = index => {
360
+ type_assertions_1.assertType(type_assertions_1.is.number, 'nth', '"index" argument', index);
361
+ const apiFn = prepare_api_args_1.default('nth', index);
362
+ const builder = new SelectorBuilder(getSelector(), { index, apiFn }, { instantiation: 'Selector' });
363
+ return builder.getFunction();
364
+ };
365
+ obj.withText = text => {
366
+ type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.regExp], 'withText', '"text" argument', text);
367
+ const apiFn = prepare_api_args_1.default('withText', text);
368
+ text = ensureRegExpContext(text);
369
+ const selectorFn = () => {
370
+ /* eslint-disable no-undef */
371
+ const nodes = selector();
372
+ if (!nodes.length)
373
+ return null;
374
+ return filterNodes(nodes, filter, document, void 0, textRe);
375
+ /* eslint-enable no-undef */
376
+ };
377
+ const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filterByText, { textRe: make_reg_exp_1.default(text) });
378
+ return createDerivativeSelectorWithFilter(args);
379
+ };
380
+ obj.withExactText = text => {
381
+ type_assertions_1.assertType(type_assertions_1.is.string, 'withExactText', '"text" argument', text);
382
+ const selectorFn = () => {
383
+ /* eslint-disable no-undef */
384
+ const nodes = selector();
385
+ if (!nodes.length)
386
+ return null;
387
+ return filterNodes(nodes, filter, document, void 0, exactText);
388
+ /* eslint-enable no-undef */
389
+ };
390
+ const apiFn = prepare_api_args_1.default('withExactText', text);
391
+ const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filterByText, { exactText: text });
392
+ return createDerivativeSelectorWithFilter(args);
393
+ };
394
+ obj.withAttribute = (attrName, attrValue) => {
395
+ type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.regExp], 'withAttribute', '"attrName" argument', attrName);
396
+ const apiFn = prepare_api_args_1.default('withAttribute', attrName, attrValue);
397
+ attrName = ensureRegExpContext(attrName);
398
+ if (attrValue !== void 0) {
399
+ type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.regExp], 'withAttribute', '"attrValue" argument', attrValue);
400
+ attrValue = ensureRegExpContext(attrValue);
401
+ }
402
+ const selectorFn = () => {
403
+ /* eslint-disable no-undef */
404
+ const nodes = selector();
405
+ if (!nodes.length)
406
+ return null;
407
+ return filterNodes(nodes, filter, document, void 0, attrName, attrValue);
408
+ /* eslint-enable no-undef */
409
+ };
410
+ const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filterByAttr, {
411
+ attrName,
412
+ attrValue
413
+ });
414
+ return createDerivativeSelectorWithFilter(args);
415
+ };
416
+ obj.filter = (filter, dependencies) => {
417
+ type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function], 'filter', '"filter" argument', filter);
418
+ const apiFn = prepare_api_args_1.default('filter', filter);
419
+ filter = convertFilterToClientFunctionIfNecessary('filter', filter, dependencies);
420
+ const selectorFn = () => {
421
+ /* eslint-disable no-undef */
422
+ const nodes = selector();
423
+ if (!nodes.length)
424
+ return null;
425
+ return filterNodes(nodes, filter, document, void 0);
426
+ /* eslint-enable no-undef */
427
+ };
428
+ const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter);
429
+ return createDerivativeSelectorWithFilter(args);
430
+ };
431
+ obj.filterVisible = () => {
432
+ const apiFn = prepare_api_args_1.default('filterVisible');
433
+ const builder = new SelectorBuilder(getSelector(), { filterVisible: true, apiFn }, { instantiation: 'Selector' });
434
+ return builder.getFunction();
435
+ };
436
+ obj.filterHidden = () => {
437
+ const apiFn = prepare_api_args_1.default('filterHidden');
438
+ const builder = new SelectorBuilder(getSelector(), { filterHidden: true, apiFn }, { instantiation: 'Selector' });
439
+ return builder.getFunction();
440
+ };
441
+ }
442
+ function addCustomDOMPropertiesMethod({ obj, getSelector, SelectorBuilder }) {
443
+ obj.addCustomDOMProperties = customDOMProperties => {
444
+ assertAddCustomDOMPropertiesOptions(customDOMProperties);
445
+ const builder = new SelectorBuilder(getSelector(), { customDOMProperties }, { instantiation: 'Selector' });
446
+ return builder.getFunction();
447
+ };
448
+ }
449
+ function addCustomMethodsMethod({ obj, getSelector, SelectorBuilder }) {
450
+ obj.addCustomMethods = function (methods, opts) {
451
+ assertAddCustomMethods(methods, opts);
452
+ const customMethods = {};
453
+ Object.keys(methods).forEach(methodName => {
454
+ customMethods[methodName] = {
455
+ method: methods[methodName],
456
+ returnDOMNodes: opts && !!opts.returnDOMNodes
457
+ };
458
+ });
459
+ const builder = new SelectorBuilder(getSelector(), { customMethods }, { instantiation: 'Selector' });
460
+ return builder.getFunction();
461
+ };
462
+ }
463
+ function addHierarchicalSelectors(options) {
464
+ const { obj } = options;
465
+ // Find
466
+ obj.find = (filter, dependencies) => {
467
+ type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function], 'find', '"filter" argument', filter);
468
+ const apiFn = prepare_api_args_1.default('find', filter);
469
+ filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies);
470
+ const selectorFn = () => {
471
+ /* eslint-disable no-undef */
472
+ return expandSelectorResults(selector, node => {
473
+ if (typeof filter === 'string') {
474
+ return typeof node.querySelectorAll === 'function' ?
475
+ node.querySelectorAll(filter) :
476
+ null;
477
+ }
478
+ const results = [];
479
+ const visitNode = currentNode => {
480
+ const cnLength = currentNode.childNodes.length;
481
+ for (let i = 0; i < cnLength; i++) {
482
+ const child = currentNode.childNodes[i];
483
+ results.push(child);
484
+ visitNode(child);
485
+ }
486
+ };
487
+ visitNode(node);
488
+ return filterNodes(results, filter, null, node);
489
+ });
490
+ /* eslint-enable no-undef */
491
+ };
492
+ const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults });
493
+ return createDerivativeSelectorWithFilter(args);
494
+ };
495
+ // Parent
496
+ obj.parent = (filter, dependencies) => {
497
+ if (filter !== void 0)
498
+ type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'parent', '"filter" argument', filter);
499
+ const apiFn = prepare_api_args_1.default('parent', filter);
500
+ filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies);
501
+ const selectorFn = () => {
502
+ /* eslint-disable no-undef */
503
+ return expandSelectorResults(selector, node => {
504
+ const parents = [];
505
+ for (let parent = node.parentNode; parent; parent = parent.parentNode)
506
+ parents.push(parent);
507
+ return filter !== void 0 ? filterNodes(parents, filter, document, node) : parents;
508
+ });
509
+ /* eslint-enable no-undef */
510
+ };
511
+ const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults });
512
+ return createDerivativeSelectorWithFilter(args);
513
+ };
514
+ // Child
515
+ obj.child = (filter, dependencies) => {
516
+ if (filter !== void 0)
517
+ type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'child', '"filter" argument', filter);
518
+ const apiFn = prepare_api_args_1.default('child', filter);
519
+ filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies);
520
+ const selectorFn = () => {
521
+ /* eslint-disable no-undef */
522
+ return expandSelectorResults(selector, node => {
523
+ const childElements = [];
524
+ const cnLength = node.childNodes.length;
525
+ for (let i = 0; i < cnLength; i++) {
526
+ const child = node.childNodes[i];
527
+ if (child.nodeType === 1)
528
+ childElements.push(child);
529
+ }
530
+ return filter !== void 0 ? filterNodes(childElements, filter, node, node) : childElements;
531
+ });
532
+ /* eslint-enable no-undef */
533
+ };
534
+ const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults });
535
+ return createDerivativeSelectorWithFilter(args);
536
+ };
537
+ // Sibling
538
+ obj.sibling = (filter, dependencies) => {
539
+ if (filter !== void 0)
540
+ type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'sibling', '"filter" argument', filter);
541
+ const apiFn = prepare_api_args_1.default('sibling', filter);
542
+ filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies);
543
+ const selectorFn = () => {
544
+ /* eslint-disable no-undef */
545
+ return expandSelectorResults(selector, node => {
546
+ const parent = node.parentNode;
547
+ if (!parent)
548
+ return null;
549
+ const siblings = [];
550
+ const cnLength = parent.childNodes.length;
551
+ for (let i = 0; i < cnLength; i++) {
552
+ const child = parent.childNodes[i];
553
+ if (child.nodeType === 1 && child !== node)
554
+ siblings.push(child);
555
+ }
556
+ return filter !== void 0 ? filterNodes(siblings, filter, parent, node) : siblings;
557
+ });
558
+ /* eslint-enable no-undef */
559
+ };
560
+ const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults });
561
+ return createDerivativeSelectorWithFilter(args);
562
+ };
563
+ // Next sibling
564
+ obj.nextSibling = (filter, dependencies) => {
565
+ if (filter !== void 0)
566
+ type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'nextSibling', '"filter" argument', filter);
567
+ const apiFn = prepare_api_args_1.default('nextSibling', filter);
568
+ filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies);
569
+ const selectorFn = () => {
570
+ /* eslint-disable no-undef */
571
+ return expandSelectorResults(selector, node => {
572
+ const parent = node.parentNode;
573
+ if (!parent)
574
+ return null;
575
+ const siblings = [];
576
+ const cnLength = parent.childNodes.length;
577
+ let afterNode = false;
578
+ for (let i = 0; i < cnLength; i++) {
579
+ const child = parent.childNodes[i];
580
+ if (child === node)
581
+ afterNode = true;
582
+ else if (afterNode && child.nodeType === 1)
583
+ siblings.push(child);
584
+ }
585
+ return filter !== void 0 ? filterNodes(siblings, filter, parent, node) : siblings;
586
+ });
587
+ /* eslint-enable no-undef */
588
+ };
589
+ const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults });
590
+ return createDerivativeSelectorWithFilter(args);
591
+ };
592
+ // Prev sibling
593
+ obj.prevSibling = (filter, dependencies) => {
594
+ if (filter !== void 0)
595
+ type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'prevSibling', '"filter" argument', filter);
596
+ const apiFn = prepare_api_args_1.default('prevSibling', filter);
597
+ filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies);
598
+ const selectorFn = () => {
599
+ /* eslint-disable no-undef */
600
+ return expandSelectorResults(selector, node => {
601
+ const parent = node.parentNode;
602
+ if (!parent)
603
+ return null;
604
+ const siblings = [];
605
+ const cnLength = parent.childNodes.length;
606
+ for (let i = 0; i < cnLength; i++) {
607
+ const child = parent.childNodes[i];
608
+ if (child === node)
609
+ break;
610
+ if (child.nodeType === 1)
611
+ siblings.push(child);
612
+ }
613
+ return filter !== void 0 ? filterNodes(siblings, filter, parent, node) : siblings;
614
+ });
615
+ /* eslint-enable no-undef */
616
+ };
617
+ const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults });
618
+ return createDerivativeSelectorWithFilter(args);
619
+ };
620
+ // ShadowRoot
621
+ obj.shadowRoot = () => {
622
+ const apiFn = prepare_api_args_1.default('shadowRoot');
623
+ const selectorFn = () => {
624
+ /* eslint-disable no-undef */
625
+ return expandSelectorResults(selector, node => {
626
+ return !node.shadowRoot ? null : [node.shadowRoot];
627
+ });
628
+ /* eslint-enable no-undef */
629
+ };
630
+ const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, void 0, { expandSelectorResults });
631
+ return createDerivativeSelectorWithFilter(args);
632
+ };
633
+ }
634
+ function addAPI(selector, getSelector, SelectorBuilder, customDOMProperties, customMethods, observedCallsites, skipSnapshotProperties) {
635
+ const options = { obj: selector, getSelector, SelectorBuilder, customDOMProperties, customMethods, observedCallsites };
636
+ addFilterMethods(options);
637
+ addHierarchicalSelectors(options);
638
+ if (!skipSnapshotProperties)
639
+ addSnapshotPropertyShorthands(options);
640
+ addCustomDOMPropertiesMethod(options);
641
+ addCustomMethodsMethod(options);
642
+ addCounterProperties(options);
643
+ addVisibleProperty(options);
644
+ }
645
+ exports.addAPI = addAPI;
646
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbGllbnQtZnVuY3Rpb25zL3NlbGVjdG9ycy9hZGQtYXBpLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBZ0Q7QUFDaEQsdUVBQTREO0FBQzVELCtEQUE0RDtBQUM1RCw0REFBaUU7QUFDakUseUZBQStEO0FBQy9ELDhGQUFvRTtBQUNwRSwwRUFBc0U7QUFDdEUsNEVBQWtEO0FBQ2xELGtGQUF3RDtBQUN4RCw0RkFBa0U7QUFDbEUsMEVBQWtEO0FBQ2xELG1EQUFxRDtBQUNyRCxpR0FBc0U7QUFFdEUsTUFBTSxpQkFBaUIsR0FBUyxTQUFTLENBQUM7QUFDMUMsTUFBTSx1QkFBdUIsR0FBRyxXQUFXLCtCQUFtQixDQUFDLElBQUksR0FBRyxDQUFDO0FBRXZFLE1BQU0sV0FBVyxHQUFHLENBQUMsSUFBSSxpQ0FBcUIsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLEdBQUcsVUFBVSxFQUFFLEVBQUU7SUFDM0csSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7UUFDNUIsTUFBTSxZQUFZLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUvRSxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQzdDO0lBRUQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBRWxCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1FBQzVCLHlFQUF5RTtRQUN6RSxJQUFJLGlCQUFpQixDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksaUJBQWlCLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLEtBQUssRUFBRTtZQUN6RyxPQUFPLElBQUksQ0FBQztRQUVoQixNQUFNLFFBQVEsR0FBTSxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvRCxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFFdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1lBQ3BDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbEMsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUNuRDtJQUVELElBQUksT0FBTyxNQUFNLEtBQUssVUFBVSxFQUFFO1FBQzlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ25DLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLEdBQUcsVUFBVSxDQUFDO2dCQUM5QyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzdCO0tBQ0o7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBRWxCLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxJQUFJLGlDQUFxQixDQUFDLENBQUMsUUFBUSxFQUFFLHVCQUF1QixFQUFFLEVBQUU7SUFDM0YsTUFBTSxLQUFLLEdBQUcsUUFBUSxFQUFFLENBQUM7SUFFekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUM7SUFFaEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBRWxCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ25DLE1BQU0sZUFBZSxHQUFHLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTFELElBQUksZUFBZSxFQUFFO1lBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM3QyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztvQkFDdEMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN2QztTQUNKO0tBQ0o7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUVsQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBRWxCLEtBQUssVUFBVSxXQUFXLENBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsbUJBQW1CO0lBQ25GLElBQUksSUFBSSxHQUFTLElBQUksQ0FBQztJQUN0QixNQUFNLFFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRTNJLElBQUk7UUFDQSxJQUFJLEdBQUcsTUFBTSxRQUFRLEVBQUUsQ0FBQztLQUMzQjtJQUVELE9BQU8sR0FBRyxFQUFFO1FBQ1IsR0FBRyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFFeEIsTUFBTSxHQUFHLENBQUM7S0FDYjtJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxtQkFBbUI7SUFDakYsSUFBSSxJQUFJLEdBQVMsSUFBSSxDQUFDO0lBQ3RCLE1BQU0sUUFBUSxHQUFHLElBQUksZUFBZSxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFFM0ksSUFBSTtRQUNBLElBQUksR0FBRyxRQUFRLEVBQUUsQ0FBQztLQUNyQjtJQUVELE9BQU8sR0FBRyxFQUFFO1FBQ1IsR0FBRyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFFeEIsTUFBTSxHQUFHLENBQUM7S0FDYjtJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFTLG1DQUFtQyxDQUFFLFVBQVU7SUFDcEQsNEJBQVUsQ0FBQyxvQkFBRSxDQUFDLGFBQWEsRUFBRSx3QkFBd0IsRUFBRSxpQ0FBaUMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUV0RyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNuQyw0QkFBVSxDQUFDLG9CQUFFLENBQUMsUUFBUSxFQUFFLHdCQUF3QixFQUFFLGlDQUFpQyxJQUFJLEdBQUcsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNsSCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFFLFVBQVUsRUFBRSxJQUFJO0lBQzdDLDRCQUFVLENBQUMsb0JBQUUsQ0FBQyxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsMkJBQTJCLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFMUYsSUFBSSxJQUFJLEtBQUssS0FBSyxDQUFDO1FBQ2YsNEJBQVUsQ0FBQyxvQkFBRSxDQUFDLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSwyQkFBMkIsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUV4RixNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNuQyw0QkFBVSxDQUFDLG9CQUFFLENBQUMsUUFBUSxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixJQUFJLEdBQUcsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM3RixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRCxTQUFTLHlCQUF5QixDQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxzQkFBc0I7SUFDMUYsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxDQUFDLENBQUM7QUFDN0YsQ0FBQztBQUVELFNBQVMsNEJBQTRCLENBQUUsaUJBQWlCLEVBQUUsUUFBUTtJQUM5RCxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ3RCLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLGlCQUFpQixDQUFDO1FBRXJELElBQUksaUJBQWlCLElBQUksQ0FBQyxpQkFBaUI7WUFDdkMsaUJBQWlCLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRS9ELE9BQU8sdUJBQXVCLENBQUM7SUFDbkMsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQUVELFNBQVMsdUJBQXVCLENBQUUseUJBQXlCLEVBQUUsZUFBZTtJQUN4RSxNQUFNLFVBQVUsR0FBRyx3QkFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRWxELHNGQUFzRjtJQUN0RixvREFBb0Q7SUFDcEQsSUFBSSx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsSUFBSSx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPO1FBQ3RGLE9BQU8seUJBQXlCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakQscUZBQXFGO0lBQ3JGLG9GQUFvRjtTQUMvRSxJQUFJLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTztRQUM1Rix5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDOztRQUV0RSx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFFLGVBQWUsQ0FBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNuRyxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsaUJBQWlCO0lBQzVGLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDdEIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFO1lBQzdCLEdBQUcsRUFBRSxHQUFHLEVBQUU7Z0JBQ04sTUFBTSxRQUFRLEdBQUcsbUNBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRTdDLElBQUkscUNBQXdCLENBQUMsTUFBTTtvQkFDL0IsT0FBTyxlQUFlLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFekUsTUFBTSxlQUFlLEdBQUcsK0JBQW1CLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO29CQUMxRCxNQUFNLFFBQVEsR0FBRyxNQUFNLFdBQVcsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDO29CQUUzRSxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUIsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsTUFBTSxzQkFBc0IsR0FBRyw0QkFBNEIsQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFFekYsZUFBZSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxzQkFBc0IsQ0FBQztnQkFDN0QsZUFBZSxDQUFDLGNBQU8sQ0FBQyxNQUFNLENBQUMsR0FBTyxzQkFBc0IsQ0FBQztnQkFFN0QsZUFBZSxDQUFDLElBQUksR0FBRyxVQUFVLFdBQVcsRUFBRSxVQUFVO29CQUNwRCxJQUFJLGlCQUFpQjt3QkFDakIsdUJBQXVCLENBQUMsaUJBQWlCLENBQUMseUJBQXlCLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBRW5GLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO29CQUV4QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDM0QsQ0FBQyxDQUFDO2dCQUVGLE9BQU8sZUFBZSxDQUFDO1lBQzNCLENBQUM7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFFLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUU7SUFDOUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLEVBQUU7UUFDMUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtZQUNOLE1BQU0sUUFBUSxHQUFHLG1DQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTdDLElBQUkscUNBQXdCLENBQUMsTUFBTSxFQUFFO2dCQUNqQyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBRS9FLE9BQU8sQ0FBQyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQzthQUNwRDtZQUVELE9BQU8sK0JBQW1CLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUN6QyxNQUFNLFFBQVEsR0FBRyxNQUFNLFdBQVcsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFFakYsT0FBTyxDQUFDLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3JELENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztLQUNKLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxhQUFhO0lBQzlFLE1BQU0saUJBQWlCLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFFMUUsaUJBQWlCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQzdCLE1BQU0sRUFBRSxjQUFjLEdBQUcsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUvRCxNQUFNLFlBQVksR0FBRztZQUNqQixZQUFZLEVBQUUsTUFBTTtZQUNwQixRQUFRLEVBQU0sV0FBVyxFQUFFO1NBQzlCLENBQUM7UUFFRixNQUFNLGFBQWEsR0FBRyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUU5QyxJQUFJLGNBQWMsRUFBRTtZQUNoQixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFO2dCQUNwQixNQUFNLFVBQVUsR0FBRyxHQUFHLEVBQUU7b0JBQ3BCLDZCQUE2QjtvQkFDN0IsTUFBTSxLQUFLLEdBQUcsUUFBUSxFQUFFLENBQUM7b0JBRXpCLE9BQU8sWUFBWSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDOUQsNEJBQTRCO2dCQUNoQyxDQUFDLENBQUM7Z0JBRUYsTUFBTSxLQUFLLEdBQUcsMEJBQWdCLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQzlDLE1BQU0sTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztnQkFFMUIsTUFBTSxzQkFBc0IsR0FBRztvQkFDM0IsSUFBSTtvQkFDSixZQUFZLEVBQUUsTUFBTTtpQkFDdkIsQ0FBQztnQkFFRixPQUFPLGtDQUFrQyxDQUFDLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxDQUFDLENBQUM7WUFDbkksQ0FBQyxDQUFDO1NBQ0w7YUFDSTtZQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksaUNBQXFCLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFO2dCQUMvQyw2QkFBNkI7Z0JBQzdCLE1BQU0sSUFBSSxHQUFHLFFBQVEsRUFBRSxDQUFDO2dCQUV4QixPQUFPLFlBQVksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQzdELDRCQUE0QjtZQUNoQyxDQUFDLEVBQUUsRUFBRSxZQUFZLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3REO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBNUNELDRDQTRDQztBQUVELFNBQVMsMkJBQTJCLENBQUUsbUJBQW1CO0lBQ3JELElBQUksVUFBVSxHQUFHLENBQUMsR0FBRyx5Q0FBbUIsQ0FBQyxDQUFDO0lBRTFDLGdFQUFnRTtJQUNoRSxhQUFNLENBQUMsVUFBVSxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFFdEMsSUFBSSxtQkFBbUI7UUFDbkIsVUFBVSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFFckUsT0FBTyxVQUFVLENBQUM7QUFDdEIsQ0FBQztBQUVELFNBQVMsNkJBQTZCLENBQUUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUU7SUFDaEksTUFBTSxVQUFVLEdBQUcsMkJBQTJCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUVwRSxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUN4RixnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUVuRSxHQUFHLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEVBQUU7UUFDMUIsTUFBTSxRQUFRLEdBQUcsbUNBQW9CLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUUxRCxJQUFJLHFDQUF3QixDQUFDLE1BQU0sRUFBRTtZQUNqQyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUV6RSxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3pEO1FBRUQsT0FBTywrQkFBbUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDekMsTUFBTSxRQUFRLEdBQUcsTUFBTSxXQUFXLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUUzRSxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDO0lBRUYsR0FBRyxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsRUFBRTtRQUMxQixNQUFNLFFBQVEsR0FBRyxtQ0FBb0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV0RCxJQUFJLHFDQUF3QixDQUFDLE1BQU0sRUFBRTtZQUNqQyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUV6RSxPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3ZFO1FBRUQsT0FBTywrQkFBbUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDekMsTUFBTSxRQUFRLEdBQUcsTUFBTSxXQUFXLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUUzRSxPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hFLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDO0lBRUYsR0FBRyxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsRUFBRTtRQUMxQixNQUFNLFFBQVEsR0FBRyxtQ0FBb0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV0RCxJQUFJLHFDQUF3QixDQUFDLE1BQU0sRUFBRTtZQUNqQyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUV6RSxPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7U0FDckY7UUFFRCxPQUFPLCtCQUFtQixDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtZQUN6QyxNQUFNLFFBQVEsR0FBRyxNQUFNLFdBQVcsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBRTNFLE9BQU8sUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUN0RixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQztJQUVGLEdBQUcsQ0FBQyw2QkFBNkIsR0FBRyxJQUFJLENBQUMsRUFBRTtRQUN2QyxNQUFNLFFBQVEsR0FBRyxtQ0FBb0IsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBRXZFLElBQUkscUNBQXdCLENBQUMsTUFBTSxFQUFFO1lBQ2pDLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBRXpFLE9BQU8sUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25GO1FBRUQsT0FBTywrQkFBbUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDekMsTUFBTSxRQUFRLEdBQUcsTUFBTSxXQUFXLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUUzRSxPQUFPLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQztJQUVGLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUU7UUFDbEIsTUFBTSxRQUFRLEdBQUcsbUNBQW9CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFbEQsSUFBSSxxQ0FBd0IsQ0FBQyxNQUFNLEVBQUU7WUFDakMsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFFekUsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQzNFO1FBRUQsT0FBTywrQkFBbUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDekMsTUFBTSxRQUFRLEdBQUcsTUFBTSxXQUFXLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUUzRSxPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDNUUsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUM7QUFDTixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUUsV0FBVyxFQUFFLGVBQWU7SUFDaEQsTUFBTSxPQUFPLEdBQUksSUFBSSxlQUFlLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUMxRyxNQUFNLE9BQU8sR0FBSSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkMsTUFBTSxRQUFRLEdBQUcsbUNBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFN0MsT0FBTyxLQUFLLElBQUksRUFBRTtRQUNkLElBQUk7WUFDQSxPQUFPLE1BQU0sT0FBTyxFQUFFLENBQUM7U0FDMUI7UUFFRCxPQUFPLEdBQUcsRUFBRTtZQUNSLEdBQUcsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBQ3hCLE1BQU0sR0FBRyxDQUFDO1NBQ2I7SUFDTCxDQUFDLENBQUM7QUFDTixDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBRSxXQUFXLEVBQUUsZUFBZTtJQUNwRCxNQUFNLE9BQU8sR0FBSSxJQUFJLGVBQWUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzFHLE1BQU0sT0FBTyxHQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2QyxNQUFNLFFBQVEsR0FBRyxtQ0FBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU3QyxPQUFPLEdBQUcsRUFBRTtRQUNSLElBQUk7WUFDQSxPQUFPLE9BQU8sRUFBRSxDQUFDO1NBQ3BCO1FBRUQsT0FBTyxHQUFHLEVBQUU7WUFDUixHQUFHLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUN4QixNQUFNLEdBQUcsQ0FBQztTQUNiO0lBQ0wsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQUUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRTtJQUNoRSxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUU7UUFDaEMsR0FBRyxFQUFFLEdBQUcsRUFBRTtZQUNOLElBQUkscUNBQXdCLENBQUMsTUFBTTtnQkFDL0IsT0FBTyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUU3RCxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsV0FBVyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBRTVELE9BQU8sK0JBQW1CLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDdkQsQ0FBQztLQUNKLENBQUMsQ0FBQztJQUVILE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRTtRQUNqQyxHQUFHLEVBQUUsR0FBRyxFQUFFO1lBQ04sSUFBSSxxQ0FBd0IsQ0FBQyxNQUFNO2dCQUMvQixPQUFPLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUVqRSxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsV0FBVyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBRTVELE9BQU8sK0JBQW1CLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsTUFBTSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2RSxDQUFDO0tBQ0osQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVELFNBQVMsd0NBQXdDLENBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxZQUFZO0lBQ2pGLElBQUksT0FBTyxNQUFNLEtBQUssVUFBVSxFQUFFO1FBQzlCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyx3QkFBMkIsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sRUFBRSxHQUFRLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzlDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBTSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQztRQUUzRixPQUFPLENBQUMsSUFBSSxpQ0FBcUIsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztLQUNsRztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLGtDQUFrQyxDQUFFLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsRUFBRTtJQUM1SCxNQUFNLDZCQUE2QixHQUFHLElBQUksZUFBZSxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbkcsTUFBTSxtQkFBbUIsR0FBYSw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUM7SUFDaEcsTUFBTSxhQUFhLEdBQW1CLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7SUFFMUYsSUFBSSxZQUFZLEdBQUc7UUFDZixRQUFRLEVBQUssNkJBQTZCLENBQUMsV0FBVyxFQUFFO1FBQ3hELE1BQU0sRUFBTyxNQUFNO1FBQ25CLFdBQVcsRUFBRSxXQUFXO0tBQzNCLENBQUM7SUFFRixNQUFNLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLEdBQUcsNkJBQTZCLENBQUMsT0FBTyxDQUFDO0lBRXJHLFlBQVksR0FBRyxlQUFNLENBQUMsWUFBWSxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFFNUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxlQUFlLENBQUMsVUFBVSxFQUFFO1FBQzVDLFlBQVk7UUFDWixtQkFBbUI7UUFDbkIsYUFBYTtRQUNiLFlBQVk7UUFDWixPQUFPO1FBQ1AsZUFBZTtRQUNmLFVBQVU7UUFDVixLQUFLO0tBQ1IsRUFBRSxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBRWxDLE9BQU8sT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQ2pDLENBQUM7QUFFRCxNQUFNLFlBQVksR0FBRyx3Q0FBd0MsQ0FBQyxRQUFRLEVBQUUsOEJBQWtCLENBQUMsQ0FBQztBQUM1RixNQUFNLFlBQVksR0FBRyx3Q0FBd0MsQ0FBQyxRQUFRLEVBQUUsbUNBQXVCLENBQUMsQ0FBQztBQUVqRyxTQUFTLG1CQUFtQixDQUFFLEdBQUc7SUFDN0IsOEVBQThFO0lBQzlFLHFGQUFxRjtJQUNyRixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLE1BQU0sQ0FBQztRQUNuRCxPQUFPLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTNCLE9BQU8sR0FBRyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUUsT0FBTztJQUM5QixNQUFNLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFFdEQsR0FBRyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRTtRQUNkLDRCQUFVLENBQUMsb0JBQUUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhELE1BQU0sS0FBSyxHQUFLLDBCQUFnQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvQyxNQUFNLE9BQU8sR0FBRyxJQUFJLGVBQWUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRXBHLE9BQU8sT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2pDLENBQUMsQ0FBQztJQUVGLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUU7UUFDbEIsNEJBQVUsQ0FBQyxDQUFDLG9CQUFFLENBQUMsTUFBTSxFQUFFLG9CQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXhFLE1BQU0sS0FBSyxHQUFHLDBCQUFnQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVqRCxJQUFJLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFakMsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFO1lBQ3BCLDZCQUE2QjtZQUM3QixNQUFNLEtBQUssR0FBRyxRQUFRLEVBQUUsQ0FBQztZQUV6QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07Z0JBQ2IsT0FBTyxJQUFJLENBQUM7WUFFaEIsT0FBTyxXQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDNUQsNEJBQTRCO1FBQ2hDLENBQUMsQ0FBQztRQUVGLE1BQU0sSUFBSSxHQUFHLHlCQUF5QixDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxzQkFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUvRyxPQUFPLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BELENBQUMsQ0FBQztJQUVGLEdBQUcsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEVBQUU7UUFDdkIsNEJBQVUsQ0FBQyxvQkFBRSxDQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFaEUsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFO1lBQ3BCLDZCQUE2QjtZQUM3QixNQUFNLEtBQUssR0FBRyxRQUFRLEVBQUUsQ0FBQztZQUV6QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07Z0JBQ2IsT0FBTyxJQUFJLENBQUM7WUFFaEIsT0FBTyxXQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDL0QsNEJBQTRCO1FBQ2hDLENBQUMsQ0FBQztRQUVGLE1BQU0sS0FBSyxHQUFHLDBCQUFnQixDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0RCxNQUFNLElBQUksR0FBSSx5QkFBeUIsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUV2RyxPQUFPLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BELENBQUMsQ0FBQztJQUVGLEdBQUcsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLEVBQUU7UUFDeEMsNEJBQVUsQ0FBQyxDQUFDLG9CQUFFLENBQUMsTUFBTSxFQUFFLG9CQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsZUFBZSxFQUFFLHFCQUFxQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXJGLE1BQU0sS0FBSyxHQUFHLDBCQUFnQixDQUFDLGVBQWUsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFckUsUUFBUSxHQUFHLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXpDLElBQUksU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ3RCLDRCQUFVLENBQUMsQ0FBQyxvQkFBRSxDQUFDLE1BQU0sRUFBRSxvQkFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN2RixTQUFTLEdBQUcsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDOUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxHQUFHLEVBQUU7WUFDcEIsNkJBQTZCO1lBQzdCLE1BQU0sS0FBSyxHQUFHLFFBQVEsRUFBRSxDQUFDO1lBRXpCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtnQkFDYixPQUFPLElBQUksQ0FBQztZQUVoQixPQUFPLFdBQVcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDekUsNEJBQTRCO1FBQ2hDLENBQUMsQ0FBQztRQUVGLE1BQU0sSUFBSSxHQUFHLHlCQUF5QixDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRTtZQUM3RSxRQUFRO1lBQ1IsU0FBUztTQUNaLENBQUMsQ0FBQztRQUVILE9BQU8sa0NBQWtDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEQsQ0FBQyxDQUFDO0lBRUYsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsRUFBRTtRQUNsQyw0QkFBVSxDQUFDLENBQUMsb0JBQUUsQ0FBQyxNQUFNLEVBQUUsb0JBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFNUUsTUFBTSxLQUFLLEdBQUcsMEJBQWdCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRWpELE1BQU0sR0FBRyx3Q0FBd0MsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRWxGLE1BQU0sVUFBVSxHQUFHLEdBQUcsRUFBRTtZQUNwQiw2QkFBNkI7WUFDN0IsTUFBTSxLQUFLLEdBQUcsUUFBUSxFQUFFLENBQUM7WUFFekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO2dCQUNiLE9BQU8sSUFBSSxDQUFDO1lBRWhCLE9BQU8sV0FBVyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDcEQsNEJBQTRCO1FBQ2hDLENBQUMsQ0FBQztRQUdGLE1BQU0sSUFBSSxHQUFHLHlCQUF5QixDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTNFLE9BQU8sa0NBQWtDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEQsQ0FBQyxDQUFDO0lBRUYsR0FBRyxDQUFDLGFBQWEsR0FBRyxHQUFHLEVBQUU7UUFDckIsTUFBTSxLQUFLLEdBQUssMEJBQWdCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxlQUFlLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFbEgsT0FBTyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDakMsQ0FBQyxDQUFDO0lBRUYsR0FBRyxDQUFDLFlBQVksR0FBRyxHQUFHLEVBQUU7UUFDcEIsTUFBTSxLQUFLLEdBQUssMEJBQWdCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDakQsTUFBTSxPQUFPLEdBQUcsSUFBSSxlQUFlLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFakgsT0FBTyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDakMsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQUVELFNBQVMsNEJBQTRCLENBQUUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRTtJQUN4RSxHQUFHLENBQUMsc0JBQXNCLEdBQUcsbUJBQW1CLENBQUMsRUFBRTtRQUMvQyxtQ0FBbUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRXpELE1BQU0sT0FBTyxHQUFHLElBQUksZUFBZSxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsbUJBQW1CLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRTNHLE9BQU8sT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2pDLENBQUMsQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFFLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUU7SUFDbEUsR0FBRyxDQUFDLGdCQUFnQixHQUFHLFVBQVUsT0FBTyxFQUFFLElBQUk7UUFDMUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXRDLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUV6QixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN0QyxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUc7Z0JBQ3hCLE1BQU0sRUFBVSxPQUFPLENBQUMsVUFBVSxDQUFDO2dCQUNuQyxjQUFjLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYzthQUNoRCxDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLE9BQU8sR0FBRyxJQUFJLGVBQWUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFckcsT0FBTyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDakMsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQUVELFNBQVMsd0JBQXdCLENBQUUsT0FBTztJQUN0QyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBRXhCLE9BQU87SUFDUCxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxFQUFFO1FBQ2hDLDRCQUFVLENBQUMsQ0FBQyxvQkFBRSxDQUFDLE1BQU0sRUFBRSxvQkFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUxRSxNQUFNLEtBQUssR0FBRywwQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFL0MsTUFBTSxHQUFHLHdDQUF3QyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFaEYsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFO1lBQ3BCLDZCQUE2QjtZQUM3QixPQUFPLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDMUMsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7b0JBQzVCLE9BQU8sT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEtBQUssVUFBVSxDQUFDLENBQUM7d0JBQ2hELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO3dCQUMvQixJQUFJLENBQUM7aUJBQ1o7Z0JBRUQsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUVuQixNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsRUFBRTtvQkFDNUIsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7b0JBRS9DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQy9CLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBRXhDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBRXBCLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDcEI7Z0JBQ0wsQ0FBQyxDQUFDO2dCQUVGLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFaEIsT0FBTyxXQUFXLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEQsQ0FBQyxDQUFDLENBQUM7WUFDSCw0QkFBNEI7UUFDaEMsQ0FBQyxDQUFDO1FBRUYsTUFBTSxJQUFJLEdBQUcseUJBQXlCLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1FBRXRHLE9BQU8sa0NBQWtDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEQsQ0FBQyxDQUFDO0lBRUYsU0FBUztJQUNULEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLEVBQUU7UUFDbEMsSUFBSSxNQUFNLEtBQUssS0FBSyxDQUFDO1lBQ2pCLDRCQUFVLENBQUMsQ0FBQyxvQkFBRSxDQUFDLE1BQU0sRUFBRSxvQkFBRSxDQUFDLFFBQVEsRUFBRSxvQkFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUzRixNQUFNLEtBQUssR0FBRywwQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFakQsTUFBTSxHQUFHLHdDQUF3QyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFaEYsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFO1lBQ3BCLDZCQUE2QjtZQUM3QixPQUFPLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDMUMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUVuQixLQUFLLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVTtvQkFDakUsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFFekIsT0FBTyxNQUFNLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ3RGLENBQUMsQ0FBQyxDQUFDO1lBQ0gsNEJBQTRCO1FBQ2hDLENBQUMsQ0FBQztRQUVGLE1BQU0sSUFBSSxHQUFHLHlCQUF5QixDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLHFCQUFxQixFQUFFLENBQUMsQ0FBQztRQUV0RyxPQUFPLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BELENBQUMsQ0FBQztJQUVGLFFBQVE7SUFDUixHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxFQUFFO1FBQ2pDLElBQUksTUFBTSxLQUFLLEtBQUssQ0FBQztZQUNqQiw0QkFBVSxDQUFDLENBQUMsb0JBQUUsQ0FBQyxNQUFNLEVBQUUsb0JBQUUsQ0FBQyxRQUFRLEVBQUUsb0JBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFMUYsTUFBTSxLQUFLLEdBQUcsMEJBQWdCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRWhELE1BQU0sR0FBRyx3Q0FBd0MsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRWhGLE1BQU0sVUFBVSxHQUFHLEdBQUcsRUFBRTtZQUNwQiw2QkFBNkI7WUFDN0IsT0FBTyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQzFDLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxRQUFRLEdBQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7Z0JBRTdDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQy9CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBRWpDLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxDQUFDO3dCQUNwQixhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNqQztnQkFFRCxPQUFPLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFDOUYsQ0FBQyxDQUFDLENBQUM7WUFDSCw0QkFBNEI7UUFDaEMsQ0FBQyxDQUFDO1FBRUYsTUFBTSxJQUFJLEdBQUcseUJBQXlCLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1FBRXRHLE9BQU8sa0NBQWtDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEQsQ0FBQyxDQUFDO0lBRUYsVUFBVTtJQUNWLEdBQUcsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLEVBQUU7UUFDbkMsSUFBSSxNQUFNLEtBQUssS0FBSyxDQUFDO1lBQ2pCLDRCQUFVLENBQUMsQ0FBQyxvQkFBRSxDQUFDLE1BQU0sRUFBRSxvQkFBRSxDQUFDLFFBQVEsRUFBRSxvQkFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUU1RixNQUFNLEtBQUssR0FBRywwQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFbEQsTUFBTSxHQUFHLHdDQUF3QyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFaEYsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFO1lBQ3BCLDZCQUE2QjtZQUM3QixPQUFPLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFFL0IsSUFBSSxDQUFDLE1BQU07b0JBQ1AsT0FBTyxJQUFJLENBQUM7Z0JBRWhCLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7Z0JBRTFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQy9CLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBRW5DLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLElBQUk7d0JBQ3RDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzVCO2dCQUVELE9BQU8sTUFBTSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUN0RixDQUFDLENBQUMsQ0FBQztZQUNILDRCQUE0QjtRQUNoQyxDQUFDLENBQUM7UUFFRixNQUFNLElBQUksR0FBRyx5QkFBeUIsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7UUFFdEcsT0FBTyxrQ0FBa0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwRCxDQUFDLENBQUM7SUFFRixlQUFlO0lBQ2YsR0FBRyxDQUFDLFdBQVcsR0FBRyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsRUFBRTtRQUN2QyxJQUFJLE1BQU0sS0FBSyxLQUFLLENBQUM7WUFDakIsNEJBQVUsQ0FBQyxDQUFDLG9CQUFFLENBQUMsTUFBTSxFQUFFLG9CQUFFLENBQUMsUUFBUSxFQUFFLG9CQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRWhHLE1BQU0sS0FBSyxHQUFHLDBCQUFnQixDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV0RCxNQUFNLEdBQUcsd0NBQXdDLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUVoRixNQUFNLFVBQVUsR0FBRyxHQUFHLEVBQUU7WUFDcEIsNkJBQTZCO1lBQzdCLE9BQU8scUJBQXFCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUMxQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUUvQixJQUFJLENBQUMsTUFBTTtvQkFDUCxPQUFPLElBQUksQ0FBQztnQkFFaEIsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO2dCQUNwQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztnQkFDMUMsSUFBSSxTQUFTLEdBQUksS0FBSyxDQUFDO2dCQUV2QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUMvQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUVuQyxJQUFJLEtBQUssS0FBSyxJQUFJO3dCQUNkLFNBQVMsR0FBRyxJQUFJLENBQUM7eUJBRWhCLElBQUksU0FBUyxJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssQ0FBQzt3QkFDdEMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDNUI7Z0JBRUQsT0FBTyxNQUFNLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3RGLENBQUMsQ0FBQyxDQUFDO1lBQ0gsNEJBQTRCO1FBQ2hDLENBQUMsQ0FBQztRQUVGLE1BQU0sSUFBSSxHQUFHLHlCQUF5QixDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLHFCQUFxQixFQUFFLENBQUMsQ0FBQztRQUV0RyxPQUFPLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BELENBQUMsQ0FBQztJQUVGLGVBQWU7SUFDZixHQUFHLENBQUMsV0FBVyxHQUFHLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxFQUFFO1FBQ3ZDLElBQUksTUFBTSxLQUFLLEtBQUssQ0FBQztZQUNqQiw0QkFBVSxDQUFDLENBQUMsb0JBQUUsQ0FBQyxNQUFNLEVBQUUsb0JBQUUsQ0FBQyxRQUFRLEVBQUUsb0JBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFaEcsTUFBTSxLQUFLLEdBQUcsMEJBQWdCLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXRELE1BQU0sR0FBRyx3Q0FBd0MsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRWhGLE1BQU0sVUFBVSxHQUFHLEdBQUcsRUFBRTtZQUNwQiw2QkFBNkI7WUFDN0IsT0FBTyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQzFDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBRS9CLElBQUksQ0FBQyxNQUFNO29CQUNQLE9BQU8sSUFBSSxDQUFDO2dCQUVoQixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO2dCQUUxQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUMvQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUVuQyxJQUFJLEtBQUssS0FBSyxJQUFJO3dCQUNkLE1BQU07b0JBRVYsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLENBQUM7d0JBQ3BCLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzVCO2dCQUVELE9BQU8sTUFBTSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUN0RixDQUFDLENBQUMsQ0FBQztZQUNILDRCQUE0QjtRQUNoQyxDQUFDLENBQUM7UUFFRixNQUFNLElBQUksR0FBRyx5QkFBeUIsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7UUFFdEcsT0FBTyxrQ0FBa0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwRCxDQUFDLENBQUM7SUFFRixhQUFhO0lBQ2IsR0FBRyxDQUFDLFVBQVUsR0FBRyxHQUFHLEVBQUU7UUFDbEIsTUFBTSxLQUFLLEdBQUcsMEJBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFN0MsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFO1lBQ3BCLDZCQUE2QjtZQUM3QixPQUFPLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDMUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdkQsQ0FBQyxDQUFDLENBQUM7WUFDSCw0QkFBNEI7UUFDaEMsQ0FBQyxDQUFDO1FBRUYsTUFBTSxJQUFJLEdBQUcseUJBQXlCLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7UUFFdEcsT0FBTyxrQ0FBa0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwRCxDQUFDLENBQUM7QUFDTixDQUFDO0FBRUQsU0FBZ0IsTUFBTSxDQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxzQkFBc0I7SUFDekksTUFBTSxPQUFPLEdBQUcsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLENBQUM7SUFFdkgsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUIsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFbEMsSUFBSSxDQUFDLHNCQUFzQjtRQUN2Qiw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUUzQyw0QkFBNEIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QixrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBYkQsd0JBYUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbnNwZWN0IH0gZnJvbSAndXRpbCc7XG5pbXBvcnQgeyBhc3NpZ24sIHB1bGwgYXMgcmVtb3ZlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBjbGllbnRGdW5jdGlvbkJ1aWxkZXJTeW1ib2wgZnJvbSAnLi4vYnVpbGRlci1zeW1ib2wnO1xuaW1wb3J0IHsgU05BUFNIT1RfUFJPUEVSVElFUyB9IGZyb20gJy4vc25hcHNob3QtcHJvcGVydGllcyc7XG5pbXBvcnQgeyBnZXRDYWxsc2l0ZUZvck1ldGhvZCB9IGZyb20gJy4uLy4uL2Vycm9ycy9nZXQtY2FsbHNpdGUnO1xuaW1wb3J0IENsaWVudEZ1bmN0aW9uQnVpbGRlciBmcm9tICcuLi9jbGllbnQtZnVuY3Rpb24tYnVpbGRlcic7XG5pbXBvcnQgUmVFeGVjdXRhYmxlUHJvbWlzZSBmcm9tICcuLi8uLi91dGlscy9yZS1leGVjdXRhYmxlLXByb21pc2UnO1xuaW1wb3J0IHsgYXNzZXJ0VHlwZSwgaXMgfSBmcm9tICcuLi8uLi9lcnJvcnMvcnVudGltZS90eXBlLWFzc2VydGlvbnMnO1xuaW1wb3J0IG1ha2VSZWdFeHAgZnJvbSAnLi4vLi4vdXRpbHMvbWFrZS1yZWctZXhwJztcbmltcG9ydCBzZWxlY3RvclRleHRGaWx0ZXIgZnJvbSAnLi9zZWxlY3Rvci10ZXh0LWZpbHRlcic7XG5pbXBvcnQgc2VsZWN0b3JBdHRyaWJ1dGVGaWx0ZXIgZnJvbSAnLi9zZWxlY3Rvci1hdHRyaWJ1dGUtZmlsdGVyJztcbmltcG9ydCBwcmVwYXJlQXBpRm5BcmdzIGZyb20gJy4vcHJlcGFyZS1hcGktYXJncyc7XG5pbXBvcnQgeyBnZXRDYWxsc2l0ZUlkIH0gZnJvbSAnLi4vLi4vdXRpbHMvY2FsbHNpdGUnO1xuaW1wb3J0IHNlbGVjdG9yQXBpRXhlY3V0aW9uTW9kZSBmcm9tICcuLi9zZWxlY3Rvci1hcGktZXhlY3V0aW9uLW1vZGUnO1xuXG5jb25zdCBWSVNJQkxFX1BST1BfTkFNRSAgICAgICA9ICd2aXNpYmxlJztcbmNvbnN0IFNOQVBTSE9UX1BST1BfUFJJTUlUSVZFID0gYFtvYmplY3QgJHtSZUV4ZWN1dGFibGVQcm9taXNlLm5hbWV9XWA7XG5cbmNvbnN0IGZpbHRlck5vZGVzID0gKG5ldyBDbGllbnRGdW5jdGlvbkJ1aWxkZXIoKG5vZGVzLCBmaWx0ZXIsIHF1ZXJ5U2VsZWN0b3JSb290LCBvcmlnaW5Ob2RlLCAuLi5maWx0ZXJBcmdzKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nTm9kZSA9IGZpbHRlciA8IDAgPyBub2Rlc1tub2Rlcy5sZW5ndGggKyBmaWx0ZXJdIDogbm9kZXNbZmlsdGVyXTtcblxuICAgICAgICByZXR1cm4gbWF0Y2hpbmdOb2RlID8gW21hdGNoaW5nTm9kZV0gOiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBOT1RFOiB3ZSBjYW4gc2VhcmNoIGZvciBlbGVtZW50cyBvbmx5IGluIGRvY3VtZW50L2VsZW1lbnQvc2hhZG93IHJvb3QuXG4gICAgICAgIGlmIChxdWVyeVNlbGVjdG9yUm9vdC5ub2RlVHlwZSAhPT0gMSAmJiBxdWVyeVNlbGVjdG9yUm9vdC5ub2RlVHlwZSAhPT0gOSAmJiBxdWVyeVNlbGVjdG9yUm9vdC5ub2RlVHlwZSAhPT0gMTEpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBtYXRjaGluZyAgICA9IHF1ZXJ5U2VsZWN0b3JSb290LnF1ZXJ5U2VsZWN0b3JBbGwoZmlsdGVyKTtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdBcnIgPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoaW5nLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgbWF0Y2hpbmdBcnIucHVzaChtYXRjaGluZ1tpXSk7XG5cbiAgICAgICAgZmlsdGVyID0gbm9kZSA9PiBtYXRjaGluZ0Fyci5pbmRleE9mKG5vZGUpID4gLTE7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBub2Rlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKGZpbHRlcihub2Rlc1tqXSwgaiwgb3JpZ2luTm9kZSwgLi4uZmlsdGVyQXJncykpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobm9kZXNbal0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn0pKS5nZXRGdW5jdGlvbigpO1xuXG5jb25zdCBleHBhbmRTZWxlY3RvclJlc3VsdHMgPSAobmV3IENsaWVudEZ1bmN0aW9uQnVpbGRlcigoc2VsZWN0b3IsIHBvcHVsYXRlRGVyaXZhdGl2ZU5vZGVzKSA9PiB7XG4gICAgY29uc3Qgbm9kZXMgPSBzZWxlY3RvcigpO1xuXG4gICAgaWYgKCFub2Rlcy5sZW5ndGgpXG4gICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRlcml2YXRpdmVOb2RlcyA9IHBvcHVsYXRlRGVyaXZhdGl2ZU5vZGVzKG5vZGVzW2ldKTtcblxuICAgICAgICBpZiAoZGVyaXZhdGl2ZU5vZGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGRlcml2YXRpdmVOb2Rlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaW5kZXhPZihkZXJpdmF0aXZlTm9kZXNbal0pIDwgMClcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZGVyaXZhdGl2ZU5vZGVzW2pdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG5cbn0pKS5nZXRGdW5jdGlvbigpO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRTbmFwc2hvdCAoZ2V0U2VsZWN0b3IsIGNhbGxzaXRlLCBTZWxlY3RvckJ1aWxkZXIsIGdldFZpc2libGVWYWx1ZU1vZGUpIHtcbiAgICBsZXQgbm9kZSAgICAgICA9IG51bGw7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBuZXcgU2VsZWN0b3JCdWlsZGVyKGdldFNlbGVjdG9yKCksIHsgZ2V0VmlzaWJsZVZhbHVlTW9kZSwgbmVlZEVycm9yOiB0cnVlIH0sIHsgaW5zdGFudGlhdGlvbjogJ1NlbGVjdG9yJyB9KS5nZXRGdW5jdGlvbigpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgbm9kZSA9IGF3YWl0IHNlbGVjdG9yKCk7XG4gICAgfVxuXG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBlcnIuY2FsbHNpdGUgPSBjYWxsc2l0ZTtcblxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGdldFNuYXBzaG90U3luYyAoZ2V0U2VsZWN0b3IsIGNhbGxzaXRlLCBTZWxlY3RvckJ1aWxkZXIsIGdldFZpc2libGVWYWx1ZU1vZGUpIHtcbiAgICBsZXQgbm9kZSAgICAgICA9IG51bGw7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBuZXcgU2VsZWN0b3JCdWlsZGVyKGdldFNlbGVjdG9yKCksIHsgZ2V0VmlzaWJsZVZhbHVlTW9kZSwgbmVlZEVycm9yOiB0cnVlIH0sIHsgaW5zdGFudGlhdGlvbjogJ1NlbGVjdG9yJyB9KS5nZXRGdW5jdGlvbigpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgbm9kZSA9IHNlbGVjdG9yKCk7XG4gICAgfVxuXG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBlcnIuY2FsbHNpdGUgPSBjYWxsc2l0ZTtcblxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGFzc2VydEFkZEN1c3RvbURPTVByb3BlcnRpZXNPcHRpb25zIChwcm9wZXJ0aWVzKSB7XG4gICAgYXNzZXJ0VHlwZShpcy5ub25OdWxsT2JqZWN0LCAnYWRkQ3VzdG9tRE9NUHJvcGVydGllcycsICdcImFkZEN1c3RvbURPTVByb3BlcnRpZXNcIiBvcHRpb24nLCBwcm9wZXJ0aWVzKTtcblxuICAgIE9iamVjdC5rZXlzKHByb3BlcnRpZXMpLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgIGFzc2VydFR5cGUoaXMuZnVuY3Rpb24sICdhZGRDdXN0b21ET01Qcm9wZXJ0aWVzJywgYEN1c3RvbSBET00gcHJvcGVydGllcyBtZXRob2QgJyR7cHJvcH0nYCwgcHJvcGVydGllc1twcm9wXSk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydEFkZEN1c3RvbU1ldGhvZHMgKHByb3BlcnRpZXMsIG9wdHMpIHtcbiAgICBhc3NlcnRUeXBlKGlzLm5vbk51bGxPYmplY3QsICdhZGRDdXN0b21NZXRob2RzJywgJ1wiYWRkQ3VzdG9tTWV0aG9kc1wiIG9wdGlvbicsIHByb3BlcnRpZXMpO1xuXG4gICAgaWYgKG9wdHMgIT09IHZvaWQgMClcbiAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OdWxsT2JqZWN0LCAnYWRkQ3VzdG9tTWV0aG9kcycsICdcImFkZEN1c3RvbU1ldGhvZHNcIiBvcHRpb24nLCBvcHRzKTtcblxuICAgIE9iamVjdC5rZXlzKHByb3BlcnRpZXMpLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgIGFzc2VydFR5cGUoaXMuZnVuY3Rpb24sICdhZGRDdXN0b21NZXRob2RzJywgYEN1c3RvbSBtZXRob2QgJyR7cHJvcH0nYCwgcHJvcGVydGllc1twcm9wXSk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldERlcml2YXRpdmVTZWxlY3RvckFyZ3MgKG9wdGlvbnMsIHNlbGVjdG9yRm4sIGFwaUZuLCBmaWx0ZXIsIGFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywgeyBzZWxlY3RvckZuLCBhcGlGbiwgZmlsdGVyLCBhZGRpdGlvbmFsRGVwZW5kZW5jaWVzIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQcmltaXRpdmVHZXR0ZXJXcmFwcGVyIChvYnNlcnZlZENhbGxzaXRlcywgY2FsbHNpdGUpIHtcbiAgICByZXR1cm4gKGRlcHRoLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzVGVzdENhZmVJbnNwZWN0ID0gb3B0aW9ucz8uaXNUZXN0Q2FmZUluc3BlY3Q7XG5cbiAgICAgICAgaWYgKG9ic2VydmVkQ2FsbHNpdGVzICYmICFpc1Rlc3RDYWZlSW5zcGVjdClcbiAgICAgICAgICAgIG9ic2VydmVkQ2FsbHNpdGVzLnVuYXdhaXRlZFNuYXBzaG90Q2FsbHNpdGVzLmFkZChjYWxsc2l0ZSk7XG5cbiAgICAgICAgcmV0dXJuIFNOQVBTSE9UX1BST1BfUFJJTUlUSVZFO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGNoZWNrRm9yRXhjZXNzaXZlQXdhaXRzIChzbmFwc2hvdFByb3BlcnR5Q2FsbHNpdGVzLCBjaGVja2VkQ2FsbHNpdGUpIHtcbiAgICBjb25zdCBjYWxsc2l0ZUlkID0gZ2V0Q2FsbHNpdGVJZChjaGVja2VkQ2FsbHNpdGUpO1xuXG4gICAgLy8gTk9URTogSWYgdGhlcmUgaXMgYW4gYXNzZXJ0ZWQgY2FsbHNpdGUsIGl0IG1lYW5zIHRoYXQgLmV4cGVjdCgpIHdhcyBhbHJlYWR5IGNhbGxlZC5cbiAgICAvLyBXZSBkb24ndCByYWlzZSBhIHdhcm5pbmcgYW5kIGRlbGV0ZSB0aGUgY2FsbHNpdGUuXG4gICAgaWYgKHNuYXBzaG90UHJvcGVydHlDYWxsc2l0ZXNbY2FsbHNpdGVJZF0gJiYgc25hcHNob3RQcm9wZXJ0eUNhbGxzaXRlc1tjYWxsc2l0ZUlkXS5jaGVja2VkKVxuICAgICAgICBkZWxldGUgc25hcHNob3RQcm9wZXJ0eUNhbGxzaXRlc1tjYWxsc2l0ZUlkXTtcbiAgICAvLyBOT1RFOiBJZiB0aGUgY2FsbGlzdGUgYWxyZWFkeSBleGlzdHMsIGJ1dCBpcyBub3QgYXNzZXJ0ZWQsIGl0IG1lYW5zIHRoYXQgdGhlcmUgYXJlXG4gICAgLy8gbXVsdGlwbGUgYXdhaXRlZCBjYWxsc2l0ZXMgaW4gb25lIGFzc2VydGlvbi4gV2UgcmFpc2UgYSB3YXJuaW5nIGZvciBlYWNoIG9mIHRoZW0uXG4gICAgZWxzZSBpZiAoc25hcHNob3RQcm9wZXJ0eUNhbGxzaXRlc1tjYWxsc2l0ZUlkXSAmJiAhc25hcHNob3RQcm9wZXJ0eUNhbGxzaXRlc1tjYWxsc2l0ZUlkXS5jaGVja2VkKVxuICAgICAgICBzbmFwc2hvdFByb3BlcnR5Q2FsbHNpdGVzW2NhbGxzaXRlSWRdLmNhbGxzaXRlcy5wdXNoKGNoZWNrZWRDYWxsc2l0ZSk7XG4gICAgZWxzZVxuICAgICAgICBzbmFwc2hvdFByb3BlcnR5Q2FsbHNpdGVzW2NhbGxzaXRlSWRdID0geyBjYWxsc2l0ZXM6IFsgY2hlY2tlZENhbGxzaXRlIF0sIGNoZWNrZWQ6IGZhbHNlIH07XG59XG5cbmZ1bmN0aW9uIGFkZFNuYXBzaG90UHJvcGVydGllcyAob2JqLCBnZXRTZWxlY3RvciwgU2VsZWN0b3JCdWlsZGVyLCBwcm9wZXJ0aWVzLCBvYnNlcnZlZENhbGxzaXRlcykge1xuICAgIHByb3BlcnRpZXMuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwge1xuICAgICAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FsbHNpdGUgPSBnZXRDYWxsc2l0ZUZvck1ldGhvZCgnZ2V0Jyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JBcGlFeGVjdXRpb25Nb2RlLmlzU3luYylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNuYXBzaG90U3luYyhnZXRTZWxlY3RvciwgY2FsbHNpdGUsIFNlbGVjdG9yQnVpbGRlcilbcHJvcF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eVByb21pc2UgPSBSZUV4ZWN1dGFibGVQcm9taXNlLmZyb21Gbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZ2V0U25hcHNob3QoZ2V0U2VsZWN0b3IsIGNhbGxzaXRlLCBTZWxlY3RvckJ1aWxkZXIpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzbmFwc2hvdFtwcm9wXTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHByaW1pdGl2ZUdldHRlcldyYXBwZXIgPSBjcmVhdGVQcmltaXRpdmVHZXR0ZXJXcmFwcGVyKG9ic2VydmVkQ2FsbHNpdGVzLCBjYWxsc2l0ZSk7XG5cbiAgICAgICAgICAgICAgICBwcm9wZXJ0eVByb21pc2VbU3ltYm9sLnRvUHJpbWl0aXZlXSA9IHByaW1pdGl2ZUdldHRlcldyYXBwZXI7XG4gICAgICAgICAgICAgICAgcHJvcGVydHlQcm9taXNlW2luc3BlY3QuY3VzdG9tXSAgICAgPSBwcmltaXRpdmVHZXR0ZXJXcmFwcGVyO1xuXG4gICAgICAgICAgICAgICAgcHJvcGVydHlQcm9taXNlLnRoZW4gPSBmdW5jdGlvbiAob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9ic2VydmVkQ2FsbHNpdGVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tGb3JFeGNlc3NpdmVBd2FpdHMob2JzZXJ2ZWRDYWxsc2l0ZXMuc25hcHNob3RQcm9wZXJ0eUNhbGxzaXRlcywgY2FsbHNpdGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Vuc3VyZUV4ZWN1dGluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90YXNrUHJvbWlzZS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5UHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZFZpc2libGVQcm9wZXJ0eSAoeyBvYmosIGdldFNlbGVjdG9yLCBTZWxlY3RvckJ1aWxkZXIgfSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIFZJU0lCTEVfUFJPUF9OQU1FLCB7XG4gICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2FsbHNpdGUgPSBnZXRDYWxsc2l0ZUZvck1ldGhvZCgnZ2V0Jyk7XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RvckFwaUV4ZWN1dGlvbk1vZGUuaXNTeW5jKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc25hcHNob3QgPSBnZXRTbmFwc2hvdFN5bmMoZ2V0U2VsZWN0b3IsIGNhbGxzaXRlLCBTZWxlY3RvckJ1aWxkZXIsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuICEhc25hcHNob3QgJiYgc25hcHNob3RbVklTSUJMRV9QUk9QX05BTUVdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gUmVFeGVjdXRhYmxlUHJvbWlzZS5mcm9tRm4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZ2V0U25hcHNob3QoZ2V0U2VsZWN0b3IsIGNhbGxzaXRlLCBTZWxlY3RvckJ1aWxkZXIsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuICEhc25hcHNob3QgJiYgc25hcHNob3RbVklTSUJMRV9QUk9QX05BTUVdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEN1c3RvbU1ldGhvZHMgKG9iaiwgZ2V0U2VsZWN0b3IsIFNlbGVjdG9yQnVpbGRlciwgY3VzdG9tTWV0aG9kcykge1xuICAgIGNvbnN0IGN1c3RvbU1ldGhvZFByb3BzID0gY3VzdG9tTWV0aG9kcyA/IE9iamVjdC5rZXlzKGN1c3RvbU1ldGhvZHMpIDogW107XG5cbiAgICBjdXN0b21NZXRob2RQcm9wcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICBjb25zdCB7IHJldHVybkRPTU5vZGVzID0gZmFsc2UsIG1ldGhvZCB9ID0gY3VzdG9tTWV0aG9kc1twcm9wXTtcblxuICAgICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7XG4gICAgICAgICAgICBjdXN0b21NZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgIHNlbGVjdG9yOiAgICAgZ2V0U2VsZWN0b3IoKVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGNhbGxzaXRlTmFtZXMgPSB7IGluc3RhbnRpYXRpb246IHByb3AgfTtcblxuICAgICAgICBpZiAocmV0dXJuRE9NTm9kZXMpIHtcbiAgICAgICAgICAgIG9ialtwcm9wXSA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3JGbiA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBzZWxlY3RvcigpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXN0b21NZXRob2QuYXBwbHkoY3VzdG9tTWV0aG9kLCBbbm9kZXNdLmNvbmNhdChhcmdzKSk7XG4gICAgICAgICAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW5kZWYgKi9cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYXBpRm4gPSBwcmVwYXJlQXBpRm5BcmdzKHByb3AsIC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9ICgpID0+IHRydWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsRGVwZW5kZW5jaWVzID0ge1xuICAgICAgICAgICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgICAgICAgICBjdXN0b21NZXRob2Q6IG1ldGhvZFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlRGVyaXZhdGl2ZVNlbGVjdG9yV2l0aEZpbHRlcih7IGdldFNlbGVjdG9yLCBTZWxlY3RvckJ1aWxkZXIsIHNlbGVjdG9yRm4sIGFwaUZuLCBmaWx0ZXIsIGFkZGl0aW9uYWxEZXBlbmRlbmNpZXMgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb2JqW3Byb3BdID0gKG5ldyBDbGllbnRGdW5jdGlvbkJ1aWxkZXIoKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBzZWxlY3RvcigpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbU1ldGhvZC5hcHBseShjdXN0b21NZXRob2QsIFtub2RlXS5jb25jYXQoYXJncykpO1xuICAgICAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW5kZWYgKi9cbiAgICAgICAgICAgIH0sIHsgZGVwZW5kZW5jaWVzIH0sIGNhbGxzaXRlTmFtZXMpKS5nZXRGdW5jdGlvbigpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVTbmFwc2hvdFByb3BlcnR5TGlzdCAoY3VzdG9tRE9NUHJvcGVydGllcykge1xuICAgIGxldCBwcm9wZXJ0aWVzID0gWy4uLlNOQVBTSE9UX1BST1BFUlRJRVNdO1xuXG4gICAgLy8gTk9URTogVGhlICd2aXNpYmxlJyBzbmFwc2hvdCBwcm9wZXJ0eSBoYXMgYSBzZXBhcmF0ZSBoYW5kbGVyLlxuICAgIHJlbW92ZShwcm9wZXJ0aWVzLCBWSVNJQkxFX1BST1BfTkFNRSk7XG5cbiAgICBpZiAoY3VzdG9tRE9NUHJvcGVydGllcylcbiAgICAgICAgcHJvcGVydGllcyA9IHByb3BlcnRpZXMuY29uY2F0KE9iamVjdC5rZXlzKGN1c3RvbURPTVByb3BlcnRpZXMpKTtcblxuICAgIHJldHVybiBwcm9wZXJ0aWVzO1xufVxuXG5mdW5jdGlvbiBhZGRTbmFwc2hvdFByb3BlcnR5U2hvcnRoYW5kcyAoeyBvYmosIGdldFNlbGVjdG9yLCBTZWxlY3RvckJ1aWxkZXIsIGN1c3RvbURPTVByb3BlcnRpZXMsIGN1c3RvbU1ldGhvZHMsIG9ic2VydmVkQ2FsbHNpdGVzIH0pIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gcHJlcGFyZVNuYXBzaG90UHJvcGVydHlMaXN0KGN1c3RvbURPTVByb3BlcnRpZXMpO1xuXG4gICAgYWRkU25hcHNob3RQcm9wZXJ0aWVzKG9iaiwgZ2V0U2VsZWN0b3IsIFNlbGVjdG9yQnVpbGRlciwgcHJvcGVydGllcywgb2JzZXJ2ZWRDYWxsc2l0ZXMpO1xuICAgIGFkZEN1c3RvbU1ldGhvZHMob2JqLCBnZXRTZWxlY3RvciwgU2VsZWN0b3JCdWlsZGVyLCBjdXN0b21NZXRob2RzKTtcblxuICAgIG9iai5nZXRTdHlsZVByb3BlcnR5ID0gcHJvcCA9PiB7XG4gICAgICAgIGNvbnN0IGNhbGxzaXRlID0gZ2V0Q2FsbHNpdGVGb3JNZXRob2QoJ2dldFN0eWxlUHJvcGVydHknKTtcblxuICAgICAgICBpZiAoc2VsZWN0b3JBcGlFeGVjdXRpb25Nb2RlLmlzU3luYykge1xuICAgICAgICAgICAgY29uc3Qgc25hcHNob3QgPSBnZXRTbmFwc2hvdFN5bmMoZ2V0U2VsZWN0b3IsIGNhbGxzaXRlLCBTZWxlY3RvckJ1aWxkZXIpO1xuXG4gICAgICAgICAgICByZXR1cm4gc25hcHNob3Quc3R5bGUgPyBzbmFwc2hvdC5zdHlsZVtwcm9wXSA6IHZvaWQgMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSZUV4ZWN1dGFibGVQcm9taXNlLmZyb21Gbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IGdldFNuYXBzaG90KGdldFNlbGVjdG9yLCBjYWxsc2l0ZSwgU2VsZWN0b3JCdWlsZGVyKTtcblxuICAgICAgICAgICAgcmV0dXJuIHNuYXBzaG90LnN0eWxlID8gc25hcHNob3Quc3R5bGVbcHJvcF0gOiB2b2lkIDA7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBvYmouZ2V0QXR0cmlidXRlID0gYXR0ck5hbWUgPT4ge1xuICAgICAgICBjb25zdCBjYWxsc2l0ZSA9IGdldENhbGxzaXRlRm9yTWV0aG9kKCdnZXRBdHRyaWJ1dGUnKTtcblxuICAgICAgICBpZiAoc2VsZWN0b3JBcGlFeGVjdXRpb25Nb2RlLmlzU3luYykge1xuICAgICAgICAgICAgY29uc3Qgc25hcHNob3QgPSBnZXRTbmFwc2hvdFN5bmMoZ2V0U2VsZWN0b3IsIGNhbGxzaXRlLCBTZWxlY3RvckJ1aWxkZXIpO1xuXG4gICAgICAgICAgICByZXR1cm4gc25hcHNob3QuYXR0cmlidXRlcyA/IHNuYXBzaG90LmF0dHJpYnV0ZXNbYXR0ck5hbWVdIDogdm9pZCAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlRXhlY3V0YWJsZVByb21pc2UuZnJvbUZuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZ2V0U25hcHNob3QoZ2V0U2VsZWN0b3IsIGNhbGxzaXRlLCBTZWxlY3RvckJ1aWxkZXIpO1xuXG4gICAgICAgICAgICByZXR1cm4gc25hcHNob3QuYXR0cmlidXRlcyA/IHNuYXBzaG90LmF0dHJpYnV0ZXNbYXR0ck5hbWVdIDogdm9pZCAwO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgb2JqLmhhc0F0dHJpYnV0ZSA9IGF0dHJOYW1lID0+IHtcbiAgICAgICAgY29uc3QgY2FsbHNpdGUgPSBnZXRDYWxsc2l0ZUZvck1ldGhvZCgnaGFzQXR0cmlidXRlJyk7XG5cbiAgICAgICAgaWYgKHNlbGVjdG9yQXBpRXhlY3V0aW9uTW9kZS5pc1N5bmMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gZ2V0U25hcHNob3RTeW5jKGdldFNlbGVjdG9yLCBjYWxsc2l0ZSwgU2VsZWN0b3JCdWlsZGVyKTtcblxuICAgICAgICAgICAgcmV0dXJuIHNuYXBzaG90LmF0dHJpYnV0ZXMgPyBzbmFwc2hvdC5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KGF0dHJOYW1lKSA6IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlRXhlY3V0YWJsZVByb21pc2UuZnJvbUZuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZ2V0U25hcHNob3QoZ2V0U2VsZWN0b3IsIGNhbGxzaXRlLCBTZWxlY3RvckJ1aWxkZXIpO1xuXG4gICAgICAgICAgICByZXR1cm4gc25hcHNob3QuYXR0cmlidXRlcyA/IHNuYXBzaG90LmF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoYXR0ck5hbWUpIDogZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBvYmouZ2V0Qm91bmRpbmdDbGllbnRSZWN0UHJvcGVydHkgPSBwcm9wID0+IHtcbiAgICAgICAgY29uc3QgY2FsbHNpdGUgPSBnZXRDYWxsc2l0ZUZvck1ldGhvZCgnZ2V0Qm91bmRpbmdDbGllbnRSZWN0UHJvcGVydHknKTtcblxuICAgICAgICBpZiAoc2VsZWN0b3JBcGlFeGVjdXRpb25Nb2RlLmlzU3luYykge1xuICAgICAgICAgICAgY29uc3Qgc25hcHNob3QgPSBnZXRTbmFwc2hvdFN5bmMoZ2V0U2VsZWN0b3IsIGNhbGxzaXRlLCBTZWxlY3RvckJ1aWxkZXIpO1xuXG4gICAgICAgICAgICByZXR1cm4gc25hcHNob3QuYm91bmRpbmdDbGllbnRSZWN0ID8gc25hcHNob3QuYm91bmRpbmdDbGllbnRSZWN0W3Byb3BdIDogdm9pZCAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlRXhlY3V0YWJsZVByb21pc2UuZnJvbUZuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZ2V0U25hcHNob3QoZ2V0U2VsZWN0b3IsIGNhbGxzaXRlLCBTZWxlY3RvckJ1aWxkZXIpO1xuXG4gICAgICAgICAgICByZXR1cm4gc25hcHNob3QuYm91bmRpbmdDbGllbnRSZWN0ID8gc25hcHNob3QuYm91bmRpbmdDbGllbnRSZWN0W3Byb3BdIDogdm9pZCAwO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgb2JqLmhhc0NsYXNzID0gbmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGNhbGxzaXRlID0gZ2V0Q2FsbHNpdGVGb3JNZXRob2QoJ2hhc0NsYXNzJyk7XG5cbiAgICAgICAgaWYgKHNlbGVjdG9yQXBpRXhlY3V0aW9uTW9kZS5pc1N5bmMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gZ2V0U25hcHNob3RTeW5jKGdldFNlbGVjdG9yLCBjYWxsc2l0ZSwgU2VsZWN0b3JCdWlsZGVyKTtcblxuICAgICAgICAgICAgcmV0dXJuIHNuYXBzaG90LmNsYXNzTmFtZXMgPyBzbmFwc2hvdC5jbGFzc05hbWVzLmluY2x1ZGVzKG5hbWUpIDogZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUmVFeGVjdXRhYmxlUHJvbWlzZS5mcm9tRm4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBnZXRTbmFwc2hvdChnZXRTZWxlY3RvciwgY2FsbHNpdGUsIFNlbGVjdG9yQnVpbGRlcik7XG5cbiAgICAgICAgICAgIHJldHVybiBzbmFwc2hvdC5jbGFzc05hbWVzID8gc25hcHNob3QuY2xhc3NOYW1lcy5pbmNsdWRlcyhuYW1lKSA6IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb3VudGVyIChnZXRTZWxlY3RvciwgU2VsZWN0b3JCdWlsZGVyKSB7XG4gICAgY29uc3QgYnVpbGRlciAgPSBuZXcgU2VsZWN0b3JCdWlsZGVyKGdldFNlbGVjdG9yKCksIHsgY291bnRlck1vZGU6IHRydWUgfSwgeyBpbnN0YW50aWF0aW9uOiAnU2VsZWN0b3InIH0pO1xuICAgIGNvbnN0IGNvdW50ZXIgID0gYnVpbGRlci5nZXRGdW5jdGlvbigpO1xuICAgIGNvbnN0IGNhbGxzaXRlID0gZ2V0Q2FsbHNpdGVGb3JNZXRob2QoJ2dldCcpO1xuXG4gICAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBjb3VudGVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBlcnIuY2FsbHNpdGUgPSBjYWxsc2l0ZTtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvdW50ZXJTeW5jIChnZXRTZWxlY3RvciwgU2VsZWN0b3JCdWlsZGVyKSB7XG4gICAgY29uc3QgYnVpbGRlciAgPSBuZXcgU2VsZWN0b3JCdWlsZGVyKGdldFNlbGVjdG9yKCksIHsgY291bnRlck1vZGU6IHRydWUgfSwgeyBpbnN0YW50aWF0aW9uOiAnU2VsZWN0b3InIH0pO1xuICAgIGNvbnN0IGNvdW50ZXIgID0gYnVpbGRlci5nZXRGdW5jdGlvbigpO1xuICAgIGNvbnN0IGNhbGxzaXRlID0gZ2V0Q2FsbHNpdGVGb3JNZXRob2QoJ2dldCcpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBjb3VudGVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBlcnIuY2FsbHNpdGUgPSBjYWxsc2l0ZTtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGFkZENvdW50ZXJQcm9wZXJ0aWVzICh7IG9iaiwgZ2V0U2VsZWN0b3IsIFNlbGVjdG9yQnVpbGRlciB9KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgJ2NvdW50Jywge1xuICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RvckFwaUV4ZWN1dGlvbk1vZGUuaXNTeW5jKVxuICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVDb3VudGVyU3luYyhnZXRTZWxlY3RvciwgU2VsZWN0b3JCdWlsZGVyKSgpO1xuXG4gICAgICAgICAgICBjb25zdCBjb3VudGVyID0gY3JlYXRlQ291bnRlcihnZXRTZWxlY3RvciwgU2VsZWN0b3JCdWlsZGVyKTtcblxuICAgICAgICAgICAgcmV0dXJuIFJlRXhlY3V0YWJsZVByb21pc2UuZnJvbUZuKCgpID0+IGNvdW50ZXIoKSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosICdleGlzdHMnLCB7XG4gICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNlbGVjdG9yQXBpRXhlY3V0aW9uTW9kZS5pc1N5bmMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNvdW50ZXJTeW5jKGdldFNlbGVjdG9yLCBTZWxlY3RvckJ1aWxkZXIpKCkgPiAwO1xuXG4gICAgICAgICAgICBjb25zdCBjb3VudGVyID0gY3JlYXRlQ291bnRlcihnZXRTZWxlY3RvciwgU2VsZWN0b3JCdWlsZGVyKTtcblxuICAgICAgICAgICAgcmV0dXJuIFJlRXhlY3V0YWJsZVByb21pc2UuZnJvbUZuKGFzeW5jICgpID0+IGF3YWl0IGNvdW50ZXIoKSA+IDApO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRGaWx0ZXJUb0NsaWVudEZ1bmN0aW9uSWZOZWNlc3NhcnkgKGNhbGxzaXRlTmFtZSwgZmlsdGVyLCBkZXBlbmRlbmNpZXMpIHtcbiAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmlsdGVyW2NsaWVudEZ1bmN0aW9uQnVpbGRlclN5bWJvbF07XG4gICAgICAgIGNvbnN0IGZuICAgICAgPSBidWlsZGVyID8gYnVpbGRlci5mbiA6IGZpbHRlcjtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGJ1aWxkZXIgPyBhc3NpZ24oe30sIGJ1aWxkZXIub3B0aW9ucywgeyBkZXBlbmRlbmNpZXMgfSkgOiB7IGRlcGVuZGVuY2llcyB9O1xuXG4gICAgICAgIHJldHVybiAobmV3IENsaWVudEZ1bmN0aW9uQnVpbGRlcihmbiwgb3B0aW9ucywgeyBpbnN0YW50aWF0aW9uOiBjYWxsc2l0ZU5hbWUgfSkpLmdldEZ1bmN0aW9uKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbHRlcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGVyaXZhdGl2ZVNlbGVjdG9yV2l0aEZpbHRlciAoeyBnZXRTZWxlY3RvciwgU2VsZWN0b3JCdWlsZGVyLCBzZWxlY3RvckZuLCBhcGlGbiwgZmlsdGVyLCBhZGRpdGlvbmFsRGVwZW5kZW5jaWVzIH0pIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uTW9kZVNlbGVjdG9yQnVpbGRlciA9IG5ldyBTZWxlY3RvckJ1aWxkZXIoZ2V0U2VsZWN0b3IoKSwgeyBjb2xsZWN0aW9uTW9kZTogdHJ1ZSB9KTtcbiAgICBjb25zdCBjdXN0b21ET01Qcm9wZXJ0aWVzICAgICAgICAgICA9IGNvbGxlY3Rpb25Nb2RlU2VsZWN0b3JCdWlsZGVyLm9wdGlvbnMuY3VzdG9tRE9NUHJvcGVydGllcztcbiAgICBjb25zdCBjdXN0b21NZXRob2RzICAgICAgICAgICAgICAgICA9IGNvbGxlY3Rpb25Nb2RlU2VsZWN0b3JCdWlsZGVyLm9wdGlvbnMuY3VzdG9tTWV0aG9kcztcblxuICAgIGxldCBkZXBlbmRlbmNpZXMgPSB7XG4gICAgICAgIHNlbGVjdG9yOiAgICBjb2xsZWN0aW9uTW9kZVNlbGVjdG9yQnVpbGRlci5nZXRGdW5jdGlvbigpLFxuICAgICAgICBmaWx0ZXI6ICAgICAgZmlsdGVyLFxuICAgICAgICBmaWx0ZXJOb2RlczogZmlsdGVyTm9kZXNcbiAgICB9O1xuXG4gICAgY29uc3QgeyBib3VuZFRlc3RSdW4sIHRpbWVvdXQsIHZpc2liaWxpdHlDaGVjaywgYXBpRm5DaGFpbiB9ID0gY29sbGVjdGlvbk1vZGVTZWxlY3RvckJ1aWxkZXIub3B0aW9ucztcblxuICAgIGRlcGVuZGVuY2llcyA9IGFzc2lnbihkZXBlbmRlbmNpZXMsIGFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBTZWxlY3RvckJ1aWxkZXIoc2VsZWN0b3JGbiwge1xuICAgICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICAgIGN1c3RvbURPTVByb3BlcnRpZXMsXG4gICAgICAgIGN1c3RvbU1ldGhvZHMsXG4gICAgICAgIGJvdW5kVGVzdFJ1bixcbiAgICAgICAgdGltZW91dCxcbiAgICAgICAgdmlzaWJpbGl0eUNoZWNrLFxuICAgICAgICBhcGlGbkNoYWluLFxuICAgICAgICBhcGlGblxuICAgIH0sIHsgaW5zdGFudGlhdGlvbjogJ1NlbGVjdG9yJyB9KTtcblxuICAgIHJldHVybiBidWlsZGVyLmdldEZ1bmN0aW9uKCk7XG59XG5cbmNvbnN0IGZpbHRlckJ5VGV4dCA9IGNvbnZlcnRGaWx0ZXJUb0NsaWVudEZ1bmN0aW9uSWZOZWNlc3NhcnkoJ2ZpbHRlcicsIHNlbGVjdG9yVGV4dEZpbHRlcik7XG5jb25zdCBmaWx0ZXJCeUF0dHIgPSBjb252ZXJ0RmlsdGVyVG9DbGllbnRGdW5jdGlvbklmTmVjZXNzYXJ5KCdmaWx0ZXInLCBzZWxlY3RvckF0dHJpYnV0ZUZpbHRlcik7XG5cbmZ1bmN0aW9uIGVuc3VyZVJlZ0V4cENvbnRleHQgKHN0cikge1xuICAgIC8vIE5PVEU6IGlmIGEgcmVnZXhwIGlzIGNyZWF0ZWQgaW4gYSBzZXBhcmF0ZSBjb250ZXh0ICh2aWEgdGhlICd2bScgbW9kdWxlKSB3ZVxuICAgIC8vIHNob3VsZCB3cmFwIGl0IHdpdGggbmV3IFJlZ0V4cCgpIHRvIG1ha2UgdGhlIGBpbnN0YW5jZW9mIFJlZ0V4cGAgY2hlY2sgc3VjY2Vzc2Z1bC5cbiAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycgJiYgIShzdHIgaW5zdGFuY2VvZiBSZWdFeHApKVxuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChzdHIpO1xuXG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZnVuY3Rpb24gYWRkRmlsdGVyTWV0aG9kcyAob3B0aW9ucykge1xuICAgIGNvbnN0IHsgb2JqLCBnZXRTZWxlY3RvciwgU2VsZWN0b3JCdWlsZGVyIH0gPSBvcHRpb25zO1xuXG4gICAgb2JqLm50aCA9IGluZGV4ID0+IHtcbiAgICAgICAgYXNzZXJ0VHlwZShpcy5udW1iZXIsICdudGgnLCAnXCJpbmRleFwiIGFyZ3VtZW50JywgaW5kZXgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUZuICAgPSBwcmVwYXJlQXBpRm5BcmdzKCdudGgnLCBpbmRleCk7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgU2VsZWN0b3JCdWlsZGVyKGdldFNlbGVjdG9yKCksIHsgaW5kZXgsIGFwaUZuIH0sIHsgaW5zdGFudGlhdGlvbjogJ1NlbGVjdG9yJyB9KTtcblxuICAgICAgICByZXR1cm4gYnVpbGRlci5nZXRGdW5jdGlvbigpO1xuICAgIH07XG5cbiAgICBvYmoud2l0aFRleHQgPSB0ZXh0ID0+IHtcbiAgICAgICAgYXNzZXJ0VHlwZShbaXMuc3RyaW5nLCBpcy5yZWdFeHBdLCAnd2l0aFRleHQnLCAnXCJ0ZXh0XCIgYXJndW1lbnQnLCB0ZXh0KTtcblxuICAgICAgICBjb25zdCBhcGlGbiA9IHByZXBhcmVBcGlGbkFyZ3MoJ3dpdGhUZXh0JywgdGV4dCk7XG5cbiAgICAgICAgdGV4dCA9IGVuc3VyZVJlZ0V4cENvbnRleHQodGV4dCk7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0b3JGbiA9ICgpID0+IHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgICAgICAgICBjb25zdCBub2RlcyA9IHNlbGVjdG9yKCk7XG5cbiAgICAgICAgICAgIGlmICghbm9kZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyTm9kZXMobm9kZXMsIGZpbHRlciwgZG9jdW1lbnQsIHZvaWQgMCwgdGV4dFJlKTtcbiAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW5kZWYgKi9cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBhcmdzID0gZ2V0RGVyaXZhdGl2ZVNlbGVjdG9yQXJncyhvcHRpb25zLCBzZWxlY3RvckZuLCBhcGlGbiwgZmlsdGVyQnlUZXh0LCB7IHRleHRSZTogbWFrZVJlZ0V4cCh0ZXh0KSB9KTtcblxuICAgICAgICByZXR1cm4gY3JlYXRlRGVyaXZhdGl2ZVNlbGVjdG9yV2l0aEZpbHRlcihhcmdzKTtcbiAgICB9O1xuXG4gICAgb2JqLndpdGhFeGFjdFRleHQgPSB0ZXh0ID0+IHtcbiAgICAgICAgYXNzZXJ0VHlwZShpcy5zdHJpbmcsICd3aXRoRXhhY3RUZXh0JywgJ1widGV4dFwiIGFyZ3VtZW50JywgdGV4dCk7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0b3JGbiA9ICgpID0+IHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgICAgICAgICBjb25zdCBub2RlcyA9IHNlbGVjdG9yKCk7XG5cbiAgICAgICAgICAgIGlmICghbm9kZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyTm9kZXMobm9kZXMsIGZpbHRlciwgZG9jdW1lbnQsIHZvaWQgMCwgZXhhY3RUZXh0KTtcbiAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW5kZWYgKi9cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBhcGlGbiA9IHByZXBhcmVBcGlGbkFyZ3MoJ3dpdGhFeGFjdFRleHQnLCB0ZXh0KTtcbiAgICAgICAgY29uc3QgYXJncyAgPSBnZXREZXJpdmF0aXZlU2VsZWN0b3JBcmdzKG9wdGlvbnMsIHNlbGVjdG9yRm4sIGFwaUZuLCBmaWx0ZXJCeVRleHQsIHsgZXhhY3RUZXh0OiB0ZXh0IH0pO1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVEZXJpdmF0aXZlU2VsZWN0b3JXaXRoRmlsdGVyKGFyZ3MpO1xuICAgIH07XG5cbiAgICBvYmoud2l0aEF0dHJpYnV0ZSA9IChhdHRyTmFtZSwgYXR0clZhbHVlKSA9PiB7XG4gICAgICAgIGFzc2VydFR5cGUoW2lzLnN0cmluZywgaXMucmVnRXhwXSwgJ3dpdGhBdHRyaWJ1dGUnLCAnXCJhdHRyTmFtZVwiIGFyZ3VtZW50JywgYXR0ck5hbWUpO1xuXG4gICAgICAgIGNvbnN0IGFwaUZuID0gcHJlcGFyZUFwaUZuQXJncygnd2l0aEF0dHJpYnV0ZScsIGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuXG4gICAgICAgIGF0dHJOYW1lID0gZW5zdXJlUmVnRXhwQ29udGV4dChhdHRyTmFtZSk7XG5cbiAgICAgICAgaWYgKGF0dHJWYWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBhc3NlcnRUeXBlKFtpcy5zdHJpbmcsIGlzLnJlZ0V4cF0sICd3aXRoQXR0cmlidXRlJywgJ1wiYXR0clZhbHVlXCIgYXJndW1lbnQnLCBhdHRyVmFsdWUpO1xuICAgICAgICAgICAgYXR0clZhbHVlID0gZW5zdXJlUmVnRXhwQ29udGV4dChhdHRyVmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0b3JGbiA9ICgpID0+IHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgICAgICAgICBjb25zdCBub2RlcyA9IHNlbGVjdG9yKCk7XG5cbiAgICAgICAgICAgIGlmICghbm9kZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyTm9kZXMobm9kZXMsIGZpbHRlciwgZG9jdW1lbnQsIHZvaWQgMCwgYXR0ck5hbWUsIGF0dHJWYWx1ZSk7XG4gICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVuZGVmICovXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgYXJncyA9IGdldERlcml2YXRpdmVTZWxlY3RvckFyZ3Mob3B0aW9ucywgc2VsZWN0b3JGbiwgYXBpRm4sIGZpbHRlckJ5QXR0ciwge1xuICAgICAgICAgICAgYXR0ck5hbWUsXG4gICAgICAgICAgICBhdHRyVmFsdWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZURlcml2YXRpdmVTZWxlY3RvcldpdGhGaWx0ZXIoYXJncyk7XG4gICAgfTtcblxuICAgIG9iai5maWx0ZXIgPSAoZmlsdGVyLCBkZXBlbmRlbmNpZXMpID0+IHtcbiAgICAgICAgYXNzZXJ0VHlwZShbaXMuc3RyaW5nLCBpcy5mdW5jdGlvbl0sICdmaWx0ZXInLCAnXCJmaWx0ZXJcIiBhcmd1bWVudCcsIGZpbHRlcik7XG5cbiAgICAgICAgY29uc3QgYXBpRm4gPSBwcmVwYXJlQXBpRm5BcmdzKCdmaWx0ZXInLCBmaWx0ZXIpO1xuXG4gICAgICAgIGZpbHRlciA9IGNvbnZlcnRGaWx0ZXJUb0NsaWVudEZ1bmN0aW9uSWZOZWNlc3NhcnkoJ2ZpbHRlcicsIGZpbHRlciwgZGVwZW5kZW5jaWVzKTtcblxuICAgICAgICBjb25zdCBzZWxlY3RvckZuID0gKCkgPT4ge1xuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbiAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gc2VsZWN0b3IoKTtcblxuICAgICAgICAgICAgaWYgKCFub2Rlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJOb2Rlcyhub2RlcywgZmlsdGVyLCBkb2N1bWVudCwgdm9pZCAwKTtcbiAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW5kZWYgKi9cbiAgICAgICAgfTtcblxuXG4gICAgICAgIGNvbnN0IGFyZ3MgPSBnZXREZXJpdmF0aXZlU2VsZWN0b3JBcmdzKG9wdGlvbnMsIHNlbGVjdG9yRm4sIGFwaUZuLCBmaWx0ZXIpO1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVEZXJpdmF0aXZlU2VsZWN0b3JXaXRoRmlsdGVyKGFyZ3MpO1xuICAgIH07XG5cbiAgICBvYmouZmlsdGVyVmlzaWJsZSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgYXBpRm4gICA9IHByZXBhcmVBcGlGbkFyZ3MoJ2ZpbHRlclZpc2libGUnKTtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBTZWxlY3RvckJ1aWxkZXIoZ2V0U2VsZWN0b3IoKSwgeyBmaWx0ZXJWaXNpYmxlOiB0cnVlLCBhcGlGbiB9LCB7IGluc3RhbnRpYXRpb246ICdTZWxlY3RvcicgfSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0RnVuY3Rpb24oKTtcbiAgICB9O1xuXG4gICAgb2JqLmZpbHRlckhpZGRlbiA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgYXBpRm4gICA9IHByZXBhcmVBcGlGbkFyZ3MoJ2ZpbHRlckhpZGRlbicpO1xuICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IFNlbGVjdG9yQnVpbGRlcihnZXRTZWxlY3RvcigpLCB7IGZpbHRlckhpZGRlbjogdHJ1ZSwgYXBpRm4gfSwgeyBpbnN0YW50aWF0aW9uOiAnU2VsZWN0b3InIH0pO1xuXG4gICAgICAgIHJldHVybiBidWlsZGVyLmdldEZ1bmN0aW9uKCk7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gYWRkQ3VzdG9tRE9NUHJvcGVydGllc01ldGhvZCAoeyBvYmosIGdldFNlbGVjdG9yLCBTZWxlY3RvckJ1aWxkZXIgfSkge1xuICAgIG9iai5hZGRDdXN0b21ET01Qcm9wZXJ0aWVzID0gY3VzdG9tRE9NUHJvcGVydGllcyA9PiB7XG4gICAgICAgIGFzc2VydEFkZEN1c3RvbURPTVByb3BlcnRpZXNPcHRpb25zKGN1c3RvbURPTVByb3BlcnRpZXMpO1xuXG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgU2VsZWN0b3JCdWlsZGVyKGdldFNlbGVjdG9yKCksIHsgY3VzdG9tRE9NUHJvcGVydGllcyB9LCB7IGluc3RhbnRpYXRpb246ICdTZWxlY3RvcicgfSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0RnVuY3Rpb24oKTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBhZGRDdXN0b21NZXRob2RzTWV0aG9kICh7IG9iaiwgZ2V0U2VsZWN0b3IsIFNlbGVjdG9yQnVpbGRlciB9KSB7XG4gICAgb2JqLmFkZEN1c3RvbU1ldGhvZHMgPSBmdW5jdGlvbiAobWV0aG9kcywgb3B0cykge1xuICAgICAgICBhc3NlcnRBZGRDdXN0b21NZXRob2RzKG1ldGhvZHMsIG9wdHMpO1xuXG4gICAgICAgIGNvbnN0IGN1c3RvbU1ldGhvZHMgPSB7fTtcblxuICAgICAgICBPYmplY3Qua2V5cyhtZXRob2RzKS5mb3JFYWNoKG1ldGhvZE5hbWUgPT4ge1xuICAgICAgICAgICAgY3VzdG9tTWV0aG9kc1ttZXRob2ROYW1lXSA9IHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICAgICAgICAgbWV0aG9kc1ttZXRob2ROYW1lXSxcbiAgICAgICAgICAgICAgICByZXR1cm5ET01Ob2Rlczogb3B0cyAmJiAhIW9wdHMucmV0dXJuRE9NTm9kZXNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgU2VsZWN0b3JCdWlsZGVyKGdldFNlbGVjdG9yKCksIHsgY3VzdG9tTWV0aG9kcyB9LCB7IGluc3RhbnRpYXRpb246ICdTZWxlY3RvcicgfSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0RnVuY3Rpb24oKTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBhZGRIaWVyYXJjaGljYWxTZWxlY3RvcnMgKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IG9iaiB9ID0gb3B0aW9ucztcblxuICAgIC8vIEZpbmRcbiAgICBvYmouZmluZCA9IChmaWx0ZXIsIGRlcGVuZGVuY2llcykgPT4ge1xuICAgICAgICBhc3NlcnRUeXBlKFtpcy5zdHJpbmcsIGlzLmZ1bmN0aW9uXSwgJ2ZpbmQnLCAnXCJmaWx0ZXJcIiBhcmd1bWVudCcsIGZpbHRlcik7XG5cbiAgICAgICAgY29uc3QgYXBpRm4gPSBwcmVwYXJlQXBpRm5BcmdzKCdmaW5kJywgZmlsdGVyKTtcblxuICAgICAgICBmaWx0ZXIgPSBjb252ZXJ0RmlsdGVyVG9DbGllbnRGdW5jdGlvbklmTmVjZXNzYXJ5KCdmaW5kJywgZmlsdGVyLCBkZXBlbmRlbmNpZXMpO1xuXG4gICAgICAgIGNvbnN0IHNlbGVjdG9yRm4gPSAoKSA9PiB7XG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuICAgICAgICAgICAgcmV0dXJuIGV4cGFuZFNlbGVjdG9yUmVzdWx0cyhzZWxlY3Rvciwgbm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2Ygbm9kZS5xdWVyeVNlbGVjdG9yQWxsID09PSAnZnVuY3Rpb24nID9cbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucXVlcnlTZWxlY3RvckFsbChmaWx0ZXIpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdmlzaXROb2RlID0gY3VycmVudE5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbkxlbmd0aCA9IGN1cnJlbnROb2RlLmNoaWxkTm9kZXMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY25MZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBjdXJyZW50Tm9kZS5jaGlsZE5vZGVzW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goY2hpbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpdE5vZGUoY2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHZpc2l0Tm9kZShub2RlKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJOb2RlcyhyZXN1bHRzLCBmaWx0ZXIsIG51bGwsIG5vZGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVuZGVmICovXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgYXJncyA9IGdldERlcml2YXRpdmVTZWxlY3RvckFyZ3Mob3B0aW9ucywgc2VsZWN0b3JGbiwgYXBpRm4sIGZpbHRlciwgeyBleHBhbmRTZWxlY3RvclJlc3VsdHMgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZURlcml2YXRpdmVTZWxlY3RvcldpdGhGaWx0ZXIoYXJncyk7XG4gICAgfTtcblxuICAgIC8vIFBhcmVudFxuICAgIG9iai5wYXJlbnQgPSAoZmlsdGVyLCBkZXBlbmRlbmNpZXMpID0+IHtcbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdm9pZCAwKVxuICAgICAgICAgICAgYXNzZXJ0VHlwZShbaXMuc3RyaW5nLCBpcy5mdW5jdGlvbiwgaXMubnVtYmVyXSwgJ3BhcmVudCcsICdcImZpbHRlclwiIGFyZ3VtZW50JywgZmlsdGVyKTtcblxuICAgICAgICBjb25zdCBhcGlGbiA9IHByZXBhcmVBcGlGbkFyZ3MoJ3BhcmVudCcsIGZpbHRlcik7XG5cbiAgICAgICAgZmlsdGVyID0gY29udmVydEZpbHRlclRvQ2xpZW50RnVuY3Rpb25JZk5lY2Vzc2FyeSgnZmluZCcsIGZpbHRlciwgZGVwZW5kZW5jaWVzKTtcblxuICAgICAgICBjb25zdCBzZWxlY3RvckZuID0gKCkgPT4ge1xuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbiAgICAgICAgICAgIHJldHVybiBleHBhbmRTZWxlY3RvclJlc3VsdHMoc2VsZWN0b3IsIG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudHMgPSBbXTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTsgcGFyZW50OyBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50cy5wdXNoKHBhcmVudCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyICE9PSB2b2lkIDAgPyBmaWx0ZXJOb2RlcyhwYXJlbnRzLCBmaWx0ZXIsIGRvY3VtZW50LCBub2RlKSA6IHBhcmVudHM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW5kZWYgKi9cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBhcmdzID0gZ2V0RGVyaXZhdGl2ZVNlbGVjdG9yQXJncyhvcHRpb25zLCBzZWxlY3RvckZuLCBhcGlGbiwgZmlsdGVyLCB7IGV4cGFuZFNlbGVjdG9yUmVzdWx0cyB9KTtcblxuICAgICAgICByZXR1cm4gY3JlYXRlRGVyaXZhdGl2ZVNlbGVjdG9yV2l0aEZpbHRlcihhcmdzKTtcbiAgICB9O1xuXG4gICAgLy8gQ2hpbGRcbiAgICBvYmouY2hpbGQgPSAoZmlsdGVyLCBkZXBlbmRlbmNpZXMpID0+IHtcbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdm9pZCAwKVxuICAgICAgICAgICAgYXNzZXJ0VHlwZShbaXMuc3RyaW5nLCBpcy5mdW5jdGlvbiwgaXMubnVtYmVyXSwgJ2NoaWxkJywgJ1wiZmlsdGVyXCIgYXJndW1lbnQnLCBmaWx0ZXIpO1xuXG4gICAgICAgIGNvbnN0IGFwaUZuID0gcHJlcGFyZUFwaUZuQXJncygnY2hpbGQnLCBmaWx0ZXIpO1xuXG4gICAgICAgIGZpbHRlciA9IGNvbnZlcnRGaWx0ZXJUb0NsaWVudEZ1bmN0aW9uSWZOZWNlc3NhcnkoJ2ZpbmQnLCBmaWx0ZXIsIGRlcGVuZGVuY2llcyk7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0b3JGbiA9ICgpID0+IHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgICAgICAgICByZXR1cm4gZXhwYW5kU2VsZWN0b3JSZXN1bHRzKHNlbGVjdG9yLCBub2RlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEVsZW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgY25MZW5ndGggICAgICA9IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNuTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkTm9kZXNbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50cy5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyICE9PSB2b2lkIDAgPyBmaWx0ZXJOb2RlcyhjaGlsZEVsZW1lbnRzLCBmaWx0ZXIsIG5vZGUsIG5vZGUpIDogY2hpbGRFbGVtZW50cztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby11bmRlZiAqL1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGFyZ3MgPSBnZXREZXJpdmF0aXZlU2VsZWN0b3JBcmdzKG9wdGlvbnMsIHNlbGVjdG9yRm4sIGFwaUZuLCBmaWx0ZXIsIHsgZXhwYW5kU2VsZWN0b3JSZXN1bHRzIH0pO1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVEZXJpdmF0aXZlU2VsZWN0b3JXaXRoRmlsdGVyKGFyZ3MpO1xuICAgIH07XG5cbiAgICAvLyBTaWJsaW5nXG4gICAgb2JqLnNpYmxpbmcgPSAoZmlsdGVyLCBkZXBlbmRlbmNpZXMpID0+IHtcbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdm9pZCAwKVxuICAgICAgICAgICAgYXNzZXJ0VHlwZShbaXMuc3RyaW5nLCBpcy5mdW5jdGlvbiwgaXMubnVtYmVyXSwgJ3NpYmxpbmcnLCAnXCJmaWx0ZXJcIiBhcmd1bWVudCcsIGZpbHRlcik7XG5cbiAgICAgICAgY29uc3QgYXBpRm4gPSBwcmVwYXJlQXBpRm5BcmdzKCdzaWJsaW5nJywgZmlsdGVyKTtcblxuICAgICAgICBmaWx0ZXIgPSBjb252ZXJ0RmlsdGVyVG9DbGllbnRGdW5jdGlvbklmTmVjZXNzYXJ5KCdmaW5kJywgZmlsdGVyLCBkZXBlbmRlbmNpZXMpO1xuXG4gICAgICAgIGNvbnN0IHNlbGVjdG9yRm4gPSAoKSA9PiB7XG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuICAgICAgICAgICAgcmV0dXJuIGV4cGFuZFNlbGVjdG9yUmVzdWx0cyhzZWxlY3Rvciwgbm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc2libGluZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBjbkxlbmd0aCA9IHBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY25MZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IHBhcmVudC5jaGlsZE5vZGVzW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMSAmJiBjaGlsZCAhPT0gbm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXIgIT09IHZvaWQgMCA/IGZpbHRlck5vZGVzKHNpYmxpbmdzLCBmaWx0ZXIsIHBhcmVudCwgbm9kZSkgOiBzaWJsaW5ncztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby11bmRlZiAqL1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGFyZ3MgPSBnZXREZXJpdmF0aXZlU2VsZWN0b3JBcmdzKG9wdGlvbnMsIHNlbGVjdG9yRm4sIGFwaUZuLCBmaWx0ZXIsIHsgZXhwYW5kU2VsZWN0b3JSZXN1bHRzIH0pO1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVEZXJpdmF0aXZlU2VsZWN0b3JXaXRoRmlsdGVyKGFyZ3MpO1xuICAgIH07XG5cbiAgICAvLyBOZXh0IHNpYmxpbmdcbiAgICBvYmoubmV4dFNpYmxpbmcgPSAoZmlsdGVyLCBkZXBlbmRlbmNpZXMpID0+IHtcbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdm9pZCAwKVxuICAgICAgICAgICAgYXNzZXJ0VHlwZShbaXMuc3RyaW5nLCBpcy5mdW5jdGlvbiwgaXMubnVtYmVyXSwgJ25leHRTaWJsaW5nJywgJ1wiZmlsdGVyXCIgYXJndW1lbnQnLCBmaWx0ZXIpO1xuXG4gICAgICAgIGNvbnN0IGFwaUZuID0gcHJlcGFyZUFwaUZuQXJncygnbmV4dFNpYmxpbmcnLCBmaWx0ZXIpO1xuXG4gICAgICAgIGZpbHRlciA9IGNvbnZlcnRGaWx0ZXJUb0NsaWVudEZ1bmN0aW9uSWZOZWNlc3NhcnkoJ2ZpbmQnLCBmaWx0ZXIsIGRlcGVuZGVuY2llcyk7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0b3JGbiA9ICgpID0+IHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgICAgICAgICByZXR1cm4gZXhwYW5kU2VsZWN0b3JSZXN1bHRzKHNlbGVjdG9yLCBub2RlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNuTGVuZ3RoID0gcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGxldCBhZnRlck5vZGUgID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNuTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBwYXJlbnQuY2hpbGROb2Rlc1tpXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQgPT09IG5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBhZnRlck5vZGUgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFmdGVyTm9kZSAmJiBjaGlsZC5ub2RlVHlwZSA9PT0gMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXIgIT09IHZvaWQgMCA/IGZpbHRlck5vZGVzKHNpYmxpbmdzLCBmaWx0ZXIsIHBhcmVudCwgbm9kZSkgOiBzaWJsaW5ncztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby11bmRlZiAqL1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGFyZ3MgPSBnZXREZXJpdmF0aXZlU2VsZWN0b3JBcmdzKG9wdGlvbnMsIHNlbGVjdG9yRm4sIGFwaUZuLCBmaWx0ZXIsIHsgZXhwYW5kU2VsZWN0b3JSZXN1bHRzIH0pO1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVEZXJpdmF0aXZlU2VsZWN0b3JXaXRoRmlsdGVyKGFyZ3MpO1xuICAgIH07XG5cbiAgICAvLyBQcmV2IHNpYmxpbmdcbiAgICBvYmoucHJldlNpYmxpbmcgPSAoZmlsdGVyLCBkZXBlbmRlbmNpZXMpID0+IHtcbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdm9pZCAwKVxuICAgICAgICAgICAgYXNzZXJ0VHlwZShbaXMuc3RyaW5nLCBpcy5mdW5jdGlvbiwgaXMubnVtYmVyXSwgJ3ByZXZTaWJsaW5nJywgJ1wiZmlsdGVyXCIgYXJndW1lbnQnLCBmaWx0ZXIpO1xuXG4gICAgICAgIGNvbnN0IGFwaUZuID0gcHJlcGFyZUFwaUZuQXJncygncHJldlNpYmxpbmcnLCBmaWx0ZXIpO1xuXG4gICAgICAgIGZpbHRlciA9IGNvbnZlcnRGaWx0ZXJUb0NsaWVudEZ1bmN0aW9uSWZOZWNlc3NhcnkoJ2ZpbmQnLCBmaWx0ZXIsIGRlcGVuZGVuY2llcyk7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0b3JGbiA9ICgpID0+IHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgICAgICAgICByZXR1cm4gZXhwYW5kU2VsZWN0b3JSZXN1bHRzKHNlbGVjdG9yLCBub2RlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNuTGVuZ3RoID0gcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbkxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gcGFyZW50LmNoaWxkTm9kZXNbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkID09PSBub2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlciAhPT0gdm9pZCAwID8gZmlsdGVyTm9kZXMoc2libGluZ3MsIGZpbHRlciwgcGFyZW50LCBub2RlKSA6IHNpYmxpbmdzO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVuZGVmICovXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgYXJncyA9IGdldERlcml2YXRpdmVTZWxlY3RvckFyZ3Mob3B0aW9ucywgc2VsZWN0b3JGbiwgYXBpRm4sIGZpbHRlciwgeyBleHBhbmRTZWxlY3RvclJlc3VsdHMgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZURlcml2YXRpdmVTZWxlY3RvcldpdGhGaWx0ZXIoYXJncyk7XG4gICAgfTtcblxuICAgIC8vIFNoYWRvd1Jvb3RcbiAgICBvYmouc2hhZG93Um9vdCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgYXBpRm4gPSBwcmVwYXJlQXBpRm5BcmdzKCdzaGFkb3dSb290Jyk7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0b3JGbiA9ICgpID0+IHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgICAgICAgICByZXR1cm4gZXhwYW5kU2VsZWN0b3JSZXN1bHRzKHNlbGVjdG9yLCBub2RlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gIW5vZGUuc2hhZG93Um9vdCA/IG51bGwgOiBbbm9kZS5zaGFkb3dSb290XTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby11bmRlZiAqL1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGFyZ3MgPSBnZXREZXJpdmF0aXZlU2VsZWN0b3JBcmdzKG9wdGlvbnMsIHNlbGVjdG9yRm4sIGFwaUZuLCB2b2lkIDAsIHsgZXhwYW5kU2VsZWN0b3JSZXN1bHRzIH0pO1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVEZXJpdmF0aXZlU2VsZWN0b3JXaXRoRmlsdGVyKGFyZ3MpO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRBUEkgKHNlbGVjdG9yLCBnZXRTZWxlY3RvciwgU2VsZWN0b3JCdWlsZGVyLCBjdXN0b21ET01Qcm9wZXJ0aWVzLCBjdXN0b21NZXRob2RzLCBvYnNlcnZlZENhbGxzaXRlcywgc2tpcFNuYXBzaG90UHJvcGVydGllcykge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IG9iajogc2VsZWN0b3IsIGdldFNlbGVjdG9yLCBTZWxlY3RvckJ1aWxkZXIsIGN1c3RvbURPTVByb3BlcnRpZXMsIGN1c3RvbU1ldGhvZHMsIG9ic2VydmVkQ2FsbHNpdGVzIH07XG5cbiAgICBhZGRGaWx0ZXJNZXRob2RzKG9wdGlvbnMpO1xuICAgIGFkZEhpZXJhcmNoaWNhbFNlbGVjdG9ycyhvcHRpb25zKTtcblxuICAgIGlmICghc2tpcFNuYXBzaG90UHJvcGVydGllcylcbiAgICAgICAgYWRkU25hcHNob3RQcm9wZXJ0eVNob3J0aGFuZHMob3B0aW9ucyk7XG5cbiAgICBhZGRDdXN0b21ET01Qcm9wZXJ0aWVzTWV0aG9kKG9wdGlvbnMpO1xuICAgIGFkZEN1c3RvbU1ldGhvZHNNZXRob2Qob3B0aW9ucyk7XG4gICAgYWRkQ291bnRlclByb3BlcnRpZXMob3B0aW9ucyk7XG4gICAgYWRkVmlzaWJsZVByb3BlcnR5KG9wdGlvbnMpO1xufVxuIl19