@skyux/phone-field 5.9.4 → 6.0.0-beta.10

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 (54) hide show
  1. package/documentation.json +16 -16
  2. package/esm2020/index.mjs +8 -0
  3. package/esm2020/lib/modules/phone-field/phone-field-adapter.service.mjs +64 -0
  4. package/esm2020/lib/modules/phone-field/phone-field-input.directive.mjs +278 -0
  5. package/esm2020/lib/modules/phone-field/phone-field.component.mjs +334 -0
  6. package/esm2020/lib/modules/phone-field/phone-field.module.mjs +50 -0
  7. package/esm2020/lib/modules/phone-field/types/country.mjs +2 -0
  8. package/esm2020/lib/modules/phone-field/types/number-return-format.mjs +2 -0
  9. package/esm2020/lib/modules/shared/sky-phone-field-resources.module.mjs +60 -0
  10. package/esm2020/skyux-phone-field.mjs +5 -0
  11. package/esm2020/testing/phonefield/phone-field-fixture.mjs +159 -0
  12. package/esm2020/testing/phonefield/phone-field-testing.module.mjs +27 -0
  13. package/esm2020/testing/public-api.mjs +3 -0
  14. package/esm2020/testing/skyux-phone-field-testing.mjs +5 -0
  15. package/fesm2015/{skyux-phone-field-testing.js → skyux-phone-field-testing.mjs} +5 -6
  16. package/fesm2015/skyux-phone-field-testing.mjs.map +1 -0
  17. package/fesm2015/skyux-phone-field.mjs +771 -0
  18. package/fesm2015/skyux-phone-field.mjs.map +1 -0
  19. package/fesm2020/skyux-phone-field-testing.mjs +193 -0
  20. package/fesm2020/skyux-phone-field-testing.mjs.map +1 -0
  21. package/{fesm2015/skyux-phone-field.js → fesm2020/skyux-phone-field.mjs} +22 -32
  22. package/fesm2020/skyux-phone-field.mjs.map +1 -0
  23. package/package.json +41 -17
  24. package/testing/package.json +5 -5
  25. package/bundles/skyux-phone-field-testing.umd.js +0 -658
  26. package/bundles/skyux-phone-field.umd.js +0 -1164
  27. package/esm2015/index.js +0 -8
  28. package/esm2015/index.js.map +0 -1
  29. package/esm2015/lib/modules/phone-field/phone-field-adapter.service.js +0 -64
  30. package/esm2015/lib/modules/phone-field/phone-field-adapter.service.js.map +0 -1
  31. package/esm2015/lib/modules/phone-field/phone-field-input.directive.js +0 -280
  32. package/esm2015/lib/modules/phone-field/phone-field-input.directive.js.map +0 -1
  33. package/esm2015/lib/modules/phone-field/phone-field.component.js +0 -342
  34. package/esm2015/lib/modules/phone-field/phone-field.component.js.map +0 -1
  35. package/esm2015/lib/modules/phone-field/phone-field.module.js +0 -50
  36. package/esm2015/lib/modules/phone-field/phone-field.module.js.map +0 -1
  37. package/esm2015/lib/modules/phone-field/types/country.js +0 -2
  38. package/esm2015/lib/modules/phone-field/types/country.js.map +0 -1
  39. package/esm2015/lib/modules/phone-field/types/number-return-format.js +0 -2
  40. package/esm2015/lib/modules/phone-field/types/number-return-format.js.map +0 -1
  41. package/esm2015/lib/modules/shared/sky-phone-field-resources.module.js +0 -60
  42. package/esm2015/lib/modules/shared/sky-phone-field-resources.module.js.map +0 -1
  43. package/esm2015/skyux-phone-field.js +0 -5
  44. package/esm2015/skyux-phone-field.js.map +0 -1
  45. package/esm2015/testing/phonefield/phone-field-fixture.js +0 -185
  46. package/esm2015/testing/phonefield/phone-field-fixture.js.map +0 -1
  47. package/esm2015/testing/phonefield/phone-field-testing.module.js +0 -27
  48. package/esm2015/testing/phonefield/phone-field-testing.module.js.map +0 -1
  49. package/esm2015/testing/public-api.js +0 -3
  50. package/esm2015/testing/public-api.js.map +0 -1
  51. package/esm2015/testing/skyux-phone-field-testing.js +0 -5
  52. package/esm2015/testing/skyux-phone-field-testing.js.map +0 -1
  53. package/fesm2015/skyux-phone-field-testing.js.map +0 -1
  54. package/fesm2015/skyux-phone-field.js.map +0 -1
@@ -993,7 +993,7 @@
993
993
  "sources": [
994
994
  {
995
995
  "fileName": "projects/phone-field/src/modules/phone-field/phone-field-input.directive.ts",
996
- "line": 120,
996
+ "line": 118,
997
997
  "character": 2
998
998
  }
999
999
  ],
@@ -1125,7 +1125,7 @@
1125
1125
  "sources": [
1126
1126
  {
1127
1127
  "fileName": "projects/phone-field/src/modules/phone-field/phone-field-input.directive.ts",
1128
- "line": 87,
1128
+ "line": 85,
1129
1129
  "character": 9
1130
1130
  }
1131
1131
  ],
@@ -1158,7 +1158,7 @@
1158
1158
  "sources": [
1159
1159
  {
1160
1160
  "fileName": "projects/phone-field/src/modules/phone-field/phone-field-input.directive.ts",
1161
- "line": 69,
1161
+ "line": 67,
1162
1162
  "character": 13
1163
1163
  }
1164
1164
  ],
@@ -1231,7 +1231,7 @@
1231
1231
  "sources": [
1232
1232
  {
1233
1233
  "fileName": "projects/phone-field/src/modules/phone-field/phone-field-input.directive.ts",
1234
- "line": 147,
1234
+ "line": 145,
1235
1235
  "character": 9
1236
1236
  }
1237
1237
  ],
@@ -1268,7 +1268,7 @@
1268
1268
  "sources": [
1269
1269
  {
1270
1270
  "fileName": "projects/phone-field/src/modules/phone-field/phone-field-input.directive.ts",
1271
- "line": 167,
1271
+ "line": 165,
1272
1272
  "character": 9
1273
1273
  }
1274
1274
  ],
@@ -1305,7 +1305,7 @@
1305
1305
  "sources": [
1306
1306
  {
1307
1307
  "fileName": "projects/phone-field/src/modules/phone-field/phone-field-input.directive.ts",
1308
- "line": 127,
1308
+ "line": 125,
1309
1309
  "character": 9
1310
1310
  }
1311
1311
  ],
