@angular/cdk 14.0.0-next.0 → 14.0.0-next.11

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 (272) hide show
  1. package/a11y/_index.scss +11 -0
  2. package/a11y/a11y-module.d.ts +2 -3
  3. package/a11y/aria-describer/aria-describer.d.ts +33 -6
  4. package/a11y/live-announcer/live-announcer.d.ts +5 -1
  5. package/a11y-prebuilt.css +1 -1
  6. package/drag-drop/drag-events.d.ts +8 -0
  7. package/drag-drop/drag-ref.d.ts +11 -1
  8. package/drag-drop/drop-list-ref.d.ts +5 -1
  9. package/drag-drop/parent-position-tracker.d.ts +11 -3
  10. package/esm2020/a11y/a11y-module.mjs +6 -7
  11. package/esm2020/a11y/aria-describer/aria-describer.mjs +75 -52
  12. package/esm2020/a11y/focus-monitor/focus-monitor.mjs +13 -11
  13. package/esm2020/a11y/focus-trap/configurable-focus-trap-factory.mjs +4 -4
  14. package/esm2020/a11y/focus-trap/focus-trap-manager.mjs +4 -4
  15. package/esm2020/a11y/focus-trap/focus-trap.mjs +7 -7
  16. package/esm2020/a11y/high-contrast-mode/high-contrast-mode-detector.mjs +7 -12
  17. package/esm2020/a11y/input-modality/input-modality-detector.mjs +4 -4
  18. package/esm2020/a11y/interactivity-checker/interactivity-checker.mjs +4 -4
  19. package/esm2020/a11y/live-announcer/live-announcer.mjs +26 -18
  20. package/esm2020/accordion/accordion-item.mjs +4 -4
  21. package/esm2020/accordion/accordion-module.mjs +5 -5
  22. package/esm2020/accordion/accordion.mjs +4 -4
  23. package/esm2020/bidi/bidi-module.mjs +5 -5
  24. package/esm2020/bidi/dir.mjs +4 -4
  25. package/esm2020/bidi/directionality.mjs +4 -4
  26. package/esm2020/clipboard/clipboard-module.mjs +5 -5
  27. package/esm2020/clipboard/clipboard.mjs +4 -4
  28. package/esm2020/clipboard/copy-to-clipboard.mjs +4 -4
  29. package/esm2020/collections/unique-selection-dispatcher.mjs +4 -4
  30. package/esm2020/drag-drop/directives/drag-handle.mjs +4 -4
  31. package/esm2020/drag-drop/directives/drag-placeholder.mjs +4 -4
  32. package/esm2020/drag-drop/directives/drag-preview.mjs +4 -4
  33. package/esm2020/drag-drop/directives/drag.mjs +26 -24
  34. package/esm2020/drag-drop/directives/drop-list-group.mjs +4 -4
  35. package/esm2020/drag-drop/directives/drop-list.mjs +14 -13
  36. package/esm2020/drag-drop/drag-drop-module.mjs +5 -5
  37. package/esm2020/drag-drop/drag-drop-registry.mjs +4 -4
  38. package/esm2020/drag-drop/drag-drop.mjs +4 -4
  39. package/esm2020/drag-drop/drag-events.mjs +1 -1
  40. package/esm2020/drag-drop/drag-ref.mjs +48 -24
  41. package/esm2020/drag-drop/drop-list-ref.mjs +7 -3
  42. package/esm2020/drag-drop/parent-position-tracker.mjs +13 -5
  43. package/esm2020/layout/breakpoints-observer.mjs +4 -4
  44. package/esm2020/layout/layout-module.mjs +5 -5
  45. package/esm2020/layout/media-matcher.mjs +4 -4
  46. package/esm2020/observers/observe-content.mjs +14 -14
  47. package/esm2020/overlay/dispatchers/base-overlay-dispatcher.mjs +4 -4
  48. package/esm2020/overlay/dispatchers/overlay-keyboard-dispatcher.mjs +26 -8
  49. package/esm2020/overlay/dispatchers/overlay-outside-click-dispatcher.mjs +33 -12
  50. package/esm2020/overlay/fullscreen-overlay-container.mjs +4 -4
  51. package/esm2020/overlay/overlay-container.mjs +4 -4
  52. package/esm2020/overlay/overlay-directives.mjs +7 -7
  53. package/esm2020/overlay/overlay-module.mjs +5 -5
  54. package/esm2020/overlay/overlay-ref.mjs +24 -18
  55. package/esm2020/overlay/overlay.mjs +14 -8
  56. package/esm2020/overlay/position/flexible-connected-position-strategy.mjs +21 -3
  57. package/esm2020/overlay/position/global-position-strategy.mjs +64 -30
  58. package/esm2020/overlay/position/overlay-position-builder.mjs +4 -4
  59. package/esm2020/overlay/public-api.mjs +2 -2
  60. package/esm2020/overlay/scroll/scroll-strategy-options.mjs +4 -4
  61. package/esm2020/platform/platform-module.mjs +5 -5
  62. package/esm2020/platform/platform.mjs +4 -4
  63. package/esm2020/portal/dom-portal-outlet.mjs +29 -5
  64. package/esm2020/portal/portal-directives.mjs +20 -18
  65. package/esm2020/portal/portal.mjs +12 -3
  66. package/esm2020/scrolling/fixed-size-virtual-scroll.mjs +4 -4
  67. package/esm2020/scrolling/scroll-dispatcher.mjs +4 -4
  68. package/esm2020/scrolling/scrollable.mjs +4 -4
  69. package/esm2020/scrolling/scrolling-module.mjs +10 -11
  70. package/esm2020/scrolling/viewport-ruler.mjs +4 -4
  71. package/esm2020/scrolling/virtual-for-of.mjs +7 -5
  72. package/esm2020/scrolling/virtual-scroll-viewport.mjs +8 -6
  73. package/esm2020/stepper/step-header.mjs +4 -4
  74. package/esm2020/stepper/step-label.mjs +4 -4
  75. package/esm2020/stepper/stepper-button.mjs +7 -7
  76. package/esm2020/stepper/stepper-module.mjs +5 -5
  77. package/esm2020/stepper/stepper.mjs +9 -22
  78. package/esm2020/table/cell.mjs +22 -22
  79. package/esm2020/table/coalesced-style-scheduler.mjs +4 -4
  80. package/esm2020/table/row.mjs +28 -28
  81. package/esm2020/table/table-module.mjs +5 -5
  82. package/esm2020/table/table.mjs +21 -21
  83. package/esm2020/table/text-column.mjs +4 -4
  84. package/esm2020/testing/component-harness.mjs +7 -1
  85. package/esm2020/testing/harness-environment.mjs +12 -1
  86. package/esm2020/testing/public-api.mjs +2 -1
  87. package/esm2020/testing/selenium-webdriver/selenium-web-driver-element.mjs +8 -3
  88. package/esm2020/testing/test-element-errors.mjs +15 -0
  89. package/esm2020/testing/test-element.mjs +1 -1
  90. package/esm2020/testing/testbed/fake-events/type-in-element.mjs +13 -4
  91. package/esm2020/testing/testbed/unit-test-element.mjs +21 -5
  92. package/esm2020/text-field/autofill.mjs +7 -7
  93. package/esm2020/text-field/autosize.mjs +4 -4
  94. package/esm2020/text-field/text-field-module.mjs +5 -7
  95. package/esm2020/tree/nested-node.mjs +4 -4
  96. package/esm2020/tree/node.mjs +4 -4
  97. package/esm2020/tree/outlet.mjs +4 -4
  98. package/esm2020/tree/padding.mjs +4 -4
  99. package/esm2020/tree/toggle.mjs +4 -4
  100. package/esm2020/tree/tree-module.mjs +5 -5
  101. package/esm2020/tree/tree.mjs +7 -7
  102. package/esm2020/version.mjs +1 -1
  103. package/fesm2015/a11y.mjs +146 -118
  104. package/fesm2015/a11y.mjs.map +1 -1
  105. package/fesm2015/accordion.mjs +10 -10
  106. package/fesm2015/accordion.mjs.map +1 -1
  107. package/fesm2015/bidi.mjs +10 -10
  108. package/fesm2015/bidi.mjs.map +1 -1
  109. package/fesm2015/cdk.mjs +1 -1
  110. package/fesm2015/cdk.mjs.map +1 -1
  111. package/fesm2015/clipboard.mjs +10 -10
  112. package/fesm2015/clipboard.mjs.map +1 -1
  113. package/fesm2015/coercion.mjs.map +1 -1
  114. package/fesm2015/collections.mjs +3 -3
  115. package/fesm2015/collections.mjs.map +1 -1
  116. package/fesm2015/drag-drop.mjs +126 -86
  117. package/fesm2015/drag-drop.mjs.map +1 -1
  118. package/fesm2015/keycodes.mjs.map +1 -1
  119. package/fesm2015/layout.mjs +10 -10
  120. package/fesm2015/layout.mjs.map +1 -1
  121. package/fesm2015/observers.mjs +13 -13
  122. package/fesm2015/observers.mjs.map +1 -1
  123. package/fesm2015/overlay.mjs +202 -99
  124. package/fesm2015/overlay.mjs.map +1 -1
  125. package/fesm2015/platform.mjs +7 -7
  126. package/fesm2015/platform.mjs.map +1 -1
  127. package/fesm2015/portal.mjs +58 -24
  128. package/fesm2015/portal.mjs.map +1 -1
  129. package/fesm2015/scrolling.mjs +35 -31
  130. package/fesm2015/scrolling.mjs.map +1 -1
  131. package/fesm2015/stepper.mjs +24 -37
  132. package/fesm2015/stepper.mjs.map +1 -1
  133. package/fesm2015/table.mjs +78 -78
  134. package/fesm2015/table.mjs.map +1 -1
  135. package/fesm2015/testing/selenium-webdriver.mjs +7 -2
  136. package/fesm2015/testing/selenium-webdriver.mjs.map +1 -1
  137. package/fesm2015/testing/testbed.mjs +32 -8
  138. package/fesm2015/testing/testbed.mjs.map +1 -1
  139. package/fesm2015/testing.mjs +39 -1
  140. package/fesm2015/testing.mjs.map +1 -1
  141. package/fesm2015/text-field.mjs +14 -15
  142. package/fesm2015/text-field.mjs.map +1 -1
  143. package/fesm2015/tree.mjs +25 -25
  144. package/fesm2015/tree.mjs.map +1 -1
  145. package/fesm2020/a11y.mjs +142 -116
  146. package/fesm2020/a11y.mjs.map +1 -1
  147. package/fesm2020/accordion.mjs +10 -10
  148. package/fesm2020/accordion.mjs.map +1 -1
  149. package/fesm2020/bidi.mjs +10 -10
  150. package/fesm2020/bidi.mjs.map +1 -1
  151. package/fesm2020/cdk.mjs +1 -1
  152. package/fesm2020/cdk.mjs.map +1 -1
  153. package/fesm2020/clipboard.mjs +10 -10
  154. package/fesm2020/clipboard.mjs.map +1 -1
  155. package/fesm2020/coercion.mjs.map +1 -1
  156. package/fesm2020/collections.mjs +3 -3
  157. package/fesm2020/collections.mjs.map +1 -1
  158. package/fesm2020/drag-drop.mjs +125 -86
  159. package/fesm2020/drag-drop.mjs.map +1 -1
  160. package/fesm2020/keycodes.mjs.map +1 -1
  161. package/fesm2020/layout.mjs +10 -10
  162. package/fesm2020/layout.mjs.map +1 -1
  163. package/fesm2020/observers.mjs +13 -13
  164. package/fesm2020/observers.mjs.map +1 -1
  165. package/fesm2020/overlay.mjs +202 -99
  166. package/fesm2020/overlay.mjs.map +1 -1
  167. package/fesm2020/platform.mjs +7 -7
  168. package/fesm2020/platform.mjs.map +1 -1
  169. package/fesm2020/portal.mjs +58 -24
  170. package/fesm2020/portal.mjs.map +1 -1
  171. package/fesm2020/scrolling.mjs +35 -31
  172. package/fesm2020/scrolling.mjs.map +1 -1
  173. package/fesm2020/stepper.mjs +24 -37
  174. package/fesm2020/stepper.mjs.map +1 -1
  175. package/fesm2020/table.mjs +78 -78
  176. package/fesm2020/table.mjs.map +1 -1
  177. package/fesm2020/testing/selenium-webdriver.mjs +7 -2
  178. package/fesm2020/testing/selenium-webdriver.mjs.map +1 -1
  179. package/fesm2020/testing/testbed.mjs +32 -8
  180. package/fesm2020/testing/testbed.mjs.map +1 -1
  181. package/fesm2020/testing.mjs +33 -1
  182. package/fesm2020/testing.mjs.map +1 -1
  183. package/fesm2020/text-field.mjs +14 -15
  184. package/fesm2020/text-field.mjs.map +1 -1
  185. package/fesm2020/tree.mjs +25 -25
  186. package/fesm2020/tree.mjs.map +1 -1
  187. package/overlay/_index.scss +11 -1
  188. package/overlay/dispatchers/overlay-keyboard-dispatcher.d.ts +7 -2
  189. package/overlay/dispatchers/overlay-outside-click-dispatcher.d.ts +8 -2
  190. package/overlay/overlay-ref.d.ts +4 -1
  191. package/overlay/overlay.d.ts +3 -2
  192. package/overlay/position/flexible-connected-position-strategy.d.ts +2 -0
  193. package/overlay/position/global-position-strategy.d.ts +14 -3
  194. package/overlay/public-api.d.ts +1 -1
  195. package/overlay-prebuilt.css +1 -1
  196. package/package.json +3 -11
  197. package/portal/dom-portal-outlet.d.ts +17 -6
  198. package/portal/portal.d.ts +12 -2
  199. package/schematics/collection.json +2 -1
  200. package/schematics/index.js +6 -2
  201. package/schematics/index.mjs +6 -2
  202. package/schematics/migration.json +5 -0
  203. package/schematics/ng-add/index.js +1 -1
  204. package/schematics/ng-add/index.mjs +1 -1
  205. package/schematics/ng-generate/drag-drop/index.js +5 -14
  206. package/schematics/ng-generate/drag-drop/index.mjs +5 -14
  207. package/schematics/ng-generate/drag-drop/schema.json +1 -1
  208. package/schematics/ng-update/data/constructor-checks.js +7 -1
  209. package/schematics/ng-update/data/constructor-checks.mjs +7 -1
  210. package/schematics/ng-update/data/index.js +6 -2
  211. package/schematics/ng-update/data/index.mjs +6 -2
  212. package/schematics/ng-update/devkit-migration-rule.js +5 -14
  213. package/schematics/ng-update/devkit-migration-rule.mjs +5 -14
  214. package/schematics/ng-update/devkit-migration.js +1 -1
  215. package/schematics/ng-update/devkit-migration.mjs +1 -1
  216. package/schematics/ng-update/html-parsing/elements.js +2 -3
  217. package/schematics/ng-update/html-parsing/elements.mjs +2 -3
  218. package/schematics/ng-update/index.d.ts +2 -0
  219. package/schematics/ng-update/index.js +7 -2
  220. package/schematics/ng-update/index.mjs +7 -2
  221. package/schematics/ng-update/migrations/symbol-removal.js +2 -3
  222. package/schematics/ng-update/migrations/symbol-removal.mjs +2 -3
  223. package/schematics/ng-update/public-api.js +6 -2
  224. package/schematics/ng-update/public-api.mjs +6 -2
  225. package/schematics/tsconfig.json +2 -10
  226. package/schematics/update-tool/public-api.js +6 -2
  227. package/schematics/update-tool/public-api.mjs +6 -2
  228. package/schematics/update-tool/target-version.d.ts +2 -1
  229. package/schematics/update-tool/target-version.js +2 -1
  230. package/schematics/update-tool/target-version.mjs +2 -1
  231. package/schematics/utils/ast.js +11 -22
  232. package/schematics/utils/ast.mjs +11 -22
  233. package/schematics/utils/build-component.js +10 -15
  234. package/schematics/utils/build-component.mjs +10 -15
  235. package/schematics/utils/get-project.d.ts +1 -1
  236. package/schematics/utils/get-project.js +7 -2
  237. package/schematics/utils/get-project.mjs +7 -2
  238. package/schematics/utils/html-manipulation.js +3 -1
  239. package/schematics/utils/html-manipulation.mjs +3 -1
  240. package/schematics/utils/index.js +6 -2
  241. package/schematics/utils/index.mjs +6 -2
  242. package/schematics/utils/project-index-file.js +2 -2
  243. package/schematics/utils/project-index-file.mjs +2 -2
  244. package/schematics/utils/project-targets.js +3 -4
  245. package/schematics/utils/project-targets.mjs +3 -4
  246. package/schematics/utils/project-tsconfig-paths.js +16 -28
  247. package/schematics/utils/project-tsconfig-paths.mjs +16 -28
  248. package/scrolling/scrolling-module.d.ts +1 -2
  249. package/stepper/stepper.d.ts +3 -12
  250. package/table/table.d.ts +2 -6
  251. package/table/text-column.d.ts +1 -1
  252. package/testing/component-harness.d.ts +18 -0
  253. package/testing/harness-environment.d.ts +2 -0
  254. package/testing/public-api.d.ts +1 -0
  255. package/testing/{protractor/index.d.ts → test-element-errors.d.ts} +5 -1
  256. package/testing/test-element.d.ts +4 -2
  257. package/testing/testbed/fake-events/type-in-element.d.ts +2 -2
  258. package/testing/testbed/unit-test-element.d.ts +4 -1
  259. package/text-field/text-field-module.d.ts +1 -2
  260. package/text-field-prebuilt.css +1 -1
  261. package/esm2020/testing/protractor/index.mjs +0 -9
  262. package/esm2020/testing/protractor/protractor-element.mjs +0 -234
  263. package/esm2020/testing/protractor/protractor-harness-environment.mjs +0 -72
  264. package/esm2020/testing/protractor/public-api.mjs +0 -10
  265. package/fesm2015/testing/protractor.mjs +0 -355
  266. package/fesm2015/testing/protractor.mjs.map +0 -1
  267. package/fesm2020/testing/protractor.mjs +0 -322
  268. package/fesm2020/testing/protractor.mjs.map +0 -1
  269. package/testing/protractor/package.json +0 -9
  270. package/testing/protractor/protractor-element.d.ts +0 -90
  271. package/testing/protractor/protractor-harness-environment.d.ts +0 -50
  272. package/testing/protractor/public-api.d.ts +0 -9