@@ -1356,7 +1356,7 @@
1356
1356
  "sources": [
1357
1357
  {
1358
1358
  "fileName": "projects/phone-field/src/modules/phone-field/phone-field-input.directive.ts",
1359
- "line": 189,
1359
+ "line": 187,
1360
1360
  "character": 9
1361
1361
  }
1362
1362
  ],
@@ -1403,7 +1403,7 @@
1403
1403
  "sources": [
1404
1404
  {
1405
1405
  "fileName": "projects/phone-field/src/modules/phone-field/phone-field-input.directive.ts",
1406
- "line": 177,
1406
+ "line": 175,
1407
1407
  "character": 9
1408
1408
  }
1409
1409
  ],
@@ -1466,7 +1466,7 @@
1466
1466
  "sources": [
1467
1467
  {
1468
1468
  "fileName": "projects/phone-field/src/modules/phone-field/phone-field-input.directive.ts",
1469
- "line": 194,
1469
+ "line": 192,
1470
1470
  "character": 9
1471
1471
  }
1472
1472
  ],
@@ -1508,7 +1508,7 @@
1508
1508
  "sources": [
1509
1509
  {
1510
1510
  "fileName": "projects/phone-field/src/modules/phone-field/phone-field-input.directive.ts",
1511
- "line": 212,
1511
+ "line": 210,
1512
1512
  "character": 9
1513
1513
  }
1514
1514
  ],
@@ -1590,7 +1590,7 @@
1590
1590
  "sources": [
1591
1591
  {
1592
1592
  "fileName": "projects/phone-field/src/modules/phone-field/phone-field-input.directive.ts",
1593
- "line": 216,
1593
+ "line": 214,
1594
1594
  "character": 9
1595
1595
  }
1596
1596
  ],
@@ -1659,7 +1659,7 @@
1659
1659
  "sources": [
1660
1660
  {
1661
1661
  "fileName": "projects/phone-field/src/modules/phone-field/phone-field-input.directive.ts",
1662
- "line": 220,
1662
+ "line": 218,
1663
1663
  "character": 9
1664
1664
  }
1665
1665
  ],
@@ -1728,7 +1728,7 @@
1728
1728
  "sources": [
1729
1729
  {
1730
1730
  "fileName": "projects/phone-field/src/modules/phone-field/phone-field-input.directive.ts",
1731
- "line": 228,
1731
+ "line": 226,
1732
1732
  "character": 9
1733
1733
  }
1734
1734
  ],
@@ -1784,7 +1784,7 @@
1784
1784
  "sources": [
1785
1785
  {
1786
1786
  "fileName": "projects/phone-field/src/modules/phone-field/phone-field-input.directive.ts",
1787
- "line": 236,
1787
+ "line": 234,
1788
1788
  "character": 9
1789
1789
  }
1790
1790
  ],
@@ -1844,7 +1844,7 @@
1844
1844
  "sources": [
1845
1845
  {
1846
1846
  "fileName": "projects/phone-field/src/modules/phone-field/phone-field-input.directive.ts",
1847
- "line": 206,
1847
+ "line": 204,
1848
1848
  "character": 9
1849
1849
  }
1850
1850
  ],
@@ -1934,7 +1934,7 @@
1934
1934
  "sources": [
1935
1935
  {
1936
1936
  "fileName": "projects/phone-field/src/modules/phone-field/phone-field-input.directive.ts",
1937
- "line": 61,
1937
+ "line": 59,
1938
1938
  "character": 13
1939
1939
  }
1940
1940
  ],