@@ -6,15 +6,6 @@
6
6
  * Use of this source code is governed by an MIT-style license that can be
7
7
  * found in the LICENSE file at https://angular.io/license
8
8
  */
9
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
10
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
11
- return new (P || (P = Promise))(function (resolve, reject) {
12
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
13
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
14
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
15
- step((generator = generator.apply(thisArg, _arguments || [])).next());
16
- });
17
- };
18
9
  Object.defineProperty(exports, "__esModule", { value: true });
19
10
  exports.getWorkspaceConfigGracefully = exports.getTargetTsconfigPath = void 0;
20
11
  const core_1 = require("@angular-devkit/core");
@@ -23,28 +14,25 @@ const reader_1 = require("@angular-devkit/core/src/workspace/json/reader");
23
14
  const defaultWorkspaceConfigPaths = ['/angular.json', '/.angular.json'];
24
15
  /** Gets the tsconfig path from the given target within the specified project. */
25
16
  function getTargetTsconfigPath(project, targetName) {
26
- var _a, _b, _c;
27
- const tsconfig = (_c = (_b = (_a = project.targets) === null || _a === void 0 ? void 0 : _a.get(targetName)) === null || _b === void 0 ? void 0 : _b.options) === null || _c === void 0 ? void 0 : _c.tsConfig;
17
+ const tsconfig = project.targets?.get(targetName)?.options?.tsConfig;
28
18
  return tsconfig ? (0, core_1.normalize)(tsconfig) : null;
29
19
  }
30
20
  exports.getTargetTsconfigPath = getTargetTsconfigPath;
31
21
  /** Resolve the workspace configuration of the specified tree gracefully. */