@@ -0,0 +1,8 @@
1
+ export * from './lib/modules/phone-field/phone-field.module';
2
+ export * from './lib/modules/phone-field/types/country';
3
+ export * from './lib/modules/phone-field/types/number-return-format';
4
+ // Components and directives must be exported to support Angular's "partial" Ivy compiler.
5
+ // Obscure names are used to indicate types are not part of the public API.
6
+ export { SkyPhoneFieldComponent as λ1 } from './lib/modules/phone-field/phone-field.component';
7
+ export { SkyPhoneFieldInputDirective as λ2 } from './lib/modules/phone-field/phone-field-input.directive';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvcGhvbmUtZmllbGQvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsOENBQThDLENBQUM7QUFDN0QsY0FBYyx5Q0FBeUMsQ0FBQztBQUN4RCxjQUFjLHNEQUFzRCxDQUFDO0FBRXJFLDBGQUEwRjtBQUMxRiwyRUFBMkU7QUFDM0UsT0FBTyxFQUFFLHNCQUFzQixJQUFJLEVBQUUsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQy9GLE9BQU8sRUFBRSwyQkFBMkIsSUFBSSxFQUFFLEVBQUUsTUFBTSx1REFBdUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL21vZHVsZXMvcGhvbmUtZmllbGQvcGhvbmUtZmllbGQubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZHVsZXMvcGhvbmUtZmllbGQvdHlwZXMvY291bnRyeSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2R1bGVzL3Bob25lLWZpZWxkL3R5cGVzL251bWJlci1yZXR1cm4tZm9ybWF0JztcblxuLy8gQ29tcG9uZW50cyBhbmQgZGlyZWN0aXZlcyBtdXN0IGJlIGV4cG9ydGVkIHRvIHN1cHBvcnQgQW5ndWxhcidzIFwicGFydGlhbFwiIEl2eSBjb21waWxlci5cbi8vIE9ic2N1cmUgbmFtZXMgYXJlIHVzZWQgdG8gaW5kaWNhdGUgdHlwZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLlxuZXhwb3J0IHsgU2t5UGhvbmVGaWVsZENvbXBvbmVudCBhcyDOuzEgfSBmcm9tICcuL2xpYi9tb2R1bGVzL3Bob25lLWZpZWxkL3Bob25lLWZpZWxkLmNvbXBvbmVudCc7XG5leHBvcnQgeyBTa3lQaG9uZUZpZWxkSW5wdXREaXJlY3RpdmUgYXMgzrsyIH0gZnJvbSAnLi9saWIvbW9kdWxlcy9waG9uZS1maWVsZC9waG9uZS1maWVsZC1pbnB1dC5kaXJlY3RpdmUnO1xuIl19
@@ -0,0 +1,64 @@
1
+ import { Injectable, Renderer2 } from '@angular/core';
2
+ import { SkyLibResourcesService } from '@skyux/i18n';
3
+ import { Subject } from 'rxjs';
4
+ import { takeUntil } from 'rxjs/operators';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@skyux/i18n";
7
+ /**
8
+ * Service for interacting with the DOM elements of the phone field.
9
+ * @internal
10
+ */
11
+ export class SkyPhoneFieldAdapterService {
12
+ constructor(renderer, resourcesService) {
13
+ this.renderer = renderer;
14
+ this.resourcesService = resourcesService;
15
+ this.ngUnsubscribe = new Subject();
16
+ }
17
+ ngOnDestroy() {
18
+ this.ngUnsubscribe.next();
19
+ this.ngUnsubscribe.complete();
20
+ }
21
+ addElementClass(elementRef, className) {
22
+ this.renderer.addClass(elementRef.nativeElement, className);
23
+ }
24
+ setElementDisabledState(elementRef, disabled) {
25
+ this.renderer.setProperty(elementRef.nativeElement, 'disabled', disabled);
26
+ }
27
+ setElementPlaceholder(elementRef, placeholder) {
28
+ this.renderer.setAttribute(elementRef.nativeElement, 'placeholder', placeholder);
29
+ }
30
+ setElementType(elementRef) {
31
+ this.renderer.setAttribute(elementRef.nativeElement, 'type', 'tel');
32
+ }
33
+ setElementValue(elementRef, value) {
34
+ if (value) {
35
+ this.renderer.setProperty(elementRef.nativeElement, 'value', value);
36
+ }
37
+ }
38
+ setAriaLabel(element) {
39
+ /* Sanity check */
40
+ /* istanbul ignore else */
41
+ if (!element.nativeElement.getAttribute('aria-label')) {
42
+ this.resourcesService
43
+ .getString('skyux_phone_field_default_label')
44
+ .pipe(takeUntil(this.ngUnsubscribe))
45
+ .subscribe((value) => {
46
+ this.renderer.setAttribute(element.nativeElement, 'aria-label', value);
47
+ });
48
+ }
49
+ }
50
+ focusCountrySearchElement(el) {
51
+ const input = el.querySelector('textarea');
52
+ input.focus();
53
+ }
54
+ focusPhoneInput(el) {
55
+ const input = el.querySelector('.sky-phone-field-container input');
56
+ input.focus();
57
+ }
58
+ }
59
+ SkyPhoneFieldAdapterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyPhoneFieldAdapterService, deps: [{ token: i0.Renderer2 }, { token: i1.SkyLibResourcesService }], target: i0.ɵɵFactoryTarget.Injectable });
60
+ SkyPhoneFieldAdapterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyPhoneFieldAdapterService });
61
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyPhoneFieldAdapterService, decorators: [{
62
+ type: Injectable
63
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i1.SkyLibResourcesService }]; } });
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtZmllbGQtYWRhcHRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3Bob25lLWZpZWxkL3NyYy9saWIvbW9kdWxlcy9waG9uZS1maWVsZC9waG9uZS1maWVsZC1hZGFwdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFVBQVUsRUFBYSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXJELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFFM0M7OztHQUdHO0FBRUgsTUFBTSxPQUFPLDJCQUEyQjtJQUd0QyxZQUNVLFFBQW1CLEVBQ25CLGdCQUF3QztRQUR4QyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBd0I7UUFKMUMsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBS3pDLENBQUM7SUFFRyxXQUFXO1FBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRU0sZUFBZSxDQUFDLFVBQXNCLEVBQUUsU0FBaUI7UUFDOUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRU0sdUJBQXVCLENBQzVCLFVBQXNCLEVBQ3RCLFFBQWlCO1FBRWpCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFTSxxQkFBcUIsQ0FDMUIsVUFBc0IsRUFDdEIsV0FBbUI7UUFFbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQ3hCLFVBQVUsQ0FBQyxhQUFhLEVBQ3hCLGFBQWEsRUFDYixXQUFXLENBQ1osQ0FBQztJQUNKLENBQUM7SUFFTSxjQUFjLENBQUMsVUFBc0I7UUFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVNLGVBQWUsQ0FBQyxVQUFzQixFQUFFLEtBQWE7UUFDMUQsSUFBSSxLQUFLLEVBQUU7WUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNyRTtJQUNILENBQUM7SUFFTSxZQUFZLENBQUMsT0FBbUI7UUFDckMsa0JBQWtCO1FBQ2xCLDBCQUEwQjtRQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDckQsSUFBSSxDQUFDLGdCQUFnQjtpQkFDbEIsU0FBUyxDQUFDLGlDQUFpQyxDQUFDO2lCQUM1QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztpQkFDbkMsU0FBUyxDQUFDLENBQUMsS0FBYSxFQUFFLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUN4QixPQUFPLENBQUMsYUFBYSxFQUNyQixZQUFZLEVBQ1osS0FBSyxDQUNOLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0gsQ0FBQztJQUVNLHlCQUF5QixDQUFDLEVBQVc7UUFDMUMsTUFBTSxLQUFLLEdBQWdCLEVBQUUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEQsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxlQUFlLENBQUMsRUFBVztRQUNoQyxNQUFNLEtBQUssR0FBZ0IsRUFBRSxDQUFDLGFBQWEsQ0FDekMsa0NBQWtDLENBQ25DLENBQUM7UUFDRixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEIsQ0FBQzs7d0hBeEVVLDJCQUEyQjs0SEFBM0IsMkJBQTJCOzJGQUEzQiwyQkFBMkI7a0JBRHZDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50UmVmLCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2t5TGliUmVzb3VyY2VzU2VydmljZSB9IGZyb20gJ0Bza3l1eC9pMThuJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vKipcbiAqIFNlcnZpY2UgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIERPTSBlbGVtZW50cyBvZiB0aGUgcGhvbmUgZmllbGQuXG4gKiBAaW50ZXJuYWxcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNreVBob25lRmllbGRBZGFwdGVyU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgcmVzb3VyY2VzU2VydmljZTogU2t5TGliUmVzb3VyY2VzU2VydmljZVxuICApIHt9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgYWRkRWxlbWVudENsYXNzKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIGNsYXNzTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIGNsYXNzTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgc2V0RWxlbWVudERpc2FibGVkU3RhdGUoXG4gICAgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBkaXNhYmxlZDogYm9vbGVhblxuICApOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2Rpc2FibGVkJywgZGlzYWJsZWQpO1xuICB9XG5cbiAgcHVibGljIHNldEVsZW1lbnRQbGFjZWhvbGRlcihcbiAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHBsYWNlaG9sZGVyOiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoXG4gICAgICBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAncGxhY2Vob2xkZXInLFxuICAgICAgcGxhY2Vob2xkZXJcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNldEVsZW1lbnRUeXBlKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd0eXBlJywgJ3RlbCcpO1xuICB9XG5cbiAgcHVibGljIHNldEVsZW1lbnRWYWx1ZShlbGVtZW50UmVmOiBFbGVtZW50UmVmLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRBcmlhTGFiZWwoZWxlbWVudDogRWxlbWVudFJlZik6IHZvaWQge1xuICAgIC8qIFNhbml0eSBjaGVjayAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKCFlbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJykpIHtcbiAgICAgIHRoaXMucmVzb3VyY2VzU2VydmljZVxuICAgICAgICAuZ2V0U3RyaW5nKCdza3l1eF9waG9uZV9maWVsZF9kZWZhdWx0X2xhYmVsJylcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgIGVsZW1lbnQubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICdhcmlhLWxhYmVsJyxcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvY3VzQ291bnRyeVNlYXJjaEVsZW1lbnQoZWw6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dDogSFRNTEVsZW1lbnQgPSBlbC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xuICAgIGlucHV0LmZvY3VzKCk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXNQaG9uZUlucHV0KGVsOiBFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXQ6IEhUTUxFbGVtZW50ID0gZWwucXVlcnlTZWxlY3RvcihcbiAgICAgICcuc2t5LXBob25lLWZpZWxkLWNvbnRhaW5lciBpbnB1dCdcbiAgICApO1xuICAgIGlucHV0LmZvY3VzKCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,278 @@
1
+ import { ChangeDetectorRef, Directive, ElementRef, HostListener, Input, Optional, forwardRef, } from '@angular/core';
2
+ import { NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
3
+ import { PhoneNumberFormat, PhoneNumberUtil } from 'google-libphonenumber';
4
+ import { BehaviorSubject, Subject } from 'rxjs';
5
+ import { debounceTime, takeUntil } from 'rxjs/operators';
6
+ import { SkyPhoneFieldAdapterService } from './phone-field-adapter.service';
7
+ import { SkyPhoneFieldComponent } from './phone-field.component';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "./phone-field-adapter.service";
10
+ import * as i2 from "./phone-field.component";
11
+ const SKY_PHONE_FIELD_VALUE_ACCESSOR = {
12
+ provide: NG_VALUE_ACCESSOR,
13
+ useExisting: forwardRef(() => SkyPhoneFieldInputDirective),
14
+ multi: true,
15
+ };
16
+ const SKY_PHONE_FIELD_VALIDATOR = {
17
+ provide: NG_VALIDATORS,
18
+ useExisting: forwardRef(() => SkyPhoneFieldInputDirective),
19
+ multi: true,
20
+ };
21
+ /**
22
+ * Creates a button, search input, and text input for entering and validating
23
+ * international phone numbers. Place this attribute on an `input` element, and wrap
24
+ * that element in a `sky-phone-field` component. By default, the country selector
25
+ * button displays a flag icon for the default country, and the phone number input
26
+ * displays a sample of the correct phone number format. When users select the country
27
+ * selector button, they expose the country search input, which is
28
+ * [an autocomplete input](https://developer.blackbaud.com/skyux/components/autocomplete)
29
+ * that allows them to select different countries. When users enter `+` followed by an
30
+ * international dial code in the phone number input, the country automatically switches
31
+ * to the country associated with the dial code.
32
+ * @required
33
+ */
34
+ export class SkyPhoneFieldInputDirective {
35
+ constructor(changeDetector, elRef, adapterService, phoneFieldComponent) {
36
+ this.changeDetector = changeDetector;
37
+ this.elRef = elRef;
38
+ this.adapterService = adapterService;
39
+ this.phoneFieldComponent = phoneFieldComponent;
40
+ /**
41
+ * Indicates whether to prevent validation on the phone number input. For validation,
42
+ * phone numbers are driven through the `ngModel` attribute that you specify on an
43
+ * `input` element or on a `FormControl` in a reactive form. To prevent validation,
44
+ * set this property to `true`.
45
+ * @default false
46
+ */
47
+ this.skyPhoneFieldNoValidate = false;
48
+ this.ngUnsubscribe = new Subject();
49
+ this.phoneUtils = PhoneNumberUtil.getInstance();
50
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
51
+ this.onChange = (_) => { };
52
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
53
+ this.onTouched = () => { };
54
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
55
+ this.validatorChange = () => { };
56
+ }
57
+ /**
58
+ * Indicates whether to disable the phone field.
59
+ * @default false
60
+ */
61
+ set disabled(value) {
62
+ this.phoneFieldComponent.countrySelectDisabled = value;
63
+ this.adapterService.setElementDisabledState(this.elRef, value);
64
+ this._disabled = value;
65
+ }
66
+ get disabled() {
67
+ return this._disabled || false;
68
+ }
69
+ set modelValue(value) {
70
+ this._modelValue = value;
71
+ this.adapterService.setElementValue(this.elRef, value);
72
+ if (value) {
73
+ const formattedValue = this.formatNumber(value.toString());
74
+ this.onChange(formattedValue);
75
+ }
76
+ else {
77
+ this.onChange(value);
78
+ }
79
+ this.validatorChange();
80
+ }
81
+ get modelValue() {
82
+ return this._modelValue;
83
+ }
84
+ ngOnInit() {
85
+ if (!this.phoneFieldComponent) {
86
+ throw new Error('You must wrap the `skyPhoneFieldInput` directive within a ' +
87
+ '`<sky-phone-field>` component!');
88
+ }
89
+ this.adapterService.setElementType(this.elRef);
90
+ this.adapterService.addElementClass(this.elRef, 'sky-form-control');
91
+ if (this.phoneFieldComponent.selectedCountry) {
92
+ this.adapterService.setElementPlaceholder(this.elRef, this.phoneFieldComponent.selectedCountry.exampleNumber);
93
+ }
94
+ this.adapterService.setAriaLabel(this.elRef);
95
+ }
96
+ ngAfterViewInit() {
97
+ this.phoneFieldComponent.selectedCountryChange
98
+ .pipe(takeUntil(this.ngUnsubscribe))
99
+ .subscribe((country) => {
100
+ this.modelValue = this.elRef.nativeElement.value;
101
+ this.adapterService.setElementPlaceholder(this.elRef, country.exampleNumber);
102
+ });
103
+ // This is needed to address a bug in Angular 4, where the value is not changed on the view.
104
+ // See: https://github.com/angular/angular/issues/13792
105
+ /* istanbul ignore else */
106
+ if (this.control && this.modelValue) {
107
+ this.control.setValue(this.modelValue, { emitEvent: false });
108
+ this.changeDetector.detectChanges();
109
+ }
110
+ }
111
+ ngOnDestroy() {
112
+ this.ngUnsubscribe.next();
113
+ this.ngUnsubscribe.complete();
114
+ }
115
+ /**
116
+ * Writes the new value for reactive forms on change events on the input element
117
+ * @param event The change event that was received
118
+ */
119
+ onInputChange(event) {
120
+ if (!this.textChanges) {
121
+ this.setupTextChangeSubscription(event.target.value);
122
+ }
123
+ else {
124
+ this.textChanges.next(event.target.value);
125
+ }
126
+ }
127
+ /**
128
+ * Marks reactive form controls as touched on input blur events
129
+ */
130
+ onInputBlur() {
131
+ this.onTouched();
132
+ }
133
+ onInputTyping(event) {
134
+ if (!this.textChanges) {
135
+ this.setupTextChangeSubscription(event.target.value);
136
+ }
137
+ else {
138
+ this.textChanges.next(event.target.value);
139
+ }
140
+ }
141
+ /**
142
+ * Writes the new value for reactive forms
143
+ * @param value The new value for the input
144
+ */
145
+ writeValue(value) {
146
+ this.phoneFieldComponent.setCountryByDialCode(value);
147
+ this.modelValue = value;
148
+ }
149
+ registerOnChange(fn) {
150
+ this.onChange = fn;
151
+ }
152
+ registerOnTouched(fn) {
153
+ this.onTouched = fn;
154
+ }
155
+ registerOnValidatorChange(fn) {
156
+ this.validatorChange = fn;
157
+ }
158
+ /**
159
+ * Sets the disabled state on the input
160
+ * @param isDisabled the new value of the input's disabled state
161
+ */
162
+ setDisabledState(isDisabled) {
163
+ this.disabled = isDisabled;
164
+ }
165
+ /**
166
+ * Validate's the form control's current value
167
+ * @param control the form control for the input
168
+ */
169
+ validate(control) {
170
+ if (!this.control) {
171
+ this.control = control;
172
+ }
173
+ if (this.skyPhoneFieldNoValidate) {
174
+ return;
175
+ }
176
+ const value = control.value;
177
+ if (!value) {
178
+ return;
179
+ }
180
+ if (this.phoneFieldComponent.selectedCountry &&
181
+ !this.validateNumber(value)) {
182
+ if (!this.textChanges) {
183
+ // Mark the invalid control as touched so that the input's invalid CSS styles appear.
184
+ // (This is only required when the invalid value is set by the FormControl constructor.)
185
+ // We don't do this if the input is the active element so that we don't show validation
186
+ // errors unless it is invalid on initialization or the input has been blurred.
187
+ control.markAsTouched();
188
+ }
189
+ return {
190
+ skyPhoneField: {
191
+ invalid: value,
192
+ },
193
+ };
194
+ }
195
+ }
196
+ setupTextChangeSubscription(text) {
197
+ this.textChanges = new BehaviorSubject(text);
198
+ this.textChanges
199
+ .pipe(debounceTime(500), takeUntil(this.ngUnsubscribe))
200
+ .subscribe((newValue) => {
201
+ this.writeValue(newValue);
202
+ });
203
+ }
204
+ validateNumber(phoneNumber) {
205
+ try {
206
+ const numberObj = this.phoneUtils.parseAndKeepRawInput(phoneNumber, this.phoneFieldComponent.selectedCountry.iso2);
207
+ if (!this.phoneFieldComponent.allowExtensions &&
208
+ numberObj.getExtension()) {
209
+ return false;
210
+ }
211
+ return this.phoneUtils.isValidNumber(numberObj);
212
+ }
213
+ catch (e) {
214
+ return false;
215
+ }
216
+ }
217
+ /**
218
+ * Format's the given phone number based on the currently selected country.
219
+ * @param phoneNumber The number to format
220
+ */
221
+ formatNumber(phoneNumber) {
222
+ try {
223
+ const numberObj = this.phoneUtils.parseAndKeepRawInput(phoneNumber, this.phoneFieldComponent.selectedCountry.iso2);
224
+ if (this.phoneUtils.isPossibleNumber(numberObj)) {
225
+ switch (this.phoneFieldComponent.returnFormat) {
226
+ case 'international':
227
+ return this.phoneUtils.format(numberObj, PhoneNumberFormat.INTERNATIONAL);
228
+ case 'national':
229
+ return this.phoneUtils.format(numberObj, PhoneNumberFormat.NATIONAL);
230
+ case 'default':
231
+ default:
232
+ if (this.phoneFieldComponent.selectedCountry.iso2 !==
233
+ this.phoneFieldComponent.defaultCountry) {
234
+ return this.phoneUtils.format(numberObj, PhoneNumberFormat.INTERNATIONAL);
235
+ }
236
+ else {
237
+ return this.phoneUtils.format(numberObj, PhoneNumberFormat.NATIONAL);
238
+ }
239
+ }
240
+ }
241
+ else {
242
+ return phoneNumber;
243
+ }
244
+ }
245
+ catch (e) {
246
+ /* sanity check */
247
+ /* istanbul ignore next */
248
+ return phoneNumber;
249
+ }
250
+ }
251
+ }
252
+ SkyPhoneFieldInputDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyPhoneFieldInputDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.SkyPhoneFieldAdapterService, optional: true }, { token: i2.SkyPhoneFieldComponent, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
253
+ SkyPhoneFieldInputDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.2", type: SkyPhoneFieldInputDirective, selector: "[skyPhoneFieldInput]", inputs: { disabled: "disabled", skyPhoneFieldNoValidate: "skyPhoneFieldNoValidate" }, host: { listeners: { "change": "onInputChange($event)", "blur": "onInputBlur()", "input": "onInputTyping($event)" } }, providers: [SKY_PHONE_FIELD_VALUE_ACCESSOR, SKY_PHONE_FIELD_VALIDATOR], ngImport: i0 });
254
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyPhoneFieldInputDirective, decorators: [{
255
+ type: Directive,
256
+ args: [{
257
+ selector: '[skyPhoneFieldInput]',
258
+ providers: [SKY_PHONE_FIELD_VALUE_ACCESSOR, SKY_PHONE_FIELD_VALIDATOR],
259
+ }]
260
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.SkyPhoneFieldAdapterService, decorators: [{
261
+ type: Optional
262
+ }] }, { type: i2.SkyPhoneFieldComponent, decorators: [{
263
+ type: Optional
264
+ }] }]; }, propDecorators: { disabled: [{
265
+ type: Input
266
+ }], skyPhoneFieldNoValidate: [{
267
+ type: Input
268
+ }], onInputChange: [{
269
+ type: HostListener,
270
+ args: ['change', ['$event']]
271
+ }], onInputBlur: [{
272
+ type: HostListener,
273
+ args: ['blur']
274
+ }], onInputTyping: [{
275
+ type: HostListener,
276
+ args: ['input', ['$event']]
277
+ }] } });
278
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtZmllbGQtaW5wdXQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3Bob25lLWZpZWxkL3NyYy9saWIvbW9kdWxlcy9waG9uZS1maWVsZC9waG9uZS1maWVsZC1pbnB1dC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBR0wsUUFBUSxFQUNSLFVBQVUsR0FDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBR0wsYUFBYSxFQUNiLGlCQUFpQixHQUdsQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7O0FBR2pFLE1BQU0sOEJBQThCLEdBQUc7SUFDckMsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDO0lBQzFELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQztBQUVGLE1BQU0seUJBQXlCLEdBQUc7SUFDaEMsT0FBTyxFQUFFLGFBQWE7SUFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQztJQUMxRCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7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QUUsc0JBQXNCO29CQUNoQyxTQUFTLEVBQUUsQ0FBQyw4QkFBOEIsRUFBRSx5QkFBeUIsQ0FBQztpQkFDdkU7OzBCQStESSxRQUFROzswQkFDUixRQUFROzRDQXZEQSxRQUFRO3NCQURsQixLQUFLO2dCQW1CQyx1QkFBdUI7c0JBRDdCLEtBQUs7Z0JBMkZDLGFBQWE7c0JBRG5CLFlBQVk7dUJBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWEzQixXQUFXO3NCQURqQixZQUFZO3VCQUFDLE1BQU07Z0JBTWIsYUFBYTtzQkFEbkIsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIGZvcndhcmRSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIFZhbGlkYXRvcixcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBQaG9uZU51bWJlckZvcm1hdCwgUGhvbmVOdW1iZXJVdGlsIH0gZnJvbSAnZ29vZ2xlLWxpYnBob25lbnVtYmVyJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNreVBob25lRmllbGRBZGFwdGVyU2VydmljZSB9IGZyb20gJy4vcGhvbmUtZmllbGQtYWRhcHRlci5zZXJ2aWNlJztcbmltcG9ydCB7IFNreVBob25lRmllbGRDb21wb25lbnQgfSBmcm9tICcuL3Bob25lLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTa3lQaG9uZUZpZWxkQ291bnRyeSB9IGZyb20gJy4vdHlwZXMvY291bnRyeSc7XG5cbmNvbnN0IFNLWV9QSE9ORV9GSUVMRF9WQUxVRV9BQ0NFU1NPUiA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNreVBob25lRmllbGRJbnB1dERpcmVjdGl2ZSksXG4gIG11bHRpOiB0cnVlLFxufTtcblxuY29uc3QgU0tZX1BIT05FX0ZJRUxEX1ZBTElEQVRPUiA9IHtcbiAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2t5UGhvbmVGaWVsZElucHV0RGlyZWN0aXZlKSxcbiAgbXVsdGk6IHRydWUsXG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBidXR0b24sIHNlYXJjaCBpbnB1dCwgYW5kIHRleHQgaW5wdXQgZm9yIGVudGVyaW5nIGFuZCB2YWxpZGF0aW5nXG4gKiBpbnRlcm5hdGlvbmFsIHBob25lIG51bWJlcnMuIFBsYWNlIHRoaXMgYXR0cmlidXRlIG9uIGFuIGBpbnB1dGAgZWxlbWVudCwgYW5kIHdyYXBcbiAqIHRoYXQgZWxlbWVudCBpbiBhIGBza3ktcGhvbmUtZmllbGRgIGNvbXBvbmVudC4gQnkgZGVmYXVsdCwgdGhlIGNvdW50cnkgc2VsZWN0b3JcbiAqIGJ1dHRvbiBkaXNwbGF5cyBhIGZsYWcgaWNvbiBmb3IgdGhlIGRlZmF1bHQgY291bnRyeSwgYW5kIHRoZSBwaG9uZSBudW1iZXIgaW5wdXRcbiAqIGRpc3BsYXlzIGEgc2FtcGxlIG9mIHRoZSBjb3JyZWN0IHBob25lIG51bWJlciBmb3JtYXQuIFdoZW4gdXNlcnMgc2VsZWN0IHRoZSBjb3VudHJ5XG4gKiBzZWxlY3RvciBidXR0b24sIHRoZXkgZXhwb3NlIHRoZSBjb3VudHJ5IHNlYXJjaCBpbnB1dCwgd2hpY2ggaXNcbiAqIFthbiBhdXRvY29tcGxldGUgaW5wdXRdKGh0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvY29tcG9uZW50cy9hdXRvY29tcGxldGUpXG4gKiB0aGF0IGFsbG93cyB0aGVtIHRvIHNlbGVjdCBkaWZmZXJlbnQgY291bnRyaWVzLiBXaGVuIHVzZXJzIGVudGVyIGArYCBmb2xsb3dlZCBieSBhblxuICogaW50ZXJuYXRpb25hbCBkaWFsIGNvZGUgaW4gdGhlIHBob25lIG51bWJlciBpbnB1dCwgdGhlIGNvdW50cnkgYXV0b21hdGljYWxseSBzd2l0Y2hlc1xuICogdG8gdGhlIGNvdW50cnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaWFsIGNvZGUuXG4gKiBAcmVxdWlyZWRcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3NreVBob25lRmllbGRJbnB1dF0nLFxuICBwcm92aWRlcnM6IFtTS1lfUEhPTkVfRklFTERfVkFMVUVfQUNDRVNTT1IsIFNLWV9QSE9ORV9GSUVMRF9WQUxJREFUT1JdLFxufSlcbmV4cG9ydCBjbGFzcyBTa3lQaG9uZUZpZWxkSW5wdXREaXJlY3RpdmVcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvclxue1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgcGhvbmUgZmllbGQuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5waG9uZUZpZWxkQ29tcG9uZW50LmNvdW50cnlTZWxlY3REaXNhYmxlZCA9IHZhbHVlO1xuICAgIHRoaXMuYWRhcHRlclNlcnZpY2Uuc2V0RWxlbWVudERpc2FibGVkU3RhdGUodGhpcy5lbFJlZiwgdmFsdWUpO1xuICAgIHRoaXMuX2Rpc2FibGVkID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZCB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byBwcmV2ZW50IHZhbGlkYXRpb24gb24gdGhlIHBob25lIG51bWJlciBpbnB1dC4gRm9yIHZhbGlkYXRpb24sXG4gICAqIHBob25lIG51bWJlcnMgYXJlIGRyaXZlbiB0aHJvdWdoIHRoZSBgbmdNb2RlbGAgYXR0cmlidXRlIHRoYXQgeW91IHNwZWNpZnkgb24gYW5cbiAgICogYGlucHV0YCBlbGVtZW50IG9yIG9uIGEgYEZvcm1Db250cm9sYCBpbiBhIHJlYWN0aXZlIGZvcm0uIFRvIHByZXZlbnQgdmFsaWRhdGlvbixcbiAgICogc2V0IHRoaXMgcHJvcGVydHkgdG8gYHRydWVgLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNreVBob25lRmllbGROb1ZhbGlkYXRlID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBzZXQgbW9kZWxWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbW9kZWxWYWx1ZSA9IHZhbHVlO1xuXG4gICAgdGhpcy5hZGFwdGVyU2VydmljZS5zZXRFbGVtZW50VmFsdWUodGhpcy5lbFJlZiwgdmFsdWUpO1xuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMuZm9ybWF0TnVtYmVyKHZhbHVlLnRvU3RyaW5nKCkpO1xuXG4gICAgICB0aGlzLm9uQ2hhbmdlKGZvcm1hdHRlZFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdG9yQ2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGdldCBtb2RlbFZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX21vZGVsVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcblxuICBwcml2YXRlIHRleHRDaGFuZ2VzOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPjtcblxuICBwcml2YXRlIG5nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgcGhvbmVVdGlscyA9IFBob25lTnVtYmVyVXRpbC5nZXRJbnN0YW5jZSgpO1xuXG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuO1xuXG4gIHByaXZhdGUgX21vZGVsVmFsdWU6IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBlbFJlZjogRWxlbWVudFJlZixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGFkYXB0ZXJTZXJ2aWNlOiBTa3lQaG9uZUZpZWxkQWRhcHRlclNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBwaG9uZUZpZWxkQ29tcG9uZW50OiBTa3lQaG9uZUZpZWxkQ29tcG9uZW50XG4gICkge31cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBob25lRmllbGRDb21wb25lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1lvdSBtdXN0IHdyYXAgdGhlIGBza3lQaG9uZUZpZWxkSW5wdXRgIGRpcmVjdGl2ZSB3aXRoaW4gYSAnICtcbiAgICAgICAgICAnYDxza3ktcGhvbmUtZmllbGQ+YCBjb21wb25lbnQhJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLnNldEVsZW1lbnRUeXBlKHRoaXMuZWxSZWYpO1xuICAgIHRoaXMuYWRhcHRlclNlcnZpY2UuYWRkRWxlbWVudENsYXNzKHRoaXMuZWxSZWYsICdza3ktZm9ybS1jb250cm9sJyk7XG4gICAgaWYgKHRoaXMucGhvbmVGaWVsZENvbXBvbmVudC5zZWxlY3RlZENvdW50cnkpIHtcbiAgICAgIHRoaXMuYWRhcHRlclNlcnZpY2Uuc2V0RWxlbWVudFBsYWNlaG9sZGVyKFxuICAgICAgICB0aGlzLmVsUmVmLFxuICAgICAgICB0aGlzLnBob25lRmllbGRDb21wb25lbnQuc2VsZWN0ZWRDb3VudHJ5LmV4YW1wbGVOdW1iZXJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGFwdGVyU2VydmljZS5zZXRBcmlhTGFiZWwodGhpcy5lbFJlZik7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMucGhvbmVGaWVsZENvbXBvbmVudC5zZWxlY3RlZENvdW50cnlDaGFuZ2VcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoY291bnRyeTogU2t5UGhvbmVGaWVsZENvdW50cnkpID0+IHtcbiAgICAgICAgdGhpcy5tb2RlbFZhbHVlID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlO1xuICAgICAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLnNldEVsZW1lbnRQbGFjZWhvbGRlcihcbiAgICAgICAgICB0aGlzLmVsUmVmLFxuICAgICAgICAgIGNvdW50cnkuZXhhbXBsZU51bWJlclxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhZGRyZXNzIGEgYnVnIGluIEFuZ3VsYXIgNCwgd2hlcmUgdGhlIHZhbHVlIGlzIG5vdCBjaGFuZ2VkIG9uIHRoZSB2aWV3LlxuICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTM3OTJcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodGhpcy5tb2RlbFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGhlIG5ldyB2YWx1ZSBmb3IgcmVhY3RpdmUgZm9ybXMgb24gY2hhbmdlIGV2ZW50cyBvbiB0aGUgaW5wdXQgZWxlbWVudFxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGNoYW5nZSBldmVudCB0aGF0IHdhcyByZWNlaXZlZFxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignY2hhbmdlJywgWyckZXZlbnQnXSlcbiAgcHVibGljIG9uSW5wdXRDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy50ZXh0Q2hhbmdlcykge1xuICAgICAgdGhpcy5zZXR1cFRleHRDaGFuZ2VTdWJzY3JpcHRpb24oZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZXh0Q2hhbmdlcy5uZXh0KGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcmtzIHJlYWN0aXZlIGZvcm0gY29udHJvbHMgYXMgdG91Y2hlZCBvbiBpbnB1dCBibHVyIGV2ZW50c1xuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignYmx1cicpXG4gIHB1YmxpYyBvbklucHV0Qmx1cigpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignaW5wdXQnLCBbJyRldmVudCddKVxuICBwdWJsaWMgb25JbnB1dFR5cGluZyhldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRleHRDaGFuZ2VzKSB7XG4gICAgICB0aGlzLnNldHVwVGV4dENoYW5nZVN1YnNjcmlwdGlvbihldmVudC50YXJnZXQudmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRleHRDaGFuZ2VzLm5leHQoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBuZXcgdmFsdWUgZm9yIHJlYWN0aXZlIGZvcm1zXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgaW5wdXRcbiAgICovXG4gIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnBob25lRmllbGRDb21wb25lbnQuc2V0Q291bnRyeUJ5RGlhbENvZGUodmFsdWUpO1xuXG4gICAgdGhpcy5tb2RlbFZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBhbnkpID0+IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkaXNhYmxlZCBzdGF0ZSBvbiB0aGUgaW5wdXRcbiAgICogQHBhcmFtIGlzRGlzYWJsZWQgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgaW5wdXQncyBkaXNhYmxlZCBzdGF0ZVxuICAgKi9cbiAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlJ3MgdGhlIGZvcm0gY29udHJvbCdzIGN1cnJlbnQgdmFsdWVcbiAgICogQHBhcmFtIGNvbnRyb2wgdGhlIGZvcm0gY29udHJvbCBmb3IgdGhlIGlucHV0XG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB7XG4gICAgaWYgKCF0aGlzLmNvbnRyb2wpIHtcbiAgICAgIHRoaXMuY29udHJvbCA9IGNvbnRyb2w7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2t5UGhvbmVGaWVsZE5vVmFsaWRhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7XG5cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5waG9uZUZpZWxkQ29tcG9uZW50LnNlbGVjdGVkQ291bnRyeSAmJlxuICAgICAgIXRoaXMudmFsaWRhdGVOdW1iZXIodmFsdWUpXG4gICAgKSB7XG4gICAgICBpZiAoIXRoaXMudGV4dENoYW5nZXMpIHtcbiAgICAgICAgLy8gTWFyayB0aGUgaW52YWxpZCBjb250cm9sIGFzIHRvdWNoZWQgc28gdGhhdCB0aGUgaW5wdXQncyBpbnZhbGlkIENTUyBzdHlsZXMgYXBwZWFyLlxuICAgICAgICAvLyAoVGhpcyBpcyBvbmx5IHJlcXVpcmVkIHdoZW4gdGhlIGludmFsaWQgdmFsdWUgaXMgc2V0IGJ5IHRoZSBGb3JtQ29udHJvbCBjb25zdHJ1Y3Rvci4pXG4gICAgICAgIC8vIFdlIGRvbid0IGRvIHRoaXMgaWYgdGhlIGlucHV0IGlzIHRoZSBhY3RpdmUgZWxlbWVudCBzbyB0aGF0IHdlIGRvbid0IHNob3cgdmFsaWRhdGlvblxuICAgICAgICAvLyBlcnJvcnMgdW5sZXNzIGl0IGlzIGludmFsaWQgb24gaW5pdGlhbGl6YXRpb24gb3IgdGhlIGlucHV0IGhhcyBiZWVuIGJsdXJyZWQuXG4gICAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBza3lQaG9uZUZpZWxkOiB7XG4gICAgICAgICAgaW52YWxpZDogdmFsdWUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBUZXh0Q2hhbmdlU3Vic2NyaXB0aW9uKHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMudGV4dENoYW5nZXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRleHQpO1xuXG4gICAgdGhpcy50ZXh0Q2hhbmdlc1xuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDUwMCksIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgobmV3VmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZU51bWJlcihwaG9uZU51bWJlcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG51bWJlck9iaiA9IHRoaXMucGhvbmVVdGlscy5wYXJzZUFuZEtlZXBSYXdJbnB1dChcbiAgICAgICAgcGhvbmVOdW1iZXIsXG4gICAgICAgIHRoaXMucGhvbmVGaWVsZENvbXBvbmVudC5zZWxlY3RlZENvdW50cnkuaXNvMlxuICAgICAgKTtcblxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5waG9uZUZpZWxkQ29tcG9uZW50LmFsbG93RXh0ZW5zaW9ucyAmJlxuICAgICAgICBudW1iZXJPYmouZ2V0RXh0ZW5zaW9uKClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnBob25lVXRpbHMuaXNWYWxpZE51bWJlcihudW1iZXJPYmopO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0J3MgdGhlIGdpdmVuIHBob25lIG51bWJlciBiYXNlZCBvbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGNvdW50cnkuXG4gICAqIEBwYXJhbSBwaG9uZU51bWJlciBUaGUgbnVtYmVyIHRvIGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXROdW1iZXIocGhvbmVOdW1iZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG51bWJlck9iaiA9IHRoaXMucGhvbmVVdGlscy5wYXJzZUFuZEtlZXBSYXdJbnB1dChcbiAgICAgICAgcGhvbmVOdW1iZXIsXG4gICAgICAgIHRoaXMucGhvbmVGaWVsZENvbXBvbmVudC5zZWxlY3RlZENvdW50cnkuaXNvMlxuICAgICAgKTtcbiAgICAgIGlmICh0aGlzLnBob25lVXRpbHMuaXNQb3NzaWJsZU51bWJlcihudW1iZXJPYmopKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5waG9uZUZpZWxkQ29tcG9uZW50LnJldHVybkZvcm1hdCkge1xuICAgICAgICAgIGNhc2UgJ2ludGVybmF0aW9uYWwnOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGhvbmVVdGlscy5mb3JtYXQoXG4gICAgICAgICAgICAgIG51bWJlck9iaixcbiAgICAgICAgICAgICAgUGhvbmVOdW1iZXJGb3JtYXQuSU5URVJOQVRJT05BTFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjYXNlICduYXRpb25hbCc6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5waG9uZVV0aWxzLmZvcm1hdChcbiAgICAgICAgICAgICAgbnVtYmVyT2JqLFxuICAgICAgICAgICAgICBQaG9uZU51bWJlckZvcm1hdC5OQVRJT05BTFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjYXNlICdkZWZhdWx0JzpcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0aGlzLnBob25lRmllbGRDb21wb25lbnQuc2VsZWN0ZWRDb3VudHJ5LmlzbzIgIT09XG4gICAgICAgICAgICAgIHRoaXMucGhvbmVGaWVsZENvbXBvbmVudC5kZWZhdWx0Q291bnRyeVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnBob25lVXRpbHMuZm9ybWF0KFxuICAgICAgICAgICAgICAgIG51bWJlck9iaixcbiAgICAgICAgICAgICAgICBQaG9uZU51bWJlckZvcm1hdC5JTlRFUk5BVElPTkFMXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5waG9uZVV0aWxzLmZvcm1hdChcbiAgICAgICAgICAgICAgICBudW1iZXJPYmosXG4gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJGb3JtYXQuTkFUSU9OQUxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHBob25lTnVtYmVyO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8qIHNhbml0eSBjaGVjayAqL1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybiBwaG9uZU51bWJlcjtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIHByaXZhdGUgb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIHByaXZhdGUgb25Ub3VjaGVkID0gKCkgPT4ge307XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBwcml2YXRlIHZhbGlkYXRvckNoYW5nZSA9ICgpID0+IHt9O1xufVxuIl19