32
- function getWorkspaceConfigGracefully(tree) {
33
- return __awaiter(this, void 0, void 0, function* () {
34
- const path = defaultWorkspaceConfigPaths.find(filePath => tree.exists(filePath));
35
- const configBuffer = tree.read(path);
36
- if (!path || !configBuffer) {
37
- return null;
38
- }
39
- try {
40
- return yield (0, reader_1.readJsonWorkspace)(path, {
41
- readFile: (filePath) => __awaiter(this, void 0, void 0, function* () { return tree.read(filePath).toString(); }),
42
- });
43
- }
44
- catch (_a) {
45
- return null;
46
- }
47
- });
22
+ async function getWorkspaceConfigGracefully(tree) {
23
+ const path = defaultWorkspaceConfigPaths.find(filePath => tree.exists(filePath));
24
+ const configBuffer = tree.read(path);
25
+ if (!path || !configBuffer) {
26
+ return null;
27
+ }
28
+ try {
29
+ return await (0, reader_1.readJsonWorkspace)(path, {
30
+ readFile: async (filePath) => tree.read(filePath).toString(),
31
+ });
32
+ }
33
+ catch {
34
+ return null;
35
+ }
48
36
  }
49
37
  exports.getWorkspaceConfigGracefully = getWorkspaceConfigGracefully;
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC10c2NvbmZpZy1wYXRocy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jZGsvc2NoZW1hdGljcy91dGlscy9wcm9qZWN0LXRzY29uZmlnLXBhdGhzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztBQUVILCtDQUErQztBQU0vQywyRUFBaUY7QUFJakYscUVBQXFFO0FBQ3JFLE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztBQUV4RSxpRkFBaUY7QUFDakYsU0FBZ0IscUJBQXFCLENBQ25DLE9BQTBCLEVBQzFCLFVBQWtCOztJQUVsQixNQUFNLFFBQVEsR0FBRyxNQUFBLE1BQUEsTUFBQSxPQUFPLENBQUMsT0FBTywwQ0FBRSxHQUFHLENBQUMsVUFBVSxDQUFDLDBDQUFFLE9BQU8sMENBQUUsUUFBUSxDQUFDO0lBQ3JFLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFBLGdCQUFTLEVBQUMsUUFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDekQsQ0FBQztBQU5ELHNEQU1DO0FBRUQsNEVBQTRFO0FBQzVFLFNBQXNCLDRCQUE0QixDQUNoRCxJQUFVOztRQUVWLE1BQU0sSUFBSSxHQUFHLDJCQUEyQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNqRixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUssQ0FBQyxDQUFDO1FBRXRDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDMUIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQUk7WUFDRixPQUFPLE1BQU0sSUFBQSwwQkFBaUIsRUFBQyxJQUFJLEVBQUU7Z0JBQ25DLFFBQVEsRUFBRSxDQUFNLFFBQVEsRUFBQyxFQUFFLGdEQUFDLE9BQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQSxHQUFBO2FBQzNDLENBQUMsQ0FBQztTQUNyQjtRQUFDLFdBQU07WUFDTixPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQztDQUFBO0FBakJELG9FQWlCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge25vcm1hbGl6ZX0gZnJvbSAnQGFuZ3VsYXItZGV2a2l0L2NvcmUnO1xuaW1wb3J0IHtcbiAgUHJvamVjdERlZmluaXRpb24sXG4gIFdvcmtzcGFjZURlZmluaXRpb24sXG4gIFdvcmtzcGFjZUhvc3QsXG59IGZyb20gJ0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy93b3Jrc3BhY2UnO1xuaW1wb3J0IHtyZWFkSnNvbldvcmtzcGFjZX0gZnJvbSAnQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3dvcmtzcGFjZS9qc29uL3JlYWRlcic7XG5pbXBvcnQge1RyZWV9IGZyb20gJ0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzJztcbmltcG9ydCB7V29ya3NwYWNlUGF0aH0gZnJvbSAnLi4vdXBkYXRlLXRvb2wvZmlsZS1zeXN0ZW0nO1xuXG4vKiogTmFtZSBvZiB0aGUgZGVmYXVsdCBBbmd1bGFyIENMSSB3b3Jrc3BhY2UgY29uZmlndXJhdGlvbiBmaWxlcy4gKi9cbmNvbnN0IGRlZmF1bHRXb3Jrc3BhY2VDb25maWdQYXRocyA9IFsnL2FuZ3VsYXIuanNvbicsICcvLmFuZ3VsYXIuanNvbiddO1xuXG4vKiogR2V0cyB0aGUgdHNjb25maWcgcGF0aCBmcm9tIHRoZSBnaXZlbiB0YXJnZXQgd2l0aGluIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYXJnZXRUc2NvbmZpZ1BhdGgoXG4gIHByb2plY3Q6IFByb2plY3REZWZpbml0aW9uLFxuICB0YXJnZXROYW1lOiBzdHJpbmcsXG4pOiBXb3Jrc3BhY2VQYXRoIHwgbnVsbCB7XG4gIGNvbnN0IHRzY29uZmlnID0gcHJvamVjdC50YXJnZXRzPy5nZXQodGFyZ2V0TmFtZSk/Lm9wdGlvbnM/LnRzQ29uZmlnO1xuICByZXR1cm4gdHNjb25maWcgPyBub3JtYWxpemUodHNjb25maWcgYXMgc3RyaW5nKSA6IG51bGw7XG59XG5cbi8qKiBSZXNvbHZlIHRoZSB3b3Jrc3BhY2UgY29uZmlndXJhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHRyZWUgZ3JhY2VmdWxseS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VDb25maWdHcmFjZWZ1bGx5KFxuICB0cmVlOiBUcmVlLFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VEZWZpbml0aW9uIHwgbnVsbD4ge1xuICBjb25zdCBwYXRoID0gZGVmYXVsdFdvcmtzcGFjZUNvbmZpZ1BhdGhzLmZpbmQoZmlsZVBhdGggPT4gdHJlZS5leGlzdHMoZmlsZVBhdGgpKTtcbiAgY29uc3QgY29uZmlnQnVmZmVyID0gdHJlZS5yZWFkKHBhdGghKTtcblxuICBpZiAoIXBhdGggfHwgIWNvbmZpZ0J1ZmZlcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcmVhZEpzb25Xb3Jrc3BhY2UocGF0aCwge1xuICAgICAgcmVhZEZpbGU6IGFzeW5jIGZpbGVQYXRoID0+IHRyZWUucmVhZChmaWxlUGF0aCkhLnRvU3RyaW5nKCksXG4gICAgfSBhcyBXb3Jrc3BhY2VIb3N0KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdfQ==
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC10c2NvbmZpZy1wYXRocy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jZGsvc2NoZW1hdGljcy91dGlscy9wcm9qZWN0LXRzY29uZmlnLXBhdGhzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUc7OztBQUVILCtDQUErQztBQU0vQywyRUFBaUY7QUFJakYscUVBQXFFO0FBQ3JFLE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztBQUV4RSxpRkFBaUY7QUFDakYsU0FBZ0IscUJBQXFCLENBQ25DLE9BQTBCLEVBQzFCLFVBQWtCO0lBRWxCLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUM7SUFDckUsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUEsZ0JBQVMsRUFBQyxRQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUN6RCxDQUFDO0FBTkQsc0RBTUM7QUFFRCw0RUFBNEU7QUFDckUsS0FBSyxVQUFVLDRCQUE0QixDQUNoRCxJQUFVO0lBRVYsTUFBTSxJQUFJLEdBQUcsMkJBQTJCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSyxDQUFDLENBQUM7SUFFdEMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtRQUMxQixPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsSUFBSTtRQUNGLE9BQU8sTUFBTSxJQUFBLDBCQUFpQixFQUFDLElBQUksRUFBRTtZQUNuQyxRQUFRLEVBQUUsS0FBSyxFQUFDLFFBQVEsRUFBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUUsQ0FBQyxRQUFRLEVBQUU7U0FDM0MsQ0FBQyxDQUFDO0tBQ3JCO0lBQUMsTUFBTTtRQUNOLE9BQU8sSUFBSSxDQUFDO0tBQ2I7QUFDSCxDQUFDO0FBakJELG9FQWlCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge25vcm1hbGl6ZX0gZnJvbSAnQGFuZ3VsYXItZGV2a2l0L2NvcmUnO1xuaW1wb3J0IHtcbiAgUHJvamVjdERlZmluaXRpb24sXG4gIFdvcmtzcGFjZURlZmluaXRpb24sXG4gIFdvcmtzcGFjZUhvc3QsXG59IGZyb20gJ0Bhbmd1bGFyLWRldmtpdC9jb3JlL3NyYy93b3Jrc3BhY2UnO1xuaW1wb3J0IHtyZWFkSnNvbldvcmtzcGFjZX0gZnJvbSAnQGFuZ3VsYXItZGV2a2l0L2NvcmUvc3JjL3dvcmtzcGFjZS9qc29uL3JlYWRlcic7XG5pbXBvcnQge1RyZWV9IGZyb20gJ0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzJztcbmltcG9ydCB7V29ya3NwYWNlUGF0aH0gZnJvbSAnLi4vdXBkYXRlLXRvb2wvZmlsZS1zeXN0ZW0nO1xuXG4vKiogTmFtZSBvZiB0aGUgZGVmYXVsdCBBbmd1bGFyIENMSSB3b3Jrc3BhY2UgY29uZmlndXJhdGlvbiBmaWxlcy4gKi9cbmNvbnN0IGRlZmF1bHRXb3Jrc3BhY2VDb25maWdQYXRocyA9IFsnL2FuZ3VsYXIuanNvbicsICcvLmFuZ3VsYXIuanNvbiddO1xuXG4vKiogR2V0cyB0aGUgdHNjb25maWcgcGF0aCBmcm9tIHRoZSBnaXZlbiB0YXJnZXQgd2l0aGluIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYXJnZXRUc2NvbmZpZ1BhdGgoXG4gIHByb2plY3Q6IFByb2plY3REZWZpbml0aW9uLFxuICB0YXJnZXROYW1lOiBzdHJpbmcsXG4pOiBXb3Jrc3BhY2VQYXRoIHwgbnVsbCB7XG4gIGNvbnN0IHRzY29uZmlnID0gcHJvamVjdC50YXJnZXRzPy5nZXQodGFyZ2V0TmFtZSk/Lm9wdGlvbnM/LnRzQ29uZmlnO1xuICByZXR1cm4gdHNjb25maWcgPyBub3JtYWxpemUodHNjb25maWcgYXMgc3RyaW5nKSA6IG51bGw7XG59XG5cbi8qKiBSZXNvbHZlIHRoZSB3b3Jrc3BhY2UgY29uZmlndXJhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHRyZWUgZ3JhY2VmdWxseS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VDb25maWdHcmFjZWZ1bGx5KFxuICB0cmVlOiBUcmVlLFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VEZWZpbml0aW9uIHwgbnVsbD4ge1xuICBjb25zdCBwYXRoID0gZGVmYXVsdFdvcmtzcGFjZUNvbmZpZ1BhdGhzLmZpbmQoZmlsZVBhdGggPT4gdHJlZS5leGlzdHMoZmlsZVBhdGgpKTtcbiAgY29uc3QgY29uZmlnQnVmZmVyID0gdHJlZS5yZWFkKHBhdGghKTtcblxuICBpZiAoIXBhdGggfHwgIWNvbmZpZ0J1ZmZlcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcmVhZEpzb25Xb3Jrc3BhY2UocGF0aCwge1xuICAgICAgcmVhZEZpbGU6IGFzeW5jIGZpbGVQYXRoID0+IHRyZWUucmVhZChmaWxlUGF0aCkhLnRvU3RyaW5nKCksXG4gICAgfSBhcyBXb3Jrc3BhY2VIb3N0KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdfQ==
@@ -4,7 +4,6 @@ import * as i2 from "./fixed-size-virtual-scroll";
4
4
  import * as i3 from "./virtual-for-of";
5
5
  import * as i4 from "./virtual-scroll-viewport";
6
6
  import * as i5 from "@angular/cdk/bidi";
7
- import * as i6 from "@angular/cdk/platform";
8
7
  export declare class CdkScrollableModule {
9
8
  static ɵfac: i0.ɵɵFactoryDeclaration<CdkScrollableModule, never>;
10
9
  static ɵmod: i0.ɵɵNgModuleDeclaration<CdkScrollableModule, [typeof i1.CdkScrollable], never, [typeof i1.CdkScrollable]>;
@@ -15,6 +14,6 @@ export declare class CdkScrollableModule {
15
14
  */
16
15
  export declare class ScrollingModule {
17
16
  static ɵfac: i0.ɵɵFactoryDeclaration<ScrollingModule, never>;
18
- static ɵmod: i0.ɵɵNgModuleDeclaration<ScrollingModule, [typeof i2.CdkFixedSizeVirtualScroll, typeof i3.CdkVirtualForOf, typeof i4.CdkVirtualScrollViewport], [typeof i5.BidiModule, typeof i6.PlatformModule, typeof CdkScrollableModule], [typeof i5.BidiModule, typeof CdkScrollableModule, typeof i2.CdkFixedSizeVirtualScroll, typeof i3.CdkVirtualForOf, typeof i4.CdkVirtualScrollViewport]>;
17
+ static ɵmod: i0.ɵɵNgModuleDeclaration<ScrollingModule, [typeof i2.CdkFixedSizeVirtualScroll, typeof i3.CdkVirtualForOf, typeof i4.CdkVirtualScrollViewport], [typeof i5.BidiModule, typeof CdkScrollableModule], [typeof i5.BidiModule, typeof CdkScrollableModule, typeof i2.CdkFixedSizeVirtualScroll, typeof i3.CdkVirtualForOf, typeof i4.CdkVirtualScrollViewport]>;
19
18
  static ɵinj: i0.ɵɵInjectorDeclaration<ScrollingModule>;
20
19
  }
@@ -139,17 +139,8 @@ export declare class CdkStepper implements AfterContentInit, AfterViewInit, OnDe
139
139
  /** Orientation of the stepper. */
140
140
  get orientation(): StepperOrientation;
141
141
  set orientation(value: StepperOrientation);
142
- /**
143
- * @deprecated To be turned into a private property. Use `orientation` instead.
144
- * @breaking-change 13.0.0
145
- */
146
- protected _orientation: StepperOrientation;
147
- constructor(_dir: Directionality, _changeDetectorRef: ChangeDetectorRef, _elementRef: ElementRef<HTMLElement>,
148
- /**
149
- * @deprecated No longer in use, to be removed.
150
- * @breaking-change 13.0.0
151
- */
152
- _document: any);
142
+ private _orientation;
143
+ constructor(_dir: Directionality, _changeDetectorRef: ChangeDetectorRef, _elementRef: ElementRef<HTMLElement>);
153
144
  ngAfterContentInit(): void;
154
145
  ngAfterViewInit(): void;
155
146
  ngOnDestroy(): void;
@@ -182,7 +173,7 @@ export declare class CdkStepper implements AfterContentInit, AfterViewInit, OnDe
182
173
  private _containsFocus;
183
174
  /** Checks whether the passed-in index is a valid step index. */
184
175
  private _isValidIndex;
185
- static ɵfac: i0.ɵɵFactoryDeclaration<CdkStepper, [{ optional: true; }, null, null, null]>;
176
+ static ɵfac: i0.ɵɵFactoryDeclaration<CdkStepper, [{ optional: true; }, null, null]>;
186
177
  static ɵdir: i0.ɵɵDirectiveDeclaration<CdkStepper, "[cdkStepper]", ["cdkStepper"], { "linear": "linear"; "selectedIndex": "selectedIndex"; "selected": "selected"; "orientation": "orientation"; }, { "selectionChange": "selectionChange"; }, ["_steps", "_stepHeader"]>;
187
178
  }
188
179
  /**
package/table/table.d.ts CHANGED
@@ -29,11 +29,8 @@ export declare class CdkRecycleRows {
29
29
  export interface RowOutlet {
30
30
  viewContainer: ViewContainerRef;
31
31
  }
32
- /**
33
- * Union of the types that can be set as the data source for a `CdkTable`.
34
- * @docs-private
35
- */
36
- declare type CdkTableDataSourceInput<T> = readonly T[] | DataSource<T> | Observable<readonly T[]>;
32
+ /** Possible types that can be set as the data source for a `CdkTable`. */
33
+ export declare type CdkTableDataSourceInput<T> = readonly T[] | DataSource<T> | Observable<readonly T[]>;
37
34
  /**
38
35
  * Provides a handle for the table to grab the view container's ng-container to insert data rows.
39
36
  * @docs-private
@@ -491,4 +488,3 @@ export declare class CdkTable<T> implements AfterContentChecked, CollectionViewe
491
488
  static ɵfac: i0.ɵɵFactoryDeclaration<CdkTable<any>, [null, null, null, { attribute: "role"; }, { optional: true; }, null, null, null, null, null, { optional: true; skipSelf: true; }, { optional: true; }]>;
492
489
  static ɵcmp: i0.ɵɵComponentDeclaration<CdkTable<any>, "cdk-table, table[cdk-table]", ["cdkTable"], { "trackBy": "trackBy"; "dataSource": "dataSource"; "multiTemplateDataRows": "multiTemplateDataRows"; "fixedLayout": "fixedLayout"; }, { "contentChanged": "contentChanged"; }, ["_noDataRow", "_contentColumnDefs", "_contentRowDefs", "_contentHeaderRowDefs", "_contentFooterRowDefs"], ["caption", "colgroup, col"]>;
493
490
  }
494
- export {};
@@ -39,7 +39,7 @@ export declare class CdkTextColumn<T> implements OnDestroy, OnInit {
39
39
  */
40
40
  dataAccessor: (data: T, name: string) => string;
41
41
  /** Alignment of the cell values. */
42
- justify: 'start' | 'end';
42
+ justify: 'start' | 'end' | 'center';
43
43
  /** @docs-private */
44
44
  columnDef: CdkColumnDef;
45
45
  /**
@@ -76,6 +76,15 @@ export interface HarnessLoader {
76
76
  * @throws If a matching component instance can't be found.
77
77
  */
78
78
  getHarness<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T>;
79
+ /**
80
+ * Searches for an instance of the component corresponding to the given harness type under the
81
+ * `HarnessLoader`'s root element, and returns a `ComponentHarness` for that instance. If multiple
82
+ * matching components are found, a harness for the first one is returned. If no matching
83
+ * component is found, null is returned.
84
+ * @param query A query for a harness to create
85
+ * @return An instance of the given harness type (or null if not found).
86
+ */
87
+ getHarnessOrNull<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T | null>;
79
88
  /**
80
89
  * Searches for all instances of the component corresponding to the given harness type under the
81
90
  * `HarnessLoader`'s root element, and returns a list `ComponentHarness` for each instance.
@@ -83,6 +92,13 @@ export interface HarnessLoader {
83
92
  * @return A list instances of the given harness type.
84
93
  */
85
94
  getAllHarnesses<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T[]>;
95
+ /**
96
+ * Searches for an instance of the component corresponding to the given harness type under the
97
+ * `HarnessLoader`'s root element, and returns a boolean indicating if any were found.
98
+ * @param query A query for a harness to create
99
+ * @return A boolean indicating if an instance was found.
100
+ */
101
+ hasHarness<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<boolean>;
86
102
  }
87
103
  /**
88
104
  * Interface used to create asynchronous locator functions used find elements and component
@@ -326,7 +342,9 @@ export declare abstract class ContentContainerComponentHarness<S extends string
326
342
  getChildLoader(selector: S): Promise<HarnessLoader>;
327
343
  getAllChildLoaders(selector: S): Promise<HarnessLoader[]>;
328
344
  getHarness<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T>;
345
+ getHarnessOrNull<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T | null>;
329
346
  getAllHarnesses<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T[]>;
347
+ hasHarness<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<boolean>;
330
348
  /**
331
349
  * Gets the root harness loader from which to start
332
350
  * searching for content contained by this harness.
@@ -28,7 +28,9 @@ export declare abstract class HarnessEnvironment<E> implements HarnessLoader, Lo
28
28
  harnessLoaderForOptional(selector: string): Promise<HarnessLoader | null>;
29
29
  harnessLoaderForAll(selector: string): Promise<HarnessLoader[]>;
30
30
  getHarness<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T>;
31
+ getHarnessOrNull<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T | null>;
31
32
  getAllHarnesses<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T[]>;
33
+ hasHarness<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<boolean>;
32
34
  getChildLoader(selector: string): Promise<HarnessLoader>;
33
35
  getAllChildLoaders(selector: string): Promise<HarnessLoader[]>;
34
36
  /** Creates a `ComponentHarness` for the given harness type with the given raw host element. */
@@ -8,6 +8,7 @@
8
8
  export * from './component-harness';
9
9
  export * from './harness-environment';
10
10
  export * from './test-element';
11
+ export * from './test-element-errors';
11
12
  export * from './element-dimensions';
12
13
  export * from './text-filtering';
13
14
  export * from './change-detection';
@@ -5,4 +5,8 @@
5
5
  * Use of this source code is governed by an MIT-style license that can be
6
6
  * found in the LICENSE file at https://angular.io/license
7
7
  */
8
- export * from './public-api';
8
+ /**
9
+ * Returns an error which reports that no keys have been specified.
10
+ * @docs-private
11
+ */
12
+ export declare function getNoKeysSpecifiedError(): Error;
@@ -93,11 +93,13 @@ export interface TestElement {
93
93
  * Sends the given string to the input as a series of key presses. Also fires input events
94
94
  * and attempts to add the string to the Element's value. Note that some environments cannot
95
95
  * reproduce native browser behavior for keyboard shortcuts such as Tab, Ctrl + A, etc.
96
+ * @throws An error if no keys have been specified.
96
97
  */
97
98
  sendKeys(...keys: (string | TestKey)[]): Promise<void>;
98
99
  /**
99
- * Sends the given string to the input as a series of key presses. Also fires input events
100
- * and attempts to add the string to the Element's value.
100
+ * Sends the given string to the input as a series of key presses. Also fires input
101
+ * events and attempts to add the string to the Element's value.
102
+ * @throws An error if no keys have been specified.
101
103
  */
102
104
  sendKeys(modifiers: ModifierKeys, ...keys: (string | TestKey)[]): Promise<void>;
103
105
  /**
@@ -12,7 +12,7 @@ import { ModifierKeys } from '@angular/cdk/testing';
12
12
  */
13
13
  export declare function isTextInput(element: Element): element is HTMLInputElement | HTMLTextAreaElement;
14
14
  /**
15
- * Focuses an input, sets its value and dispatches
15
+ * If keys have been specified, focuses an input, sets its value and dispatches
16
16
  * the `input` event, simulating the user typing.
17
17
  * @param element Element onto which to set the value.
18
18
  * @param keys The keys to send to the element.
@@ -23,7 +23,7 @@ export declare function typeInElement(element: HTMLElement, ...keys: (string | {
23
23
  key?: string;
24
24
  })[]): void;
25
25
  /**
26
- * Focuses an input, sets its value and dispatches
26
+ * If keys have been specified, focuses an input, sets its value and dispatches
27
27
  * the `input` event, simulating the user typing.
28
28
  * @param element Element onto which to set the value.
29
29
  * @param modifiers Modifier keys that are held while typing.
@@ -90,6 +90,9 @@ export declare class UnitTestElement implements TestElement {
90
90
  * @param button Mouse button that should be pressed when dispatching the event.
91
91
  */
92
92
  private _dispatchPointerEventIfSupported;
93
- /** Dispatches all the events that are part of a mouse event sequence. */
93
+ /**
94
+ * Dispatches all the events that are part of a mouse event sequence
95
+ * and then emits a given primary event at the end, if speciifed.
96
+ */
94
97
  private _dispatchMouseEventSequence;
95
98
  }
@@ -1,9 +1,8 @@
1
1
  import * as i0 from "@angular/core";
2
2
  import * as i1 from "./autofill";
3
3
  import * as i2 from "./autosize";
4
- import * as i3 from "@angular/cdk/platform";
5
4
  export declare class TextFieldModule {
6
5
  static ɵfac: i0.ɵɵFactoryDeclaration<TextFieldModule, never>;
7
- static ɵmod: i0.ɵɵNgModuleDeclaration<TextFieldModule, [typeof i1.CdkAutofill, typeof i2.CdkTextareaAutosize], [typeof i3.PlatformModule], [typeof i1.CdkAutofill, typeof i2.CdkTextareaAutosize]>;
6
+ static ɵmod: i0.ɵɵNgModuleDeclaration<TextFieldModule, [typeof i1.CdkAutofill, typeof i2.CdkTextareaAutosize], never, [typeof i1.CdkAutofill, typeof i2.CdkTextareaAutosize]>;
8
7
  static ɵinj: i0.ɵɵInjectorDeclaration<TextFieldModule>;
9
8
  }
@@ -1 +1 @@
1
- textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{padding:2px 0 !important;box-sizing:content-box !important;height:auto !important;overflow:hidden !important}textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0 !important;box-sizing:content-box !important;height:0 !important}@keyframes cdk-text-field-autofill-start{/*!*/}@keyframes cdk-text-field-autofill-end{/*!*/}.cdk-text-field-autofill-monitored:-webkit-autofill{animation:cdk-text-field-autofill-start 0s 1ms}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){animation:cdk-text-field-autofill-end 0s 1ms}
1
+ textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{padding:2px 0 !important;box-sizing:content-box !important;height:auto !important;overflow:hidden !important}textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0 !important;box-sizing:content-box !important;height:0 !important}@keyframes cdk-text-field-autofill-start{/*!*/}@keyframes cdk-text-field-autofill-end{/*!*/}.cdk-text-field-autofill-monitored:-webkit-autofill{animation:cdk-text-field-autofill-start 0s 1ms}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){animation:cdk-text-field-autofill-end 0s 1ms}
@@ -1,9 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Google LLC All Rights Reserved.
4
- *
5
- * Use of this source code is governed by an MIT-style license that can be
6
- * found in the LICENSE file at https://angular.io/license
7
- */
8
- export * from './public-api';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvY2RrL3Rlc3RpbmcvcHJvdHJhY3Rvci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -1,234 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Google LLC All Rights Reserved.
4
- *
5
- * Use of this source code is governed by an MIT-style license that can be
6
- * found in the LICENSE file at https://angular.io/license
7
- */
8
- import { _getTextWithExcludedElements, TestKey, } from '@angular/cdk/testing';
9
- import { browser, Button, by, Key } from 'protractor';
10
- /** Maps the `TestKey` constants to Protractor's `Key` constants. */
11
- const keyMap = {
12
- [TestKey.BACKSPACE]: Key.BACK_SPACE,
13
- [TestKey.TAB]: Key.TAB,
14
- [TestKey.ENTER]: Key.ENTER,
15
- [TestKey.SHIFT]: Key.SHIFT,
16
- [TestKey.CONTROL]: Key.CONTROL,
17
- [TestKey.ALT]: Key.ALT,
18
- [TestKey.ESCAPE]: Key.ESCAPE,
19
- [TestKey.PAGE_UP]: Key.PAGE_UP,
20
- [TestKey.PAGE_DOWN]: Key.PAGE_DOWN,
21
- [TestKey.END]: Key.END,
22
- [TestKey.HOME]: Key.HOME,
23
- [TestKey.LEFT_ARROW]: Key.ARROW_LEFT,
24
- [TestKey.UP_ARROW]: Key.ARROW_UP,
25
- [TestKey.RIGHT_ARROW]: Key.ARROW_RIGHT,
26
- [TestKey.DOWN_ARROW]: Key.ARROW_DOWN,
27
- [TestKey.INSERT]: Key.INSERT,
28
- [TestKey.DELETE]: Key.DELETE,
29
- [TestKey.F1]: Key.F1,
30
- [TestKey.F2]: Key.F2,
31
- [TestKey.F3]: Key.F3,
32
- [TestKey.F4]: Key.F4,
33
- [TestKey.F5]: Key.F5,
34
- [TestKey.F6]: Key.F6,
35
- [TestKey.F7]: Key.F7,
36
- [TestKey.F8]: Key.F8,
37
- [TestKey.F9]: Key.F9,
38
- [TestKey.F10]: Key.F10,
39
- [TestKey.F11]: Key.F11,
40
- [TestKey.F12]: Key.F12,
41
- [TestKey.META]: Key.META,
42
- };
43
- /** Converts a `ModifierKeys` object to a list of Protractor `Key`s. */
44
- function toProtractorModifierKeys(modifiers) {
45
- const result = [];
46
- if (modifiers.control) {
47
- result.push(Key.CONTROL);
48
- }
49
- if (modifiers.alt) {
50
- result.push(Key.ALT);
51
- }
52
- if (modifiers.shift) {
53
- result.push(Key.SHIFT);
54
- }
55
- if (modifiers.meta) {
56
- result.push(Key.META);
57
- }
58
- return result;
59
- }
60
- /**
61
- * A `TestElement` implementation for Protractor.
62
- * @deprecated
63
- * @breaking-change 13.0.0
64
- */
65
- export class ProtractorElement {
66
- constructor(element) {
67
- this.element = element;
68
- }
69
- /** Blur the element. */
70
- async blur() {
71
- return browser.executeScript('arguments[0].blur()', this.element);
72
- }
73
- /** Clear the element's input (for input and textarea elements only). */
74
- async clear() {
75
- return this.element.clear();
76
- }
77
- async click(...args) {
78
- await this._dispatchClickEventSequence(args, Button.LEFT);
79
- }
80
- async rightClick(...args) {
81
- await this._dispatchClickEventSequence(args, Button.RIGHT);
82
- }
83
- /** Focus the element. */
84
- async focus() {
85
- return browser.executeScript('arguments[0].focus()', this.element);
86
- }
87
- /** Get the computed value of the given CSS property for the element. */
88
- async getCssValue(property) {
89
- return this.element.getCssValue(property);
90
- }
91
- /** Hovers the mouse over the element. */
92
- async hover() {
93
- return browser
94
- .actions()
95
- .mouseMove(await this.element.getWebElement())
96
- .perform();
97
- }
98
- /** Moves the mouse away from the element. */
99
- async mouseAway() {
100
- return browser
101
- .actions()
102
- .mouseMove(await this.element.getWebElement(), { x: -1, y: -1 })
103
- .perform();
104
- }
105
- async sendKeys(...modifiersAndKeys) {
106
- const first = modifiersAndKeys[0];
107
- let modifiers;
108
- let rest;
109
- if (typeof first !== 'string' && typeof first !== 'number') {
110
- modifiers = first;
111
- rest = modifiersAndKeys.slice(1);
112
- }
113
- else {
114
- modifiers = {};
115
- rest = modifiersAndKeys;
116
- }
117
- const modifierKeys = toProtractorModifierKeys(modifiers);
118
- const keys = rest
119
- .map(k => (typeof k === 'string' ? k.split('') : [keyMap[k]]))
120
- .reduce((arr, k) => arr.concat(k), [])
121
- // Key.chord doesn't work well with geckodriver (mozilla/geckodriver#1502),
122
- // so avoid it if no modifier keys are required.
123
- .map(k => (modifierKeys.length > 0 ? Key.chord(...modifierKeys, k) : k));
124
- return this.element.sendKeys(...keys);
125
- }
126
- /**
127
- * Gets the text from the element.
128
- * @param options Options that affect what text is included.
129
- */
130
- async text(options) {
131
- if (options?.exclude) {
132
- return browser.executeScript(_getTextWithExcludedElements, this.element, options.exclude);
133
- }
134
- // We don't go through Protractor's `getText`, because it excludes text from hidden elements.
135
- return browser.executeScript(`return (arguments[0].textContent || '').trim()`, this.element);
136
- }
137
- /** Gets the value for the given attribute from the element. */
138
- async getAttribute(name) {
139
- return browser.executeScript(`return arguments[0].getAttribute(arguments[1])`, this.element, name);
140
- }
141
- /** Checks whether the element has the given class. */
142
- async hasClass(name) {
143
- const classes = (await this.getAttribute('class')) || '';
144
- return new Set(classes.split(/\s+/).filter(c => c)).has(name);
145
- }
146
- /** Gets the dimensions of the element. */
147
- async getDimensions() {
148
- const { width, height } = await this.element.getSize();
149
- const { x: left, y: top } = await this.element.getLocation();
150
- return { width, height, left, top };
151
- }
152
- /** Gets the value of a property of an element. */
153
- async getProperty(name) {
154
- return browser.executeScript(`return arguments[0][arguments[1]]`, this.element, name);
155
- }
156
- /** Sets the value of a property of an input. */
157
- async setInputValue(value) {
158
- return browser.executeScript(`arguments[0].value = arguments[1]`, this.element, value);
159
- }
160
- /** Selects the options at the specified indexes inside of a native `select` element. */
161
- async selectOptions(...optionIndexes) {
162
- const options = await this.element.all(by.css('option'));
163
- const indexes = new Set(optionIndexes); // Convert to a set to remove duplicates.
164
- if (options.length && indexes.size) {
165
- // Reset the value so all the selected states are cleared. We can
166
- // reuse the input-specific method since the logic is the same.
167
- await this.setInputValue('');
168
- for (let i = 0; i < options.length; i++) {
169
- if (indexes.has(i)) {
170
- // We have to hold the control key while clicking on options so that multiple can be
171
- // selected in multi-selection mode. The key doesn't do anything for single selection.
172
- await browser.actions().keyDown(Key.CONTROL).perform();
173
- await options[i].click();
174
- await browser.actions().keyUp(Key.CONTROL).perform();
175
- }
176
- }
177
- }
178
- }
179
- /** Checks whether this element matches the given selector. */
180
- async matchesSelector(selector) {
181
- return browser.executeScript(`
182
- return (Element.prototype.matches ||
183
- Element.prototype.msMatchesSelector).call(arguments[0], arguments[1])
184
- `, this.element, selector);
185
- }
186
- /** Checks whether the element is focused. */
187
- async isFocused() {
188
- return this.element.equals(browser.driver.switchTo().activeElement());
189
- }
190
- /**
191
- * Dispatches an event with a particular name.
192
- * @param name Name of the event to be dispatched.
193
- */
194
- async dispatchEvent(name, data) {
195
- return browser.executeScript(_dispatchEvent, name, this.element, data);
196
- }
197
- /** Dispatches all the events that are part of a click event sequence. */
198
- async _dispatchClickEventSequence(args, button) {
199
- let modifiers = {};
200
- if (args.length && typeof args[args.length - 1] === 'object') {
201
- modifiers = args.pop();
202
- }
203
- const modifierKeys = toProtractorModifierKeys(modifiers);
204
- // Omitting the offset argument to mouseMove results in clicking the center.
205
- // This is the default behavior we want, so we use an empty array of offsetArgs if
206
- // no args remain after popping the modifiers from the args passed to this function.
207
- const offsetArgs = (args.length === 2 ? [{ x: args[0], y: args[1] }] : []);
208
- let actions = browser.actions().mouseMove(await this.element.getWebElement(), ...offsetArgs);
209
- for (const modifierKey of modifierKeys) {
210
- actions = actions.keyDown(modifierKey);
211
- }
212
- actions = actions.click(button);
213
- for (const modifierKey of modifierKeys) {
214
- actions = actions.keyUp(modifierKey);
215
- }
216
- await actions.perform();
217
- }
218
- }
219
- /**
220
- * Dispatches an event with a particular name and data to an element.
221
- * Note that this needs to be a pure function, because it gets stringified by
222
- * Protractor and is executed inside the browser.
223
- */
224
- function _dispatchEvent(name, element, data) {
225
- const event = document.createEvent('Event');
226
- event.initEvent(name);
227
- if (data) {
228
- // tslint:disable-next-line:ban Have to use `Object.assign` to preserve the original object.
229
- Object.assign(event, data);
230
- }
231
- // This type has a string index signature, so we cannot access it using a dotted property access.
232
- element['dispatchEvent'](event);
233
- }
234
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdHJhY3Rvci1lbGVtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Nkay90ZXN0aW5nL3Byb3RyYWN0b3IvcHJvdHJhY3Rvci1lbGVtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFDTCw0QkFBNEIsRUFJNUIsT0FBTyxHQUdSLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFpQixHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFbkUsb0VBQW9FO0FBQ3BFLE1BQU0sTUFBTSxHQUFHO0lBQ2IsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxDQUFDLFVBQVU7SUFDbkMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7SUFDdEIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUs7SUFDMUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUs7SUFDMUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU87SUFDOUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7SUFDdEIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU07SUFDNUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU87SUFDOUIsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxDQUFDLFNBQVM7SUFDbEMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7SUFDdEIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUk7SUFDeEIsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBRyxDQUFDLFVBQVU7SUFDcEMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLFFBQVE7SUFDaEMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxDQUFDLFdBQVc7SUFDdEMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBRyxDQUFDLFVBQVU7SUFDcEMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU07SUFDNUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU07SUFDNUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7SUFDcEIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7SUFDcEIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7SUFDcEIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7SUFDcEIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7SUFDcEIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7SUFDcEIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7SUFDcEIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7SUFDcEIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7SUFDcEIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7SUFDdEIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7SUFDdEIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFD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QUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUV0RSxDQUFDO1FBRUYsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQztRQUU3RixLQUFLLE1BQU0sV0FBVyxJQUFJLFlBQVksRUFBRTtZQUN0QyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUN4QztRQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLEtBQUssTUFBTSxXQUFXLElBQUksWUFBWSxFQUFFO1lBQ3RDLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3RDO1FBRUQsTUFBTSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDMUIsQ0FBQztDQUNGO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsY0FBYyxDQUFDLElBQVksRUFBRSxPQUFzQixFQUFFLElBQWdDO0lBQzVGLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUV0QixJQUFJLElBQUksRUFBRTtRQUNSLDRGQUE0RjtRQUM1RixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztLQUM1QjtJQUVELGlHQUFpRztJQUNqRyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge1xuICBfZ2V0VGV4dFdpdGhFeGNsdWRlZEVsZW1lbnRzLFxuICBFbGVtZW50RGltZW5zaW9ucyxcbiAgTW9kaWZpZXJLZXlzLFxuICBUZXN0RWxlbWVudCxcbiAgVGVzdEtleSxcbiAgVGV4dE9wdGlvbnMsXG4gIEV2ZW50RGF0YSxcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Rlc3RpbmcnO1xuaW1wb3J0IHticm93c2VyLCBCdXR0b24sIGJ5LCBFbGVtZW50RmluZGVyLCBLZXl9IGZyb20gJ3Byb3RyYWN0b3InO1xuXG4vKiogTWFwcyB0aGUgYFRlc3RLZXlgIGNvbnN0YW50cyB0byBQcm90cmFjdG9yJ3MgYEtleWAgY29uc3RhbnRzLiAqL1xuY29uc3Qga2V5TWFwID0ge1xuICBbVGVzdEtleS5CQUNLU1BBQ0VdOiBLZXkuQkFDS19TUEFDRSxcbiAgW1Rlc3RLZXkuVEFCXTogS2V5LlRBQixcbiAgW1Rlc3RLZXkuRU5URVJdOiBLZXkuRU5URVIsXG4gIFtUZXN0S2V5LlNISUZUXTogS2V5LlNISUZULFxuICBbVGVzdEtleS5DT05UUk9MXTogS2V5LkNPTlRST0wsXG4gIFtUZXN0S2V5LkFMVF06IEtleS5BTFQsXG4gIFtUZXN0S2V5LkVTQ0FQRV06IEtleS5FU0NBUEUsXG4gIFtUZXN0S2V5LlBBR0VfVVBdOiBLZXkuUEFHRV9VUCxcbiAgW1Rlc3RLZXkuUEFHRV9ET1dOXTogS2V5LlBBR0VfRE9XTixcbiAgW1Rlc3RLZXkuRU5EXTogS2V5LkVORCxcbiAgW1Rlc3RLZXkuSE9NRV06IEtleS5IT01FLFxuICBbVGVzdEtleS5MRUZUX0FSUk9XXTogS2V5LkFSUk9XX0xFRlQsXG4gIFtUZXN0S2V5LlVQX0FSUk9XXTogS2V5LkFSUk9XX1VQLFxuICBbVGVzdEtleS5SSUdIVF9BUlJPV106IEtleS5BUlJPV19SSUdIVCxcbiAgW1Rlc3RLZXkuRE9XTl9BUlJPV106IEtleS5BUlJPV19ET1dOLFxuICBbVGVzdEtleS5JTlNFUlRdOiBLZXkuSU5TRVJULFxuICBbVGVzdEtleS5ERUxFVEVdOiBLZXkuREVMRVRFLFxuICBbVGVzdEtleS5GMV06IEtleS5GMSxcbiAgW1Rlc3RLZXkuRjJdOiBLZXkuRjIsXG4gIFtUZXN0S2V5LkYzXTogS2V5LkYzLFxuICBbVGVzdEtleS5GNF06IEtleS5GNCxcbiAgW1Rlc3RLZXkuRjVdOiBLZXkuRjUsXG4gIFtUZXN0S2V5LkY2XTogS2V5LkY2LFxuICBbVGVzdEtleS5GN106IEtleS5GNyxcbiAgW1Rlc3RLZXkuRjhdOiBLZXkuRjgsXG4gIFtUZXN0S2V5LkY5XTogS2V5LkY5LFxuICBbVGVzdEtleS5GMTBdOiBLZXkuRjEwLFxuICBbVGVzdEtleS5GMTFdOiBLZXkuRjExLFxuICBbVGVzdEtleS5GMTJdOiBLZXkuRjEyLFxuICBbVGVzdEtleS5NRVRBXTogS2V5Lk1FVEEsXG59O1xuXG4vKiogQ29udmVydHMgYSBgTW9kaWZpZXJLZXlzYCBvYmplY3QgdG8gYSBsaXN0IG9mIFByb3RyYWN0b3IgYEtleWBzLiAqL1xuZnVuY3Rpb24gdG9Qcm90cmFjdG9yTW9kaWZpZXJLZXlzKG1vZGlmaWVyczogTW9kaWZpZXJLZXlzKTogc3RyaW5nW10ge1xuICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gIGlmIChtb2RpZmllcnMuY29udHJvbCkge1xuICAgIHJlc3VsdC5wdXNoKEtleS5DT05UUk9MKTtcbiAgfVxuICBpZiAobW9kaWZpZXJzLmFsdCkge1xuICAgIHJlc3VsdC5wdXNoKEtleS5BTFQpO1xuICB9XG4gIGlmIChtb2RpZmllcnMuc2hpZnQpIHtcbiAgICByZXN1bHQucHVzaChLZXkuU0hJRlQpO1xuICB9XG4gIGlmIChtb2RpZmllcnMubWV0YSkge1xuICAgIHJlc3VsdC5wdXNoKEtleS5NRVRBKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEEgYFRlc3RFbGVtZW50YCBpbXBsZW1lbnRhdGlvbiBmb3IgUHJvdHJhY3Rvci5cbiAqIEBkZXByZWNhdGVkXG4gKiBAYnJlYWtpbmctY2hhbmdlIDEzLjAuMFxuICovXG5leHBvcnQgY2xhc3MgUHJvdHJhY3RvckVsZW1lbnQgaW1wbGVtZW50cyBUZXN0RWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGVsZW1lbnQ6IEVsZW1lbnRGaW5kZXIpIHt9XG5cbiAgLyoqIEJsdXIgdGhlIGVsZW1lbnQuICovXG4gIGFzeW5jIGJsdXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGJyb3dzZXIuZXhlY3V0ZVNjcmlwdCgnYXJndW1lbnRzWzBdLmJsdXIoKScsIHRoaXMuZWxlbWVudCk7XG4gIH1cblxuICAvKiogQ2xlYXIgdGhlIGVsZW1lbnQncyBpbnB1dCAoZm9yIGlucHV0IGFuZCB0ZXh0YXJlYSBlbGVtZW50cyBvbmx5KS4gKi9cbiAgYXN5bmMgY2xlYXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudC5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsaWNrIHRoZSBlbGVtZW50IGF0IHRoZSBkZWZhdWx0IGxvY2F0aW9uIGZvciB0aGUgY3VycmVudCBlbnZpcm9ubWVudC4gSWYgeW91IG5lZWQgdG8gZ3VhcmFudGVlXG4gICAqIHRoZSBlbGVtZW50IGlzIGNsaWNrZWQgYXQgYSBzcGVjaWZpYyBsb2NhdGlvbiwgY29uc2lkZXIgdXNpbmcgYGNsaWNrKCdjZW50ZXInKWAgb3JcbiAgICogYGNsaWNrKHgsIHkpYCBpbnN0ZWFkLlxuICAgKi9cbiAgY2xpY2sobW9kaWZpZXJzPzogTW9kaWZpZXJLZXlzKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIENsaWNrIHRoZSBlbGVtZW50IGF0IHRoZSBlbGVtZW50J3MgY2VudGVyLiAqL1xuICBjbGljayhsb2NhdGlvbjogJ2NlbnRlcicsIG1vZGlmaWVycz86IE1vZGlmaWVyS2V5cyk6IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBDbGljayB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZSB0b3AtbGVmdCBvZiB0aGUgZWxlbWVudC5cbiAgICogQHBhcmFtIHJlbGF0aXZlWCBDb29yZGluYXRlIHdpdGhpbiB0aGUgZWxlbWVudCwgYWxvbmcgdGhlIFgtYXhpcyBhdCB3aGljaCB0byBjbGljay5cbiAgICogQHBhcmFtIHJlbGF0aXZlWSBDb29yZGluYXRlIHdpdGhpbiB0aGUgZWxlbWVudCwgYWxvbmcgdGhlIFktYXhpcyBhdCB3aGljaCB0byBjbGljay5cbiAgICogQHBhcmFtIG1vZGlmaWVycyBNb2RpZmllciBrZXlzIGhlbGQgd2hpbGUgY2xpY2tpbmdcbiAgICovXG4gIGNsaWNrKHJlbGF0aXZlWDogbnVtYmVyLCByZWxhdGl2ZVk6IG51bWJlciwgbW9kaWZpZXJzPzogTW9kaWZpZXJLZXlzKTogUHJvbWlzZTx2b2lkPjtcbiAgYXN5bmMgY2xpY2soXG4gICAgLi4uYXJnczogW01vZGlmaWVyS2V5cz9dIHwgWydjZW50ZXInLCBNb2RpZmllcktleXM/XSB8IFtudW1iZXIsIG51bWJlciwgTW9kaWZpZXJLZXlzP11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5fZGlzcGF0Y2hDbGlja0V2ZW50U2VxdWVuY2UoYXJncywgQnV0dG9uLkxFRlQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJpZ2h0IGNsaWNrcyBvbiB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZSB0b3AtbGVmdCBvZiBpdC5cbiAgICogQHBhcmFtIHJlbGF0aXZlWCBDb29yZGluYXRlIHdpdGhpbiB0aGUgZWxlbWVudCwgYWxvbmcgdGhlIFgtYXhpcyBhdCB3aGljaCB0byBjbGljay5cbiAgICogQHBhcmFtIHJlbGF0aXZlWSBDb29yZGluYXRlIHdpdGhpbiB0aGUgZWxlbWVudCwgYWxvbmcgdGhlIFktYXhpcyBhdCB3aGljaCB0byBjbGljay5cbiAgICogQHBhcmFtIG1vZGlmaWVycyBNb2RpZmllciBrZXlzIGhlbGQgd2hpbGUgY2xpY2tpbmdcbiAgICovXG4gIHJpZ2h0Q2xpY2socmVsYXRpdmVYOiBudW1iZXIsIHJlbGF0aXZlWTogbnVtYmVyLCBtb2RpZmllcnM/OiBNb2RpZmllcktleXMpOiBQcm9taXNlPHZvaWQ+O1xuICBhc3luYyByaWdodENsaWNrKFxuICAgIC4uLmFyZ3M6IFtNb2RpZmllcktleXM/XSB8IFsnY2VudGVyJywgTW9kaWZpZXJLZXlzP10gfCBbbnVtYmVyLCBudW1iZXIsIE1vZGlmaWVyS2V5cz9dXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuX2Rpc3BhdGNoQ2xpY2tFdmVudFNlcXVlbmNlKGFyZ3MsIEJ1dHRvbi5SSUdIVCk7XG4gIH1cblxuICAvKiogRm9jdXMgdGhlIGVsZW1lbnQuICovXG4gIGFzeW5jIGZvY3VzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBicm93c2VyLmV4ZWN1dGVTY3JpcHQoJ2FyZ3VtZW50c1swXS5mb2N1cygpJywgdGhpcy5lbGVtZW50KTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIGNvbXB1dGVkIHZhbHVlIG9mIHRoZSBnaXZlbiBDU1MgcHJvcGVydHkgZm9yIHRoZSBlbGVtZW50LiAqL1xuICBhc3luYyBnZXRDc3NWYWx1ZShwcm9wZXJ0eTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50LmdldENzc1ZhbHVlKHByb3BlcnR5KTtcbiAgfVxuXG4gIC8qKiBIb3ZlcnMgdGhlIG1vdXNlIG92ZXIgdGhlIGVsZW1lbnQuICovXG4gIGFzeW5jIGhvdmVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBicm93c2VyXG4gICAgICAuYWN0aW9ucygpXG4gICAgICAubW91c2VNb3ZlKGF3YWl0IHRoaXMuZWxlbWVudC5nZXRXZWJFbGVtZW50KCkpXG4gICAgICAucGVyZm9ybSgpO1xuICB9XG5cbiAgLyoqIE1vdmVzIHRoZSBtb3VzZSBhd2F5IGZyb20gdGhlIGVsZW1lbnQuICovXG4gIGFzeW5jIG1vdXNlQXdheSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYnJvd3NlclxuICAgICAgLmFjdGlvbnMoKVxuICAgICAgLm1vdXNlTW92ZShhd2FpdCB0aGlzLmVsZW1lbnQuZ2V0V2ViRWxlbWVudCgpLCB7eDogLTEsIHk6IC0xfSlcbiAgICAgIC5wZXJmb3JtKCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgdGhlIGdpdmVuIHN0cmluZyB0byB0aGUgaW5wdXQgYXMgYSBzZXJpZXMgb2Yga2V5IHByZXNzZXMuIEFsc28gZmlyZXMgaW5wdXQgZXZlbnRzXG4gICAqIGFuZCBhdHRlbXB0cyB0byBhZGQgdGhlIHN0cmluZyB0byB0aGUgRWxlbWVudCdzIHZhbHVlLlxuICAgKi9cbiAgYXN5bmMgc2VuZEtleXMoLi4ua2V5czogKHN0cmluZyB8IFRlc3RLZXkpW10pOiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogU2VuZHMgdGhlIGdpdmVuIHN0cmluZyB0byB0aGUgaW5wdXQgYXMgYSBzZXJpZXMgb2Yga2V5IHByZXNzZXMuIEFsc28gZmlyZXMgaW5wdXQgZXZlbnRzXG4gICAqIGFuZCBhdHRlbXB0cyB0byBhZGQgdGhlIHN0cmluZyB0byB0aGUgRWxlbWVudCdzIHZhbHVlLlxuICAgKi9cbiAgYXN5bmMgc2VuZEtleXMobW9kaWZpZXJzOiBNb2RpZmllcktleXMsIC4uLmtleXM6IChzdHJpbmcgfCBUZXN0S2V5KVtdKTogUHJvbWlzZTx2b2lkPjtcbiAgYXN5bmMgc2VuZEtleXMoLi4ubW9kaWZpZXJzQW5kS2V5czogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmaXJzdCA9IG1vZGlmaWVyc0FuZEtleXNbMF07XG4gICAgbGV0IG1vZGlmaWVyczogTW9kaWZpZXJLZXlzO1xuICAgIGxldCByZXN0OiAoc3RyaW5nIHwgVGVzdEtleSlbXTtcbiAgICBpZiAodHlwZW9mIGZpcnN0ICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgZmlyc3QgIT09ICdudW1iZXInKSB7XG4gICAgICBtb2RpZmllcnMgPSBmaXJzdDtcbiAgICAgIHJlc3QgPSBtb2RpZmllcnNBbmRLZXlzLnNsaWNlKDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtb2RpZmllcnMgPSB7fTtcbiAgICAgIHJlc3QgPSBtb2RpZmllcnNBbmRLZXlzO1xuICAgIH1cblxuICAgIGNvbnN0IG1vZGlmaWVyS2V5cyA9IHRvUHJvdHJhY3Rvck1vZGlmaWVyS2V5cyhtb2RpZmllcnMpO1xuICAgIGNvbnN0IGtleXMgPSByZXN0XG4gICAgICAubWFwKGsgPT4gKHR5cGVvZiBrID09PSAnc3RyaW5nJyA/IGsuc3BsaXQoJycpIDogW2tleU1hcFtrXV0pKVxuICAgICAgLnJlZHVjZSgoYXJyLCBrKSA9PiBhcnIuY29uY2F0KGspLCBbXSlcbiAgICAgIC8vIEtleS5jaG9yZCBkb2Vzbid0IHdvcmsgd2VsbCB3aXRoIGdlY2tvZHJpdmVyIChtb3ppbGxhL2dlY2tvZHJpdmVyIzE1MDIpLFxuICAgICAgLy8gc28gYXZvaWQgaXQgaWYgbm8gbW9kaWZpZXIga2V5cyBhcmUgcmVxdWlyZWQuXG4gICAgICAubWFwKGsgPT4gKG1vZGlmaWVyS2V5cy5sZW5ndGggPiAwID8gS2V5LmNob3JkKC4uLm1vZGlmaWVyS2V5cywgaykgOiBrKSk7XG5cbiAgICByZXR1cm4gdGhpcy5lbGVtZW50LnNlbmRLZXlzKC4uLmtleXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRleHQgZnJvbSB0aGUgZWxlbWVudC5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0aGF0IGFmZmVjdCB3aGF0IHRleHQgaXMgaW5jbHVkZWQuXG4gICAqL1xuICBhc3luYyB0ZXh0KG9wdGlvbnM/OiBUZXh0T3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKG9wdGlvbnM/LmV4Y2x1ZGUpIHtcbiAgICAgIHJldHVybiBicm93c2VyLmV4ZWN1dGVTY3JpcHQoX2dldFRleHRXaXRoRXhjbHVkZWRFbGVtZW50cywgdGhpcy5lbGVtZW50LCBvcHRpb25zLmV4Y2x1ZGUpO1xuICAgIH1cbiAgICAvLyBXZSBkb24ndCBnbyB0aHJvdWdoIFByb3RyYWN0b3IncyBgZ2V0VGV4dGAsIGJlY2F1c2UgaXQgZXhjbHVkZXMgdGV4dCBmcm9tIGhpZGRlbiBlbGVtZW50cy5cbiAgICByZXR1cm4gYnJvd3Nlci5leGVjdXRlU2NyaXB0KGByZXR1cm4gKGFyZ3VtZW50c1swXS50ZXh0Q29udGVudCB8fCAnJykudHJpbSgpYCwgdGhpcy5lbGVtZW50KTtcbiAgfVxuXG4gIC8qKiBHZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZSBmcm9tIHRoZSBlbGVtZW50LiAqL1xuICBhc3luYyBnZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgcmV0dXJuIGJyb3dzZXIuZXhlY3V0ZVNjcmlwdChcbiAgICAgIGByZXR1cm4gYXJndW1lbnRzWzBdLmdldEF0dHJpYnV0ZShhcmd1bWVudHNbMV0pYCxcbiAgICAgIHRoaXMuZWxlbWVudCxcbiAgICAgIG5hbWUsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBDaGVja3Mgd2hldGhlciB0aGUgZWxlbWVudCBoYXMgdGhlIGdpdmVuIGNsYXNzLiAqL1xuICBhc3luYyBoYXNDbGFzcyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjbGFzc2VzID0gKGF3YWl0IHRoaXMuZ2V0QXR0cmlidXRlKCdjbGFzcycpKSB8fCAnJztcbiAgICByZXR1cm4gbmV3IFNldChjbGFzc2VzLnNwbGl0KC9cXHMrLykuZmlsdGVyKGMgPT4gYykpLmhhcyhuYW1lKTtcbiAgfVxuXG4gIC8qKiBHZXRzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBlbGVtZW50LiAqL1xuICBhc3luYyBnZXREaW1lbnNpb25zKCk6IFByb21pc2U8RWxlbWVudERpbWVuc2lvbnM+IHtcbiAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBhd2FpdCB0aGlzLmVsZW1lbnQuZ2V0U2l6ZSgpO1xuICAgIGNvbnN0IHt4OiBsZWZ0LCB5OiB0b3B9ID0gYXdhaXQgdGhpcy5lbGVtZW50LmdldExvY2F0aW9uKCk7XG4gICAgcmV0dXJuIHt3aWR0aCwgaGVpZ2h0LCBsZWZ0LCB0b3B9O1xuICB9XG5cbiAgLyoqIEdldHMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgb2YgYW4gZWxlbWVudC4gKi9cbiAgYXN5bmMgZ2V0UHJvcGVydHk8VCA9IGFueT4obmFtZTogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIGJyb3dzZXIuZXhlY3V0ZVNjcmlwdChgcmV0dXJuIGFyZ3VtZW50c1swXVthcmd1bWVudHNbMV1dYCwgdGhpcy5lbGVtZW50LCBuYW1lKTtcbiAgfVxuXG4gIC8qKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IG9mIGFuIGlucHV0LiAqL1xuICBhc3luYyBzZXRJbnB1dFZhbHVlKHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYnJvd3Nlci5leGVjdXRlU2NyaXB0KGBhcmd1bWVudHNbMF0udmFsdWUgPSBhcmd1bWVudHNbMV1gLCB0aGlzLmVsZW1lbnQsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBTZWxlY3RzIHRoZSBvcHRpb25zIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhlcyBpbnNpZGUgb2YgYSBuYXRpdmUgYHNlbGVjdGAgZWxlbWVudC4gKi9cbiAgYXN5bmMgc2VsZWN0T3B0aW9ucyguLi5vcHRpb25JbmRleGVzOiBudW1iZXJbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCB0aGlzLmVsZW1lbnQuYWxsKGJ5LmNzcygnb3B0aW9uJykpO1xuICAgIGNvbnN0IGluZGV4ZXMgPSBuZXcgU2V0KG9wdGlvbkluZGV4ZXMpOyAvLyBDb252ZXJ0IHRvIGEgc2V0IHRvIHJlbW92ZSBkdXBsaWNhdGVzLlxuXG4gICAgaWYgKG9wdGlvbnMubGVuZ3RoICYmIGluZGV4ZXMuc2l6ZSkge1xuICAgICAgLy8gUmVzZXQgdGhlIHZhbHVlIHNvIGFsbCB0aGUgc2VsZWN0ZWQgc3RhdGVzIGFyZSBjbGVhcmVkLiBXZSBjYW5cbiAgICAgIC8vIHJldXNlIHRoZSBpbnB1dC1zcGVjaWZpYyBtZXRob2Qgc2luY2UgdGhlIGxvZ2ljIGlzIHRoZSBzYW1lLlxuICAgICAgYXdhaXQgdGhpcy5zZXRJbnB1dFZhbHVlKCcnKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpbmRleGVzLmhhcyhpKSkge1xuICAgICAgICAgIC8vIFdlIGhhdmUgdG8gaG9sZCB0aGUgY29udHJvbCBrZXkgd2hpbGUgY2xpY2tpbmcgb24gb3B0aW9ucyBzbyB0aGF0IG11bHRpcGxlIGNhbiBiZVxuICAgICAgICAgIC8vIHNlbGVjdGVkIGluIG11bHRpLXNlbGVjdGlvbiBtb2RlLiBUaGUga2V5IGRvZXNuJ3QgZG8gYW55dGhpbmcgZm9yIHNpbmdsZSBzZWxlY3Rpb24uXG4gICAgICAgICAgYXdhaXQgYnJvd3Nlci5hY3Rpb25zKCkua2V5RG93bihLZXkuQ09OVFJPTCkucGVyZm9ybSgpO1xuICAgICAgICAgIGF3YWl0IG9wdGlvbnNbaV0uY2xpY2soKTtcbiAgICAgICAgICBhd2FpdCBicm93c2VyLmFjdGlvbnMoKS5rZXlVcChLZXkuQ09OVFJPTCkucGVyZm9ybSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIENoZWNrcyB3aGV0aGVyIHRoaXMgZWxlbWVudCBtYXRjaGVzIHRoZSBnaXZlbiBzZWxlY3Rvci4gKi9cbiAgYXN5bmMgbWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gYnJvd3Nlci5leGVjdXRlU2NyaXB0KFxuICAgICAgYFxuICAgICAgICAgIHJldHVybiAoRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcyB8fFxuICAgICAgICAgICAgICAgICAgRWxlbWVudC5wcm90b3R5cGUubXNNYXRjaGVzU2VsZWN0b3IpLmNhbGwoYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0pXG4gICAgICAgICAgYCxcbiAgICAgIHRoaXMuZWxlbWVudCxcbiAgICAgIHNlbGVjdG9yLFxuICAgICk7XG4gIH1cblxuICAvKiogQ2hlY2tzIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgZm9jdXNlZC4gKi9cbiAgYXN5bmMgaXNGb2N1c2VkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnQuZXF1YWxzKGJyb3dzZXIuZHJpdmVyLnN3aXRjaFRvKCkuYWN0aXZlRWxlbWVudCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IHdpdGggYSBwYXJ0aWN1bGFyIG5hbWUuXG4gICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQuXG4gICAqL1xuICBhc3luYyBkaXNwYXRjaEV2ZW50KG5hbWU6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIEV2ZW50RGF0YT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYnJvd3Nlci5leGVjdXRlU2NyaXB0KF9kaXNwYXRjaEV2ZW50LCBuYW1lLCB0aGlzLmVsZW1lbnQsIGRhdGEpO1xuICB9XG5cbiAgLyoqIERpc3BhdGNoZXMgYWxsIHRoZSBldmVudHMgdGhhdCBhcmUgcGFydCBvZiBhIGNsaWNrIGV2ZW50IHNlcXVlbmNlLiAqL1xuICBwcml2YXRlIGFzeW5jIF9kaXNwYXRjaENsaWNrRXZlbnRTZXF1ZW5jZShcbiAgICBhcmdzOiBbTW9kaWZpZXJLZXlzP10gfCBbJ2NlbnRlcicsIE1vZGlmaWVyS2V5cz9dIHwgW251bWJlciwgbnVtYmVyLCBNb2RpZmllcktleXM/XSxcbiAgICBidXR0b246IHN0cmluZyxcbiAgKSB7XG4gICAgbGV0IG1vZGlmaWVyczogTW9kaWZpZXJLZXlzID0ge307XG4gICAgaWYgKGFyZ3MubGVuZ3RoICYmIHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdvYmplY3QnKSB7XG4gICAgICBtb2RpZmllcnMgPSBhcmdzLnBvcCgpIGFzIE1vZGlmaWVyS2V5cztcbiAgICB9XG4gICAgY29uc3QgbW9kaWZpZXJLZXlzID0gdG9Qcm90cmFjdG9yTW9kaWZpZXJLZXlzKG1vZGlmaWVycyk7XG5cbiAgICAvLyBPbWl0dGluZyB0aGUgb2Zmc2V0IGFyZ3VtZW50IHRvIG1vdXNlTW92ZSByZXN1bHRzIGluIGNsaWNraW5nIHRoZSBjZW50ZXIuXG4gICAgLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvciB3ZSB3YW50LCBzbyB3ZSB1c2UgYW4gZW1wdHkgYXJyYXkgb2Ygb2Zmc2V0QXJncyBpZlxuICAgIC8vIG5vIGFyZ3MgcmVtYWluIGFmdGVyIHBvcHBpbmcgdGhlIG1vZGlmaWVycyBmcm9tIHRoZSBhcmdzIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uLlxuICAgIGNvbnN0IG9mZnNldEFyZ3MgPSAoYXJncy5sZW5ndGggPT09IDIgPyBbe3g6IGFyZ3NbMF0sIHk6IGFyZ3NbMV19XSA6IFtdKSBhcyBbXG4gICAgICB7eDogbnVtYmVyOyB5OiBudW1iZXJ9LFxuICAgIF07XG5cbiAgICBsZXQgYWN0aW9ucyA9IGJyb3dzZXIuYWN0aW9ucygpLm1vdXNlTW92ZShhd2FpdCB0aGlzLmVsZW1lbnQuZ2V0V2ViRWxlbWVudCgpLCAuLi5vZmZzZXRBcmdzKTtcblxuICAgIGZvciAoY29uc3QgbW9kaWZpZXJLZXkgb2YgbW9kaWZpZXJLZXlzKSB7XG4gICAgICBhY3Rpb25zID0gYWN0aW9ucy5rZXlEb3duKG1vZGlmaWVyS2V5KTtcbiAgICB9XG4gICAgYWN0aW9ucyA9IGFjdGlvbnMuY2xpY2soYnV0dG9uKTtcbiAgICBmb3IgKGNvbnN0IG1vZGlmaWVyS2V5IG9mIG1vZGlmaWVyS2V5cykge1xuICAgICAgYWN0aW9ucyA9IGFjdGlvbnMua2V5VXAobW9kaWZpZXJLZXkpO1xuICAgIH1cblxuICAgIGF3YWl0IGFjdGlvbnMucGVyZm9ybSgpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGF0Y2hlcyBhbiBldmVudCB3aXRoIGEgcGFydGljdWxhciBuYW1lIGFuZCBkYXRhIHRvIGFuIGVsZW1lbnQuXG4gKiBOb3RlIHRoYXQgdGhpcyBuZWVkcyB0byBiZSBhIHB1cmUgZnVuY3Rpb24sIGJlY2F1c2UgaXQgZ2V0cyBzdHJpbmdpZmllZCBieVxuICogUHJvdHJhY3RvciBhbmQgaXMgZXhlY3V0ZWQgaW5zaWRlIHRoZSBicm93c2VyLlxuICovXG5mdW5jdGlvbiBfZGlzcGF0Y2hFdmVudChuYW1lOiBzdHJpbmcsIGVsZW1lbnQ6IEVsZW1lbnRGaW5kZXIsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBFdmVudERhdGE+KSB7XG4gIGNvbnN0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gIGV2ZW50LmluaXRFdmVudChuYW1lKTtcblxuICBpZiAoZGF0YSkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpiYW4gSGF2ZSB0byB1c2UgYE9iamVjdC5hc3NpZ25gIHRvIHByZXNlcnZlIHRoZSBvcmlnaW5hbCBvYmplY3QuXG4gICAgT2JqZWN0LmFzc2lnbihldmVudCwgZGF0YSk7XG4gIH1cblxuICAvLyBUaGlzIHR5cGUgaGFzIGEgc3RyaW5nIGluZGV4IHNpZ25hdHVyZSwgc28gd2UgY2Fubm90IGFjY2VzcyBpdCB1c2luZyBhIGRvdHRlZCBwcm9wZXJ0eSBhY2Nlc3MuXG4gIGVsZW1lbnRbJ2Rpc3BhdGNoRXZlbnQnXShldmVudCk7XG59XG4iXX0=