@theseam/ui-common 0.2.17 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/breadcrumbs/_breadcrumbs-theme.scss +3 -0
  2. package/breadcrumbs/breadcrumbs/breadcrumbs.component.scss +10 -0
  3. package/breadcrumbs/styles/_utilities.scss +3 -0
  4. package/breadcrumbs/styles/_variables.scss +1 -0
  5. package/breadcrumbs/theseam-ui-common-breadcrumbs.metadata.json +1 -1
  6. package/bundles/theseam-ui-common-breadcrumbs.umd.js +2 -1
  7. package/bundles/theseam-ui-common-breadcrumbs.umd.js.map +1 -1
  8. package/bundles/theseam-ui-common-form-field.umd.js +1 -1
  9. package/bundles/theseam-ui-common-form-field.umd.js.map +1 -1
  10. package/bundles/theseam-ui-common-framework.umd.js +18 -15
  11. package/bundles/theseam-ui-common-framework.umd.js.map +1 -1
  12. package/bundles/theseam-ui-common-google-maps.umd.js +2202 -0
  13. package/bundles/theseam-ui-common-google-maps.umd.js.map +1 -0
  14. package/bundles/theseam-ui-common-menu.umd.js +1 -0
  15. package/bundles/theseam-ui-common-menu.umd.js.map +1 -1
  16. package/bundles/theseam-ui-common-scrollbar.umd.js +1 -1
  17. package/bundles/theseam-ui-common-scrollbar.umd.js.map +1 -1
  18. package/bundles/theseam-ui-common-tel-input.umd.js +59 -7
  19. package/bundles/theseam-ui-common-tel-input.umd.js.map +1 -1
  20. package/bundles/theseam-ui-common-utils.umd.js +610 -136
  21. package/bundles/theseam-ui-common-utils.umd.js.map +1 -1
  22. package/bundles/theseam-ui-common-viewers.umd.js +269 -4
  23. package/bundles/theseam-ui-common-viewers.umd.js.map +1 -1
  24. package/bundles/theseam-ui-common-widget.umd.js +1 -1
  25. package/esm2015/breadcrumbs/breadcrumbs/breadcrumbs.component.js +4 -3
  26. package/esm2015/form-field/input.directive.js +2 -2
  27. package/esm2015/framework/base-layout/base-layout.component.js +3 -3
  28. package/esm2015/framework/top-bar/top-bar-menu-button/top-bar-menu-button.component.js +5 -5
  29. package/esm2015/framework/top-bar/top-bar-title/top-bar-title.component.js +4 -3
  30. package/esm2015/framework/top-bar/top-bar.component.js +10 -8
  31. package/esm2015/google-maps/google-maps/google-maps.component.js +261 -0
  32. package/esm2015/google-maps/google-maps-contextmenu.js +113 -0
  33. package/esm2015/google-maps/google-maps-controls.service.js +70 -0
  34. package/esm2015/google-maps/google-maps-feature-helpers.js +177 -0
  35. package/esm2015/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.component.js +195 -0
  36. package/esm2015/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.directive.js +163 -0
  37. package/esm2015/google-maps/google-maps-recenter-button-control/google-maps-recenter-button-control.component.js +57 -0
  38. package/esm2015/google-maps/google-maps-upload-button-control/google-maps-upload-button-control.component.js +119 -0
  39. package/esm2015/google-maps/google-maps.module.js +45 -0
  40. package/esm2015/google-maps/google-maps.service.js +344 -0
  41. package/esm2015/google-maps/map-control.component.js +65 -0
  42. package/esm2015/google-maps/map-controls-service.js +4 -0
  43. package/esm2015/google-maps/map-file-drop/map-file-drop.component.js +135 -0
  44. package/esm2015/google-maps/map-value-manager.service.js +46 -0
  45. package/esm2015/google-maps/public-api.js +14 -0
  46. package/esm2015/google-maps/theseam-ui-common-google-maps.js +6 -0
  47. package/esm2015/menu/menu-toggle.directive.js +2 -1
  48. package/esm2015/scrollbar/overlay-scrollbar.directive.js +2 -2
  49. package/esm2015/tel-input/tel-input/tel-input.component.js +10 -2
  50. package/esm2015/tel-input/tel-input.directive.js +50 -5
  51. package/esm2015/utils/geo-json/coerce-feature-collection.js +44 -0
  52. package/esm2015/utils/geo-json/geo-json-to-area.js +11 -0
  53. package/esm2015/utils/geo-json/is-feature-collection.validator.js +21 -0
  54. package/esm2015/utils/geo-json/is-only-geometry-types.js +23 -0
  55. package/esm2015/utils/geo-json/is-only-geometry-types.validator.js +32 -0
  56. package/esm2015/utils/geo-json/merge-polygons.js +35 -0
  57. package/esm2015/utils/geo-json/no-inner-rings.validator.js +63 -0
  58. package/esm2015/utils/geo-json/no-kinks.validator.js +39 -0
  59. package/esm2015/utils/geo-json/read-geo-file.js +99 -0
  60. package/esm2015/utils/geo-json/split-multi-polygons.js +29 -0
  61. package/esm2015/utils/is-null-or-undefined.js +1 -1
  62. package/esm2015/utils/public-api.js +11 -1
  63. package/esm2015/viewers/html-template-viewer/html-template-viewer.component.js +219 -0
  64. package/esm2015/viewers/html-template-viewer/html-template-viewer.module.js +23 -0
  65. package/esm2015/viewers/html-template-viewer/index.js +3 -0
  66. package/esm2015/viewers/public-api.js +2 -1
  67. package/esm2015/widget/widget/widget.component.js +1 -1
  68. package/fesm2015/theseam-ui-common-breadcrumbs.js +3 -2
  69. package/fesm2015/theseam-ui-common-breadcrumbs.js.map +1 -1
  70. package/fesm2015/theseam-ui-common-form-field.js +1 -1
  71. package/fesm2015/theseam-ui-common-form-field.js.map +1 -1
  72. package/fesm2015/theseam-ui-common-framework.js +15 -12
  73. package/fesm2015/theseam-ui-common-framework.js.map +1 -1
  74. package/fesm2015/theseam-ui-common-google-maps.js +1729 -0
  75. package/fesm2015/theseam-ui-common-google-maps.js.map +1 -0
  76. package/fesm2015/theseam-ui-common-menu.js +1 -0
  77. package/fesm2015/theseam-ui-common-menu.js.map +1 -1
  78. package/fesm2015/theseam-ui-common-scrollbar.js +1 -1
  79. package/fesm2015/theseam-ui-common-scrollbar.js.map +1 -1
  80. package/fesm2015/theseam-ui-common-tel-input.js +58 -6
  81. package/fesm2015/theseam-ui-common-tel-input.js.map +1 -1
  82. package/fesm2015/theseam-ui-common-utils.js +477 -94
  83. package/fesm2015/theseam-ui-common-utils.js.map +1 -1
  84. package/fesm2015/theseam-ui-common-viewers.js +237 -2
  85. package/fesm2015/theseam-ui-common-viewers.js.map +1 -1
  86. package/fesm2015/theseam-ui-common-widget.js +1 -1
  87. package/form-field/theseam-ui-common-form-field.metadata.json +1 -1
  88. package/framework/base-layout/base-layout.component.scss +14 -0
  89. package/framework/base-layout/styles/_variables.scss +14 -0
  90. package/framework/theseam-ui-common-framework.metadata.json +1 -1
  91. package/framework/top-bar/_top-bar-theme.scss +5 -0
  92. package/framework/top-bar/styles/_utilities.scss +3 -0
  93. package/framework/top-bar/styles/_variables.scss +18 -0
  94. package/framework/top-bar/top-bar-menu-button/top-bar-menu-button.component.d.ts +3 -1
  95. package/framework/top-bar/top-bar-menu-button/top-bar-menu-button.component.scss +15 -0
  96. package/framework/top-bar/top-bar-title/top-bar-title.component.scss +6 -0
  97. package/framework/top-bar/top-bar.component.d.ts +3 -0
  98. package/framework/top-bar/top-bar.component.scss +39 -0
  99. package/google-maps/google-maps/google-maps.component.d.ts +89 -0
  100. package/google-maps/google-maps-contextmenu.d.ts +15 -0
  101. package/google-maps/google-maps-controls.service.d.ts +23 -0
  102. package/google-maps/google-maps-feature-helpers.d.ts +37 -0
  103. package/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.component.d.ts +104 -0
  104. package/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.directive.d.ts +80 -0
  105. package/google-maps/google-maps-recenter-button-control/google-maps-recenter-button-control.component.d.ts +21 -0
  106. package/google-maps/google-maps-upload-button-control/google-maps-upload-button-control.component.d.ts +34 -0
  107. package/google-maps/google-maps.module.d.ts +2 -0
  108. package/google-maps/google-maps.service.d.ts +53 -0
  109. package/google-maps/map-control.component.d.ts +20 -0
  110. package/google-maps/map-controls-service.d.ts +13 -0
  111. package/google-maps/map-file-drop/map-file-drop.component.d.ts +34 -0
  112. package/google-maps/map-value-manager.service.d.ts +18 -0
  113. package/google-maps/package.json +11 -0
  114. package/google-maps/public-api.d.ts +13 -0
  115. package/google-maps/theseam-ui-common-google-maps.d.ts +5 -0
  116. package/google-maps/theseam-ui-common-google-maps.metadata.json +1 -0
  117. package/package.json +17 -10
  118. package/tel-input/tel-input.directive.d.ts +7 -3
  119. package/tel-input/theseam-ui-common-tel-input.metadata.json +1 -1
  120. package/utils/geo-json/coerce-feature-collection.d.ts +2 -0
  121. package/utils/geo-json/geo-json-to-area.d.ts +6 -0
  122. package/utils/geo-json/is-feature-collection.validator.d.ts +3 -0
  123. package/utils/geo-json/is-only-geometry-types.d.ts +5 -0
  124. package/utils/geo-json/is-only-geometry-types.validator.d.ts +4 -0
  125. package/utils/geo-json/merge-polygons.d.ts +9 -0
  126. package/utils/geo-json/no-inner-rings.validator.d.ts +10 -0
  127. package/utils/geo-json/no-kinks.validator.d.ts +3 -0
  128. package/utils/geo-json/read-geo-file.d.ts +7 -0
  129. package/utils/geo-json/split-multi-polygons.d.ts +8 -0
  130. package/utils/is-null-or-undefined.d.ts +1 -1
  131. package/utils/public-api.d.ts +10 -0
  132. package/utils/theseam-ui-common-utils.metadata.json +1 -1
  133. package/viewers/html-template-viewer/html-template-viewer.component.d.ts +67 -0
  134. package/viewers/html-template-viewer/html-template-viewer.module.d.ts +2 -0
  135. package/viewers/html-template-viewer/index.d.ts +2 -0
  136. package/viewers/public-api.d.ts +1 -0
  137. package/viewers/theseam-ui-common-viewers.metadata.json +1 -1
  138. package/widget/styles/_variables.scss +2 -0
  139. package/widget/theseam-ui-common-widget.metadata.json +1 -1
  140. package/widget/widget/widget.component.scss +2 -0
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Returns true if the GeoJSON is only specifies geometries.
3
+ */
4
+ export function isOnlyGeometryTypes(featureCollection, types) {
5
+ if (types.length === 0) {
6
+ if (featureCollection.features.length > 0) {
7
+ // If no types are specified then there can't be any specified types found.
8
+ return false;
9
+ }
10
+ else {
11
+ // If no types are specified and there are no features then there is
12
+ // nothing to say a specified type isn't found.
13
+ return true;
14
+ }
15
+ }
16
+ for (const f of featureCollection.features) {
17
+ if (types.indexOf(f.geometry.type) === -1) {
18
+ return false;
19
+ }
20
+ }
21
+ return true;
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtb25seS1nZW9tZXRyeS10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbW1vbi91dGlscy9nZW8tanNvbi9pcy1vbmx5LWdlb21ldHJ5LXR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOztHQUVHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLGlCQUFvQyxFQUFFLEtBQXlCO0lBQ2pHLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDdEIsSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN6QywyRUFBMkU7WUFDM0UsT0FBTyxLQUFLLENBQUE7U0FDYjthQUFNO1lBQ0wsb0VBQW9FO1lBQ3BFLCtDQUErQztZQUMvQyxPQUFPLElBQUksQ0FBQTtTQUNaO0tBQ0Y7SUFFRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLGlCQUFpQixDQUFDLFFBQVEsRUFBRTtRQUMxQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUN6QyxPQUFPLEtBQUssQ0FBQTtTQUNiO0tBQ0Y7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGZWF0dXJlQ29sbGVjdGlvbiwgR2VvbWV0cnkgfSBmcm9tICdnZW9qc29uJ1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgR2VvSlNPTiBpcyBvbmx5IHNwZWNpZmllcyBnZW9tZXRyaWVzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzT25seUdlb21ldHJ5VHlwZXMoZmVhdHVyZUNvbGxlY3Rpb246IEZlYXR1cmVDb2xsZWN0aW9uLCB0eXBlczogR2VvbWV0cnlbJ3R5cGUnXVtdKTogYm9vbGVhbiB7XHJcbiAgaWYgKHR5cGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgaWYgKGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gSWYgbm8gdHlwZXMgYXJlIHNwZWNpZmllZCB0aGVuIHRoZXJlIGNhbid0IGJlIGFueSBzcGVjaWZpZWQgdHlwZXMgZm91bmQuXHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gSWYgbm8gdHlwZXMgYXJlIHNwZWNpZmllZCBhbmQgdGhlcmUgYXJlIG5vIGZlYXR1cmVzIHRoZW4gdGhlcmUgaXNcclxuICAgICAgLy8gbm90aGluZyB0byBzYXkgYSBzcGVjaWZpZWQgdHlwZSBpc24ndCBmb3VuZC5cclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZvciAoY29uc3QgZiBvZiBmZWF0dXJlQ29sbGVjdGlvbi5mZWF0dXJlcykge1xyXG4gICAgaWYgKHR5cGVzLmluZGV4T2YoZi5nZW9tZXRyeS50eXBlKSA9PT0gLTEpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJ1ZVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,32 @@
1
+ import { isEmptyInputValue } from '../form/is-empty-input-value';
2
+ import { coerceFeatureCollection } from './coerce-feature-collection';
3
+ import { isOnlyGeometryTypes } from './is-only-geometry-types';
4
+ export const IS_ONLY_GEOMETRY_TYPES_VALIDATOR_NAME = 'is-only-geometry-types';
5
+ export function isOnlyGeometryTypesValidator(types) {
6
+ return (control) => {
7
+ // Don't need to validate if there isn't a value. Use `Validators.required` for that.
8
+ if (isEmptyInputValue(control.value)) {
9
+ return null; // don't validate empty values to allow optional controls
10
+ }
11
+ const value = coerceFeatureCollection(control.value);
12
+ if (value === null) {
13
+ // If there isn't a FeatureCollection then there is nothing to validate.
14
+ // Use 'isFeatureCollection' to validate the value is a FeatureCollection.
15
+ return null;
16
+ }
17
+ if (!isOnlyGeometryTypes(value, types)) {
18
+ const typesNotAllowed = value.features
19
+ .map(f => f.geometry.type)
20
+ .filter(t => types.indexOf(t) === -1);
21
+ const distinctTypesNotAllowed = Array.from(new Set(typesNotAllowed));
22
+ return {
23
+ [IS_ONLY_GEOMETRY_TYPES_VALIDATOR_NAME]: {
24
+ reason: `Only geometry type${(types.length === 1 ? '' : 's')} ${types.join(', ')} allowed.`,
25
+ notAllowedGeometryTypesFound: distinctTypesNotAllowed,
26
+ }
27
+ };
28
+ }
29
+ return null;
30
+ };
31
+ }
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtb25seS1nZW9tZXRyeS10eXBlcy52YWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vdXRpbHMvZ2VvLWpzb24vaXMtb25seS1nZW9tZXRyeS10eXBlcy52YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFDaEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFDckUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFFOUQsTUFBTSxDQUFDLE1BQU0scUNBQXFDLEdBQUcsd0JBQXdCLENBQUE7QUFFN0UsTUFBTSxVQUFVLDRCQUE0QixDQUFDLEtBQXlCO0lBQ3BFLE9BQU8sQ0FBQyxPQUF3QixFQUFFLEVBQUU7UUFDbEMscUZBQXFGO1FBQ3JGLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3BDLE9BQU8sSUFBSSxDQUFBLENBQUMseURBQXlEO1NBQ3RFO1FBRUQsTUFBTSxLQUFLLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRXBELElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUNsQix3RUFBd0U7WUFDeEUsMEVBQTBFO1lBQzFFLE9BQU8sSUFBSSxDQUFBO1NBQ1o7UUFFRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ3RDLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxRQUFRO2lCQUNuQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztpQkFDekIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3ZDLE1BQU0sdUJBQXVCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFBO1lBQ3BFLE9BQU87Z0JBQ0wsQ0FBQyxxQ0FBcUMsQ0FBQyxFQUFFO29CQUN2QyxNQUFNLEVBQUUscUJBQXFCLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVztvQkFDM0YsNEJBQTRCLEVBQUUsdUJBQXVCO2lCQUN0RDthQUNGLENBQUE7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQyxDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3JtcydcclxuXHJcbmltcG9ydCB7IEdlb21ldHJ5IH0gZnJvbSAnZ2VvanNvbidcclxuXHJcbmltcG9ydCB7IGlzRW1wdHlJbnB1dFZhbHVlIH0gZnJvbSAnLi4vZm9ybS9pcy1lbXB0eS1pbnB1dC12YWx1ZSdcclxuaW1wb3J0IHsgY29lcmNlRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvZXJjZS1mZWF0dXJlLWNvbGxlY3Rpb24nXHJcbmltcG9ydCB7IGlzT25seUdlb21ldHJ5VHlwZXMgfSBmcm9tICcuL2lzLW9ubHktZ2VvbWV0cnktdHlwZXMnXHJcblxyXG5leHBvcnQgY29uc3QgSVNfT05MWV9HRU9NRVRSWV9UWVBFU19WQUxJREFUT1JfTkFNRSA9ICdpcy1vbmx5LWdlb21ldHJ5LXR5cGVzJ1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzT25seUdlb21ldHJ5VHlwZXNWYWxpZGF0b3IodHlwZXM6IEdlb21ldHJ5Wyd0eXBlJ11bXSk6IFZhbGlkYXRvckZuIHtcclxuICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgLy8gRG9uJ3QgbmVlZCB0byB2YWxpZGF0ZSBpZiB0aGVyZSBpc24ndCBhIHZhbHVlLiBVc2UgYFZhbGlkYXRvcnMucmVxdWlyZWRgIGZvciB0aGF0LlxyXG4gICAgaWYgKGlzRW1wdHlJbnB1dFZhbHVlKGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiBudWxsIC8vIGRvbid0IHZhbGlkYXRlIGVtcHR5IHZhbHVlcyB0byBhbGxvdyBvcHRpb25hbCBjb250cm9sc1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZhbHVlID0gY29lcmNlRmVhdHVyZUNvbGxlY3Rpb24oY29udHJvbC52YWx1ZSlcclxuXHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgLy8gSWYgdGhlcmUgaXNuJ3QgYSBGZWF0dXJlQ29sbGVjdGlvbiB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gdmFsaWRhdGUuXHJcbiAgICAgIC8vIFVzZSAnaXNGZWF0dXJlQ29sbGVjdGlvbicgdG8gdmFsaWRhdGUgdGhlIHZhbHVlIGlzIGEgRmVhdHVyZUNvbGxlY3Rpb24uXHJcbiAgICAgIHJldHVybiBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFpc09ubHlHZW9tZXRyeVR5cGVzKHZhbHVlLCB0eXBlcykpIHtcclxuICAgICAgY29uc3QgdHlwZXNOb3RBbGxvd2VkID0gdmFsdWUuZmVhdHVyZXNcclxuICAgICAgICAubWFwKGYgPT4gZi5nZW9tZXRyeS50eXBlKVxyXG4gICAgICAgIC5maWx0ZXIodCA9PiB0eXBlcy5pbmRleE9mKHQpID09PSAtMSlcclxuICAgICAgY29uc3QgZGlzdGluY3RUeXBlc05vdEFsbG93ZWQgPSBBcnJheS5mcm9tKG5ldyBTZXQodHlwZXNOb3RBbGxvd2VkKSlcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBbSVNfT05MWV9HRU9NRVRSWV9UWVBFU19WQUxJREFUT1JfTkFNRV06IHtcclxuICAgICAgICAgIHJlYXNvbjogYE9ubHkgZ2VvbWV0cnkgdHlwZSR7KHR5cGVzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnKX0gJHt0eXBlcy5qb2luKCcsICcpfSBhbGxvd2VkLmAsXHJcbiAgICAgICAgICBub3RBbGxvd2VkR2VvbWV0cnlUeXBlc0ZvdW5kOiBkaXN0aW5jdFR5cGVzTm90QWxsb3dlZCxcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxufVxyXG5cclxuXHJcbiJdfQ==
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Merge Polygon and MultiPolygon geometries into a single MultiPolygon. Any
3
+ * properties, other than 'coordinates', of the Polygons and MultiPolygons will
4
+ * be lost.
5
+ *
6
+ * NOTE: Polygons and MultPolygons in a GeometryCollection will not be merged.
7
+ */
8
+ export function mergePolygons(featureCollection) {
9
+ const multiPolygon = {
10
+ type: 'MultiPolygon',
11
+ coordinates: [],
12
+ };
13
+ for (let i = 0; i < featureCollection.features.length; i++) {
14
+ const f = featureCollection.features[i];
15
+ if (f.geometry.type === 'Polygon') {
16
+ multiPolygon.coordinates.push(f.geometry.coordinates);
17
+ featureCollection.features.splice(i, 1);
18
+ i--;
19
+ }
20
+ else if (f.geometry.type === 'MultiPolygon') {
21
+ multiPolygon.coordinates.push(...f.geometry.coordinates);
22
+ featureCollection.features.splice(i, 1);
23
+ i--;
24
+ }
25
+ }
26
+ if (multiPolygon.coordinates.length > 0) {
27
+ const feature = {
28
+ type: 'Feature',
29
+ geometry: multiPolygon,
30
+ properties: {},
31
+ };
32
+ featureCollection.features.push(feature);
33
+ }
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2UtcG9seWdvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vdXRpbHMvZ2VvLWpzb24vbWVyZ2UtcG9seWdvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUE7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxpQkFBb0M7SUFDaEUsTUFBTSxZQUFZLEdBQWlCO1FBQ2pDLElBQUksRUFBRSxjQUFjO1FBQ3BCLFdBQVcsRUFBRSxFQUFFO0tBQ2hCLENBQUE7SUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMxRCxNQUFNLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdkMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDakMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUNyRCxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtZQUN2QyxDQUFDLEVBQUUsQ0FBQTtTQUNKO2FBQU0sSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxjQUFjLEVBQUU7WUFDN0MsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQ3hELGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBQ3ZDLENBQUMsRUFBRSxDQUFBO1NBQ0o7S0FDRjtJQUVELElBQUksWUFBWSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3ZDLE1BQU0sT0FBTyxHQUFZO1lBQ3ZCLElBQUksRUFBRSxTQUFTO1lBQ2YsUUFBUSxFQUFFLFlBQVk7WUFDdEIsVUFBVSxFQUFFLEVBQUc7U0FDaEIsQ0FBQTtRQUNELGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7S0FDekM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBGZWF0dXJlLFxyXG4gIEZlYXR1cmVDb2xsZWN0aW9uLFxyXG4gIE11bHRpUG9seWdvbixcclxufSBmcm9tICdnZW9qc29uJ1xyXG5cclxuLyoqXHJcbiAqIE1lcmdlIFBvbHlnb24gYW5kIE11bHRpUG9seWdvbiBnZW9tZXRyaWVzIGludG8gYSBzaW5nbGUgTXVsdGlQb2x5Z29uLiBBbnlcclxuICogcHJvcGVydGllcywgb3RoZXIgdGhhbiAnY29vcmRpbmF0ZXMnLCBvZiB0aGUgUG9seWdvbnMgYW5kIE11bHRpUG9seWdvbnMgd2lsbFxyXG4gKiBiZSBsb3N0LlxyXG4gKlxyXG4gKiBOT1RFOiBQb2x5Z29ucyBhbmQgTXVsdFBvbHlnb25zIGluIGEgR2VvbWV0cnlDb2xsZWN0aW9uIHdpbGwgbm90IGJlIG1lcmdlZC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVBvbHlnb25zKGZlYXR1cmVDb2xsZWN0aW9uOiBGZWF0dXJlQ29sbGVjdGlvbik6IHZvaWQge1xyXG4gIGNvbnN0IG11bHRpUG9seWdvbjogTXVsdGlQb2x5Z29uID0ge1xyXG4gICAgdHlwZTogJ011bHRpUG9seWdvbicsXHJcbiAgICBjb29yZGluYXRlczogW10sXHJcbiAgfVxyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBjb25zdCBmID0gZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXNbaV1cclxuICAgIGlmIChmLmdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJykge1xyXG4gICAgICBtdWx0aVBvbHlnb24uY29vcmRpbmF0ZXMucHVzaChmLmdlb21ldHJ5LmNvb3JkaW5hdGVzKVxyXG4gICAgICBmZWF0dXJlQ29sbGVjdGlvbi5mZWF0dXJlcy5zcGxpY2UoaSwgMSlcclxuICAgICAgaS0tXHJcbiAgICB9IGVsc2UgaWYgKGYuZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcclxuICAgICAgbXVsdGlQb2x5Z29uLmNvb3JkaW5hdGVzLnB1c2goLi4uZi5nZW9tZXRyeS5jb29yZGluYXRlcylcclxuICAgICAgZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMuc3BsaWNlKGksIDEpXHJcbiAgICAgIGktLVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaWYgKG11bHRpUG9seWdvbi5jb29yZGluYXRlcy5sZW5ndGggPiAwKSB7XHJcbiAgICBjb25zdCBmZWF0dXJlOiBGZWF0dXJlID0ge1xyXG4gICAgICB0eXBlOiAnRmVhdHVyZScsXHJcbiAgICAgIGdlb21ldHJ5OiBtdWx0aVBvbHlnb24sXHJcbiAgICAgIHByb3BlcnRpZXM6IHsgfSxcclxuICAgIH1cclxuICAgIGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzLnB1c2goZmVhdHVyZSlcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,63 @@
1
+ import { isEmptyInputValue } from '../form/is-empty-input-value';
2
+ import { coerceFeatureCollection } from './coerce-feature-collection';
3
+ export const NO_INNER_RINGS_VALIDATOR_NAME = 'no-inner-rings';
4
+ /**
5
+ * Validates that a FeatureCollection does not contain any Polygon with inner
6
+ * rings("holes").
7
+ *
8
+ * NOTE: Only considers Polygon and MultiPolygon. Does not consider
9
+ * GeometryCollection.
10
+ */
11
+ export function noInnerRingsValidator() {
12
+ return (control) => {
13
+ // Don't need to validate if there isn't a value. Use `Validators.required` for that.
14
+ if (isEmptyInputValue(control.value)) {
15
+ return null; // don't validate empty values to allow optional controls
16
+ }
17
+ const value = coerceFeatureCollection(control.value);
18
+ if (value === null) {
19
+ // If there isn't a FeatureCollection then there is nothing to validate.
20
+ // Use 'isFeatureCollection' to validate the value is a FeatureCollection.
21
+ return null;
22
+ }
23
+ if (hasInnerRing(value)) {
24
+ return {
25
+ [NO_INNER_RINGS_VALIDATOR_NAME]: {
26
+ reason: `A shape cannot have an inner ring.`
27
+ }
28
+ };
29
+ }
30
+ return null;
31
+ };
32
+ }
33
+ /**
34
+ * Checks if a FeatureCollection contains any geometries with an inner
35
+ * ring("hole").
36
+ *
37
+ * NOTE: Does not consider GeometryCollection.
38
+ */
39
+ function hasInnerRing(featureCollection) {
40
+ for (const f of featureCollection.features) {
41
+ // The spec says the right-hand rule must be followed, but also specifies
42
+ // that tools should not reject polygons that do not follow the right-hand
43
+ // rule. It does specify that the first ring must be the exterior ring and
44
+ // the others must be the interior. So, this should be safe to just check
45
+ // if there are multiple rings, instead of checking their winding orders.
46
+ //
47
+ // Polygon spec: https://datatracker.ietf.org/doc/html/rfc7946#section-3.1.6
48
+ if (f.geometry.type === 'Polygon') {
49
+ if (f.geometry.coordinates.length > 1) {
50
+ return true;
51
+ }
52
+ }
53
+ else if (f.geometry.type === 'MultiPolygon') {
54
+ for (const coords of f.geometry.coordinates) {
55
+ if (coords.length > 1) {
56
+ return true;
57
+ }
58
+ }
59
+ }
60
+ }
61
+ return false;
62
+ }
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8taW5uZXItcmluZ3MudmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tbW9uL3V0aWxzL2dlby1qc29uL25vLWlubmVyLXJpbmdzLnZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUNoRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQTtBQUVyRSxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxnQkFBZ0IsQ0FBQTtBQUU3RDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCO0lBQ25DLE9BQU8sQ0FBQyxPQUF3QixFQUFFLEVBQUU7UUFDbEMscUZBQXFGO1FBQ3JGLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3BDLE9BQU8sSUFBSSxDQUFBLENBQUMseURBQXlEO1NBQ3RFO1FBRUQsTUFBTSxLQUFLLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRXBELElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUNsQix3RUFBd0U7WUFDeEUsMEVBQTBFO1lBQzFFLE9BQU8sSUFBSSxDQUFBO1NBQ1o7UUFFRCxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN2QixPQUFPO2dCQUNMLENBQUMsNkJBQTZCLENBQUMsRUFBRTtvQkFDL0IsTUFBTSxFQUFFLG9DQUFvQztpQkFDN0M7YUFDRixDQUFBO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUMsQ0FBQTtBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsWUFBWSxDQUFDLGlCQUFvQztJQUN4RCxLQUFLLE1BQU0sQ0FBQyxJQUFJLGlCQUFpQixDQUFDLFFBQVEsRUFBRTtRQUMxQyx5RUFBeUU7UUFDekUsMEVBQTBFO1FBQzFFLDBFQUEwRTtRQUMxRSx5RUFBeUU7UUFDekUseUVBQXlFO1FBQ3pFLEVBQUU7UUFDRiw0RUFBNEU7UUFDNUUsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDakMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNyQyxPQUFPLElBQUksQ0FBQTthQUNaO1NBQ0Y7YUFBTSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLGNBQWMsRUFBRTtZQUM3QyxLQUFLLE1BQU0sTUFBTSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFO2dCQUMzQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNyQixPQUFPLElBQUksQ0FBQTtpQkFDWjthQUNGO1NBQ0Y7S0FDRjtJQUVELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3JtcydcclxuXHJcbmltcG9ydCB7IEZlYXR1cmVDb2xsZWN0aW9uIH0gZnJvbSAnZ2VvanNvbidcclxuXHJcbmltcG9ydCB7IGlzRW1wdHlJbnB1dFZhbHVlIH0gZnJvbSAnLi4vZm9ybS9pcy1lbXB0eS1pbnB1dC12YWx1ZSdcclxuaW1wb3J0IHsgY29lcmNlRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvZXJjZS1mZWF0dXJlLWNvbGxlY3Rpb24nXHJcblxyXG5leHBvcnQgY29uc3QgTk9fSU5ORVJfUklOR1NfVkFMSURBVE9SX05BTUUgPSAnbm8taW5uZXItcmluZ3MnXHJcblxyXG4vKipcclxuICogVmFsaWRhdGVzIHRoYXQgYSBGZWF0dXJlQ29sbGVjdGlvbiBkb2VzIG5vdCBjb250YWluIGFueSBQb2x5Z29uIHdpdGggaW5uZXJcclxuICogcmluZ3MoXCJob2xlc1wiKS5cclxuICpcclxuICogTk9URTogT25seSBjb25zaWRlcnMgUG9seWdvbiBhbmQgTXVsdGlQb2x5Z29uLiBEb2VzIG5vdCBjb25zaWRlclxyXG4gKiBHZW9tZXRyeUNvbGxlY3Rpb24uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbm9Jbm5lclJpbmdzVmFsaWRhdG9yKCk6IFZhbGlkYXRvckZuIHtcclxuICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgLy8gRG9uJ3QgbmVlZCB0byB2YWxpZGF0ZSBpZiB0aGVyZSBpc24ndCBhIHZhbHVlLiBVc2UgYFZhbGlkYXRvcnMucmVxdWlyZWRgIGZvciB0aGF0LlxyXG4gICAgaWYgKGlzRW1wdHlJbnB1dFZhbHVlKGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiBudWxsIC8vIGRvbid0IHZhbGlkYXRlIGVtcHR5IHZhbHVlcyB0byBhbGxvdyBvcHRpb25hbCBjb250cm9sc1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZhbHVlID0gY29lcmNlRmVhdHVyZUNvbGxlY3Rpb24oY29udHJvbC52YWx1ZSlcclxuXHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgLy8gSWYgdGhlcmUgaXNuJ3QgYSBGZWF0dXJlQ29sbGVjdGlvbiB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gdmFsaWRhdGUuXHJcbiAgICAgIC8vIFVzZSAnaXNGZWF0dXJlQ29sbGVjdGlvbicgdG8gdmFsaWRhdGUgdGhlIHZhbHVlIGlzIGEgRmVhdHVyZUNvbGxlY3Rpb24uXHJcbiAgICAgIHJldHVybiBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhhc0lubmVyUmluZyh2YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBbTk9fSU5ORVJfUklOR1NfVkFMSURBVE9SX05BTUVdOiB7XHJcbiAgICAgICAgICByZWFzb246IGBBIHNoYXBlIGNhbm5vdCBoYXZlIGFuIGlubmVyIHJpbmcuYFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIGEgRmVhdHVyZUNvbGxlY3Rpb24gY29udGFpbnMgYW55IGdlb21ldHJpZXMgd2l0aCBhbiBpbm5lclxyXG4gKiByaW5nKFwiaG9sZVwiKS5cclxuICpcclxuICogTk9URTogRG9lcyBub3QgY29uc2lkZXIgR2VvbWV0cnlDb2xsZWN0aW9uLlxyXG4gKi9cclxuZnVuY3Rpb24gaGFzSW5uZXJSaW5nKGZlYXR1cmVDb2xsZWN0aW9uOiBGZWF0dXJlQ29sbGVjdGlvbik6IGJvb2xlYW4ge1xyXG4gIGZvciAoY29uc3QgZiBvZiBmZWF0dXJlQ29sbGVjdGlvbi5mZWF0dXJlcykge1xyXG4gICAgLy8gVGhlIHNwZWMgc2F5cyB0aGUgcmlnaHQtaGFuZCBydWxlIG11c3QgYmUgZm9sbG93ZWQsIGJ1dCBhbHNvIHNwZWNpZmllc1xyXG4gICAgLy8gdGhhdCB0b29scyBzaG91bGQgbm90IHJlamVjdCBwb2x5Z29ucyB0aGF0IGRvIG5vdCBmb2xsb3cgdGhlIHJpZ2h0LWhhbmRcclxuICAgIC8vIHJ1bGUuIEl0IGRvZXMgc3BlY2lmeSB0aGF0IHRoZSBmaXJzdCByaW5nIG11c3QgYmUgdGhlIGV4dGVyaW9yIHJpbmcgYW5kXHJcbiAgICAvLyB0aGUgb3RoZXJzIG11c3QgYmUgdGhlIGludGVyaW9yLiBTbywgdGhpcyBzaG91bGQgYmUgc2FmZSB0byBqdXN0IGNoZWNrXHJcbiAgICAvLyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgcmluZ3MsIGluc3RlYWQgb2YgY2hlY2tpbmcgdGhlaXIgd2luZGluZyBvcmRlcnMuXHJcbiAgICAvL1xyXG4gICAgLy8gUG9seWdvbiBzcGVjOiBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzc5NDYjc2VjdGlvbi0zLjEuNlxyXG4gICAgaWYgKGYuZ2VvbWV0cnkudHlwZSA9PT0gJ1BvbHlnb24nKSB7XHJcbiAgICAgIGlmIChmLmdlb21ldHJ5LmNvb3JkaW5hdGVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGYuZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcclxuICAgICAgZm9yIChjb25zdCBjb29yZHMgb2YgZi5nZW9tZXRyeS5jb29yZGluYXRlcykge1xyXG4gICAgICAgIGlmIChjb29yZHMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBmYWxzZVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,39 @@
1
+ import kinks from '@turf/kinks';
2
+ import { isEmptyInputValue } from '../form/is-empty-input-value';
3
+ import { coerceFeatureCollection } from './coerce-feature-collection';
4
+ const kinkableGeometryTypes = ['LineString', 'MultiLineString', 'MultiPolygon', 'Polygon'];
5
+ export const NO_KINKS_VALIDATOR_NAME = 'no-kinks';
6
+ export function noKinksValidator() {
7
+ return (control) => {
8
+ // Don't need to validate if there isn't a value. Use `Validators.required` for that.
9
+ if (isEmptyInputValue(control.value)) {
10
+ return null; // don't validate empty values to allow optional controls
11
+ }
12
+ const value = coerceFeatureCollection(control.value);
13
+ if (value === null) {
14
+ return null;
15
+ }
16
+ const kinksFound = [];
17
+ for (const f of value.features) {
18
+ if (kinkableGeometryTypes.indexOf(f.geometry.type) !== -1) {
19
+ const _kinks = kinks(f);
20
+ if (_kinks.features.length > 0) {
21
+ kinksFound.push({
22
+ feature: f,
23
+ kinks: _kinks,
24
+ });
25
+ }
26
+ }
27
+ }
28
+ if (kinksFound.length > 0) {
29
+ return {
30
+ [NO_KINKS_VALIDATOR_NAME]: {
31
+ reason: 'Paths should not intersect themself.',
32
+ featuresWithKink: kinksFound,
33
+ }
34
+ };
35
+ }
36
+ return null;
37
+ };
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8ta2lua3MudmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tbW9uL3V0aWxzL2dlby1qc29uL25vLWtpbmtzLnZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssTUFBTSxhQUFhLENBQUE7QUFHL0IsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFDaEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFFckUsTUFBTSxxQkFBcUIsR0FBRyxDQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsU0FBUyxDQUFFLENBQUE7QUFFNUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsVUFBVSxDQUFBO0FBRWpELE1BQU0sVUFBVSxnQkFBZ0I7SUFDOUIsT0FBTyxDQUFDLE9BQXdCLEVBQUUsRUFBRTtRQUNsQyxxRkFBcUY7UUFDckYsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDcEMsT0FBTyxJQUFJLENBQUEsQ0FBQyx5REFBeUQ7U0FDdEU7UUFFRCxNQUFNLEtBQUssR0FBRyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFcEQsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO1lBQ2xCLE9BQU8sSUFBSSxDQUFBO1NBQ1o7UUFFRCxNQUFNLFVBQVUsR0FBcUQsRUFBRSxDQUFBO1FBQ3ZFLEtBQUssTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUM5QixJQUFJLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUN6RCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBUSxDQUFDLENBQUE7Z0JBQzlCLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUM5QixVQUFVLENBQUMsSUFBSSxDQUFDO3dCQUNkLE9BQU8sRUFBRSxDQUFDO3dCQUNWLEtBQUssRUFBRSxNQUFNO3FCQUNkLENBQUMsQ0FBQTtpQkFDSDthQUNGO1NBQ0Y7UUFFRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLE9BQU87Z0JBQ0wsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFO29CQUN6QixNQUFNLEVBQUUsc0NBQXNDO29CQUM5QyxnQkFBZ0IsRUFBRSxVQUFVO2lCQUM3QjthQUNGLENBQUE7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQyxDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3JtcydcclxuXHJcbmltcG9ydCBraW5rcyBmcm9tICdAdHVyZi9raW5rcydcclxuaW1wb3J0IHsgRmVhdHVyZSwgRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICdnZW9qc29uJ1xyXG5cclxuaW1wb3J0IHsgaXNFbXB0eUlucHV0VmFsdWUgfSBmcm9tICcuLi9mb3JtL2lzLWVtcHR5LWlucHV0LXZhbHVlJ1xyXG5pbXBvcnQgeyBjb2VyY2VGZWF0dXJlQ29sbGVjdGlvbiB9IGZyb20gJy4vY29lcmNlLWZlYXR1cmUtY29sbGVjdGlvbidcclxuXHJcbmNvbnN0IGtpbmthYmxlR2VvbWV0cnlUeXBlcyA9IFsgJ0xpbmVTdHJpbmcnLCAnTXVsdGlMaW5lU3RyaW5nJywgJ011bHRpUG9seWdvbicsICdQb2x5Z29uJyBdXHJcblxyXG5leHBvcnQgY29uc3QgTk9fS0lOS1NfVkFMSURBVE9SX05BTUUgPSAnbm8ta2lua3MnXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbm9LaW5rc1ZhbGlkYXRvcigpOiBWYWxpZGF0b3JGbiB7XHJcbiAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgIC8vIERvbid0IG5lZWQgdG8gdmFsaWRhdGUgaWYgdGhlcmUgaXNuJ3QgYSB2YWx1ZS4gVXNlIGBWYWxpZGF0b3JzLnJlcXVpcmVkYCBmb3IgdGhhdC5cclxuICAgIGlmIChpc0VtcHR5SW5wdXRWYWx1ZShjb250cm9sLnZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gbnVsbCAvLyBkb24ndCB2YWxpZGF0ZSBlbXB0eSB2YWx1ZXMgdG8gYWxsb3cgb3B0aW9uYWwgY29udHJvbHNcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2YWx1ZSA9IGNvZXJjZUZlYXR1cmVDb2xsZWN0aW9uKGNvbnRyb2wudmFsdWUpXHJcblxyXG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qga2lua3NGb3VuZDogeyBmZWF0dXJlOiBGZWF0dXJlLCBraW5rczogRmVhdHVyZUNvbGxlY3Rpb24gfVtdID0gW11cclxuICAgIGZvciAoY29uc3QgZiBvZiB2YWx1ZS5mZWF0dXJlcykge1xyXG4gICAgICBpZiAoa2lua2FibGVHZW9tZXRyeVR5cGVzLmluZGV4T2YoZi5nZW9tZXRyeS50eXBlKSAhPT0gLTEpIHtcclxuICAgICAgICBjb25zdCBfa2lua3MgPSBraW5rcyhmIGFzIGFueSlcclxuICAgICAgICBpZiAoX2tpbmtzLmZlYXR1cmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGtpbmtzRm91bmQucHVzaCh7XHJcbiAgICAgICAgICAgIGZlYXR1cmU6IGYsXHJcbiAgICAgICAgICAgIGtpbmtzOiBfa2lua3MsXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChraW5rc0ZvdW5kLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBbTk9fS0lOS1NfVkFMSURBVE9SX05BTUVdOiB7XHJcbiAgICAgICAgICByZWFzb246ICdQYXRocyBzaG91bGQgbm90IGludGVyc2VjdCB0aGVtc2VsZi4nLFxyXG4gICAgICAgICAgZmVhdHVyZXNXaXRoS2luazoga2lua3NGb3VuZCxcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,99 @@
1
+ import { __awaiter } from "tslib";
2
+ import { isDevMode } from '@angular/core';
3
+ import fileType from '@marklb/file-type';
4
+ const Buffer = require('buffer/').Buffer;
5
+ import shp from 'shpjs';
6
+ import { readFileAsync } from '../file-utils';
7
+ import { withoutProperty } from '../obj-utils';
8
+ /**
9
+ * Reads a File, or buffer of file content, in GeoJSON or ESRI Shapefile format
10
+ * and returns a GeoJSON `FeatureCollection`.
11
+ */
12
+ export function readGeoFile(fileOrBuffer) {
13
+ var _a;
14
+ return __awaiter(this, void 0, void 0, function* () {
15
+ const buffer = yield coerceFileOrBufferToBuffer(fileOrBuffer);
16
+ if (isShpFile(buffer)) {
17
+ return yield parseShpFile(buffer);
18
+ }
19
+ else if (((_a = fileType(buffer)) === null || _a === void 0 ? void 0 : _a.mime) === 'application/zip') {
20
+ try {
21
+ return yield parseShpZip(buffer);
22
+ }
23
+ catch (e) {
24
+ // NOTE: If 'shpjs' updates or we switch to a fork, where it doesn't use
25
+ // node buffers, then we can remove this rethrow.
26
+ if (isDevMode()) {
27
+ if (e.message === 'nodebuffer is not supported by this platform') {
28
+ console.warn('Try adding Buffer polyfill.\n' +
29
+ 'Install: npm install buffer\n' +
30
+ 'Add `global.Buffer = global.Buffer || require(\'buffer\').Buffer` to "src/polyfills.ts"');
31
+ }
32
+ }
33
+ throw e;
34
+ }
35
+ }
36
+ return parseGeoJson(buffer);
37
+ });
38
+ }
39
+ function coerceFileOrBufferToBuffer(fileOrBuffer) {
40
+ return __awaiter(this, void 0, void 0, function* () {
41
+ if (fileOrBuffer instanceof File) {
42
+ const arrBuf = yield readFileAsync(fileOrBuffer);
43
+ return Buffer.from(arrBuf);
44
+ }
45
+ return Buffer.from(fileOrBuffer);
46
+ });
47
+ }
48
+ // NOTE: Our current version of file-type does not detect shp files. We can
49
+ // remove this function when file-types is upgraded.
50
+ function isShpFile(buffer) {
51
+ const header = [0x27, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
52
+ const offset = 2;
53
+ if (buffer.length < (header.length + offset)) {
54
+ return false;
55
+ }
56
+ for (let i = 0; i < header.length; i++) {
57
+ if (header[i] !== buffer[i + offset]) {
58
+ return false;
59
+ }
60
+ }
61
+ return true;
62
+ }
63
+ function parseShpFile(buffer) {
64
+ return __awaiter(this, void 0, void 0, function* () {
65
+ const geometries = yield shp.parseShp(buffer, undefined);
66
+ const featCollection = {
67
+ type: 'FeatureCollection',
68
+ features: geometries.map(geom => ({
69
+ type: 'Feature',
70
+ geometry: geom,
71
+ properties: {}
72
+ }))
73
+ };
74
+ return featCollection;
75
+ });
76
+ }
77
+ function parseShpZip(buffer) {
78
+ return __awaiter(this, void 0, void 0, function* () {
79
+ let featCollection = yield shp.parseZip(buffer, undefined);
80
+ if (Array.isArray(featCollection)) {
81
+ if (featCollection.length === 0) {
82
+ throw Error(`Shape data not found.`);
83
+ }
84
+ else if (featCollection.length > 1) {
85
+ throw Error(`Multiple shape files not supported.`);
86
+ }
87
+ featCollection = featCollection[0];
88
+ }
89
+ return withoutProperty(featCollection, 'fileName');
90
+ });
91
+ }
92
+ function parseGeoJson(buffer) {
93
+ const json = JSON.parse(buffer.toString());
94
+ if ((json === null || json === void 0 ? void 0 : json.type) === 'FeatureCollection' && Array.isArray(json === null || json === void 0 ? void 0 : json.features)) {
95
+ return json;
96
+ }
97
+ throw Error(`Unable to parse as GeoJSON.`);
98
+ }
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZC1nZW8tZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbW1vbi91dGlscy9nZW8tanNvbi9yZWFkLWdlby1maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ3pDLE9BQU8sUUFBUSxNQUFNLG1CQUFtQixDQUFBO0FBRXhDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUE7QUFDeEMsT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFBO0FBRXZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUU5Qzs7O0dBR0c7QUFDSCxNQUFNLFVBQWdCLFdBQVcsQ0FBQyxZQUF5Qzs7O1FBQ3pFLE1BQU0sTUFBTSxHQUFHLE1BQU0sMEJBQTBCLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFN0QsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDckIsT0FBTyxNQUFNLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQTtTQUNsQzthQUFNLElBQUksQ0FBQSxNQUFBLFFBQVEsQ0FBQyxNQUFNLENBQUMsMENBQUUsSUFBSSxNQUFLLGlCQUFpQixFQUFFO1lBQ3ZELElBQUk7Z0JBQ0YsT0FBTyxNQUFNLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQTthQUNqQztZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLHdFQUF3RTtnQkFDeEUsaURBQWlEO2dCQUNqRCxJQUFJLFNBQVMsRUFBRSxFQUFFO29CQUNmLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyw4Q0FBOEMsRUFBRTt3QkFDaEUsT0FBTyxDQUFDLElBQUksQ0FDViwrQkFBK0I7NEJBQy9CLCtCQUErQjs0QkFDL0IseUZBQXlGLENBQzFGLENBQUE7cUJBQ0Y7aUJBQ0Y7Z0JBQ0QsTUFBTSxDQUFDLENBQUE7YUFDUjtTQUNGO1FBRUQsT0FBTyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUE7O0NBQzVCO0FBRUQsU0FBZSwwQkFBMEIsQ0FBQyxZQUF5Qzs7UUFDakYsSUFBSSxZQUFZLFlBQVksSUFBSSxFQUFFO1lBQ2hDLE1BQU0sTUFBTSxHQUFHLE1BQU0sYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFBO1lBQ2hELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtTQUMzQjtRQUVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0NBQUE7QUFFRCwyRUFBMkU7QUFDM0Usb0RBQW9EO0FBQ3BELFNBQVMsU0FBUyxDQUFDLE1BQWM7SUFDL0IsTUFBTSxNQUFNLEdBQUcsQ0FBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBRSxDQUFBO0lBQ3pGLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQTtJQUVoQixJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxFQUFFO1FBQzVDLE9BQU8sS0FBSyxDQUFBO0tBQ2I7SUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN0QyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFO1lBQ3BDLE9BQU8sS0FBSyxDQUFBO1NBQ2I7S0FDRjtJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVELFNBQWUsWUFBWSxDQUFDLE1BQWM7O1FBQ3hDLE1BQU0sVUFBVSxHQUFHLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsU0FBZ0IsQ0FBQyxDQUFBO1FBQy9ELE1BQU0sY0FBYyxHQUFzQjtZQUN4QyxJQUFJLEVBQUUsbUJBQW1CO1lBQ3pCLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsVUFBVSxFQUFFLEVBQUc7YUFDaEIsQ0FBQyxDQUFDO1NBQ0osQ0FBQTtRQUNELE9BQU8sY0FBYyxDQUFBO0lBQ3ZCLENBQUM7Q0FBQTtBQUVELFNBQWUsV0FBVyxDQUFDLE1BQWM7O1FBQ3ZDLElBQUksY0FBYyxHQUFHLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsU0FBZ0IsQ0FBQyxDQUFBO1FBQ2pFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUNqQyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUMvQixNQUFNLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO2FBQ3JDO2lCQUFNLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3BDLE1BQU0sS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUE7YUFDbkQ7WUFDRCxjQUFjLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFBO1NBQ25DO1FBQ0QsT0FBTyxlQUFlLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQ3BELENBQUM7Q0FBQTtBQUVELFNBQVMsWUFBWSxDQUFDLE1BQWM7SUFDbEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUUxQyxJQUFJLENBQUEsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLElBQUksTUFBSyxtQkFBbUIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxRQUFRLENBQUMsRUFBRTtRQUN2RSxPQUFPLElBQXlCLENBQUE7S0FDakM7SUFFRCxNQUFNLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IGZpbGVUeXBlIGZyb20gJ0BtYXJrbGIvZmlsZS10eXBlJ1xuaW1wb3J0IHsgRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICdnZW9qc29uJ1xuY29uc3QgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyLycpLkJ1ZmZlclxuaW1wb3J0IHNocCBmcm9tICdzaHBqcydcblxuaW1wb3J0IHsgcmVhZEZpbGVBc3luYyB9IGZyb20gJy4uL2ZpbGUtdXRpbHMnXG5pbXBvcnQgeyB3aXRob3V0UHJvcGVydHkgfSBmcm9tICcuLi9vYmotdXRpbHMnXG5cbi8qKlxuICogUmVhZHMgYSBGaWxlLCBvciBidWZmZXIgb2YgZmlsZSBjb250ZW50LCBpbiBHZW9KU09OIG9yIEVTUkkgU2hhcGVmaWxlIGZvcm1hdFxuICogYW5kIHJldHVybnMgYSBHZW9KU09OIGBGZWF0dXJlQ29sbGVjdGlvbmAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkR2VvRmlsZShmaWxlT3JCdWZmZXI6IEZpbGUgfCBBcnJheUJ1ZmZlciB8IEJ1ZmZlcik6IFByb21pc2U8RmVhdHVyZUNvbGxlY3Rpb24+IHtcbiAgY29uc3QgYnVmZmVyID0gYXdhaXQgY29lcmNlRmlsZU9yQnVmZmVyVG9CdWZmZXIoZmlsZU9yQnVmZmVyKVxuXG4gIGlmIChpc1NocEZpbGUoYnVmZmVyKSkge1xuICAgIHJldHVybiBhd2FpdCBwYXJzZVNocEZpbGUoYnVmZmVyKVxuICB9IGVsc2UgaWYgKGZpbGVUeXBlKGJ1ZmZlcik/Lm1pbWUgPT09ICdhcHBsaWNhdGlvbi96aXAnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBwYXJzZVNocFppcChidWZmZXIpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gTk9URTogSWYgJ3NocGpzJyB1cGRhdGVzIG9yIHdlIHN3aXRjaCB0byBhIGZvcmssIHdoZXJlIGl0IGRvZXNuJ3QgdXNlXG4gICAgICAvLyBub2RlIGJ1ZmZlcnMsIHRoZW4gd2UgY2FuIHJlbW92ZSB0aGlzIHJldGhyb3cuXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgaWYgKGUubWVzc2FnZSA9PT0gJ25vZGVidWZmZXIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHBsYXRmb3JtJykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICdUcnkgYWRkaW5nIEJ1ZmZlciBwb2x5ZmlsbC5cXG4nICtcbiAgICAgICAgICAgICdJbnN0YWxsOiBucG0gaW5zdGFsbCBidWZmZXJcXG4nICtcbiAgICAgICAgICAgICdBZGQgYGdsb2JhbC5CdWZmZXIgPSBnbG9iYWwuQnVmZmVyIHx8IHJlcXVpcmUoXFwnYnVmZmVyXFwnKS5CdWZmZXJgIHRvIFwic3JjL3BvbHlmaWxscy50c1wiJ1xuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJzZUdlb0pzb24oYnVmZmVyKVxufVxuXG5hc3luYyBmdW5jdGlvbiBjb2VyY2VGaWxlT3JCdWZmZXJUb0J1ZmZlcihmaWxlT3JCdWZmZXI6IEZpbGUgfCBBcnJheUJ1ZmZlciB8IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gIGlmIChmaWxlT3JCdWZmZXIgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgY29uc3QgYXJyQnVmID0gYXdhaXQgcmVhZEZpbGVBc3luYyhmaWxlT3JCdWZmZXIpXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFyckJ1ZilcbiAgfVxuXG4gIHJldHVybiBCdWZmZXIuZnJvbShmaWxlT3JCdWZmZXIpXG59XG5cbi8vIE5PVEU6IE91ciBjdXJyZW50IHZlcnNpb24gb2YgZmlsZS10eXBlIGRvZXMgbm90IGRldGVjdCBzaHAgZmlsZXMuIFdlIGNhblxuLy8gcmVtb3ZlIHRoaXMgZnVuY3Rpb24gd2hlbiBmaWxlLXR5cGVzIGlzIHVwZ3JhZGVkLlxuZnVuY3Rpb24gaXNTaHBGaWxlKGJ1ZmZlcjogQnVmZmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IGhlYWRlciA9IFsgMHgyNywgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCBdXG4gIGNvbnN0IG9mZnNldCA9IDJcblxuICBpZiAoYnVmZmVyLmxlbmd0aCA8IChoZWFkZXIubGVuZ3RoICsgb2Zmc2V0KSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaGVhZGVyW2ldICE9PSBidWZmZXJbaSArIG9mZnNldF0pIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlU2hwRmlsZShidWZmZXI6IEJ1ZmZlcik6IFByb21pc2U8RmVhdHVyZUNvbGxlY3Rpb24+IHtcbiAgY29uc3QgZ2VvbWV0cmllcyA9IGF3YWl0IHNocC5wYXJzZVNocChidWZmZXIsIHVuZGVmaW5lZCBhcyBhbnkpXG4gIGNvbnN0IGZlYXRDb2xsZWN0aW9uOiBGZWF0dXJlQ29sbGVjdGlvbiA9IHtcbiAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgIGZlYXR1cmVzOiBnZW9tZXRyaWVzLm1hcChnZW9tID0+ICh7XG4gICAgICB0eXBlOiAnRmVhdHVyZScsXG4gICAgICBnZW9tZXRyeTogZ2VvbSxcbiAgICAgIHByb3BlcnRpZXM6IHsgfVxuICAgIH0pKVxuICB9XG4gIHJldHVybiBmZWF0Q29sbGVjdGlvblxufVxuXG5hc3luYyBmdW5jdGlvbiBwYXJzZVNocFppcChidWZmZXI6IEJ1ZmZlcik6IFByb21pc2U8RmVhdHVyZUNvbGxlY3Rpb24+IHtcbiAgbGV0IGZlYXRDb2xsZWN0aW9uID0gYXdhaXQgc2hwLnBhcnNlWmlwKGJ1ZmZlciwgdW5kZWZpbmVkIGFzIGFueSlcbiAgaWYgKEFycmF5LmlzQXJyYXkoZmVhdENvbGxlY3Rpb24pKSB7XG4gICAgaWYgKGZlYXRDb2xsZWN0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFNoYXBlIGRhdGEgbm90IGZvdW5kLmApXG4gICAgfSBlbHNlIGlmIChmZWF0Q29sbGVjdGlvbi5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBFcnJvcihgTXVsdGlwbGUgc2hhcGUgZmlsZXMgbm90IHN1cHBvcnRlZC5gKVxuICAgIH1cbiAgICBmZWF0Q29sbGVjdGlvbiA9IGZlYXRDb2xsZWN0aW9uWzBdXG4gIH1cbiAgcmV0dXJuIHdpdGhvdXRQcm9wZXJ0eShmZWF0Q29sbGVjdGlvbiwgJ2ZpbGVOYW1lJylcbn1cblxuZnVuY3Rpb24gcGFyc2VHZW9Kc29uKGJ1ZmZlcjogQnVmZmVyKTogRmVhdHVyZUNvbGxlY3Rpb24ge1xuICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShidWZmZXIudG9TdHJpbmcoKSlcblxuICBpZiAoanNvbj8udHlwZSA9PT0gJ0ZlYXR1cmVDb2xsZWN0aW9uJyAmJiBBcnJheS5pc0FycmF5KGpzb24/LmZlYXR1cmVzKSkge1xuICAgIHJldHVybiBqc29uIGFzIEZlYXR1cmVDb2xsZWN0aW9uXG4gIH1cblxuICB0aHJvdyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGFzIEdlb0pTT04uYClcbn1cbiJdfQ==
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Split all MultiPolygon into Polygon. Any properties, other than
3
+ * 'coordinates', of the MultiPolygons will be lost.
4
+ *
5
+ * NOTE: MultiPolygons in a GeometryCollection will not be split.
6
+ */
7
+ export function splitMultiPolygons(featureCollection) {
8
+ for (let i = 0; i < featureCollection.features.length; i++) {
9
+ if (featureCollection.features[i]) {
10
+ const geometry = featureCollection.features[i].geometry;
11
+ if (geometry.type === 'MultiPolygon') {
12
+ const features = splitMultPolygon(geometry).map(p => ({
13
+ type: 'Feature',
14
+ geometry: p,
15
+ properties: {},
16
+ }));
17
+ featureCollection.features.splice(i, 1, ...features);
18
+ i += Math.max(features.length - 1, 0);
19
+ }
20
+ }
21
+ }
22
+ }
23
+ function splitMultPolygon(multiPolygon) {
24
+ return multiPolygon.coordinates.map(c => ({
25
+ type: 'Polygon',
26
+ coordinates: c,
27
+ }));
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQtbXVsdGktcG9seWdvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vdXRpbHMvZ2VvLWpzb24vc3BsaXQtbXVsdGktcG9seWdvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0E7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsaUJBQW9DO0lBQ3JFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzFELElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2pDLE1BQU0sUUFBUSxHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUE7WUFDdkQsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLGNBQWMsRUFBRTtnQkFDcEMsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDcEQsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsUUFBUSxFQUFFLENBQUM7b0JBQ1gsVUFBVSxFQUFFLEVBQUc7aUJBQ0osQ0FBQSxDQUFDLENBQUE7Z0JBQ2QsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUE7Z0JBQ3BELENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO2FBQ3RDO1NBQ0Y7S0FDRjtBQUNILENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLFlBQTBCO0lBQ2xELE9BQU8sWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLElBQUksRUFBRSxTQUFTO1FBQ2YsV0FBVyxFQUFFLENBQUM7S0FDZixDQUFDLENBQUMsQ0FBQTtBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQb2x5Z29uIH0gZnJvbSAnQHR1cmYvaGVscGVycydcclxuaW1wb3J0IHtcclxuICBGZWF0dXJlLFxyXG4gIEZlYXR1cmVDb2xsZWN0aW9uLFxyXG4gIE11bHRpUG9seWdvbixcclxufSBmcm9tICdnZW9qc29uJ1xyXG5cclxuLyoqXHJcbiAqIFNwbGl0IGFsbCBNdWx0aVBvbHlnb24gaW50byBQb2x5Z29uLiBBbnkgcHJvcGVydGllcywgb3RoZXIgdGhhblxyXG4gKiAnY29vcmRpbmF0ZXMnLCBvZiB0aGUgTXVsdGlQb2x5Z29ucyB3aWxsIGJlIGxvc3QuXHJcbiAqXHJcbiAqIE5PVEU6IE11bHRpUG9seWdvbnMgaW4gYSBHZW9tZXRyeUNvbGxlY3Rpb24gd2lsbCBub3QgYmUgc3BsaXQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRNdWx0aVBvbHlnb25zKGZlYXR1cmVDb2xsZWN0aW9uOiBGZWF0dXJlQ29sbGVjdGlvbik6IHZvaWQge1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcclxuICAgIGlmIChmZWF0dXJlQ29sbGVjdGlvbi5mZWF0dXJlc1tpXSkge1xyXG4gICAgICBjb25zdCBnZW9tZXRyeSA9IGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzW2ldLmdlb21ldHJ5XHJcbiAgICAgIGlmIChnZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xyXG4gICAgICAgIGNvbnN0IGZlYXR1cmVzID0gc3BsaXRNdWx0UG9seWdvbihnZW9tZXRyeSkubWFwKHAgPT4gKHtcclxuICAgICAgICAgIHR5cGU6ICdGZWF0dXJlJyxcclxuICAgICAgICAgIGdlb21ldHJ5OiBwLFxyXG4gICAgICAgICAgcHJvcGVydGllczogeyB9LFxyXG4gICAgICAgIH0gYXMgRmVhdHVyZSkpXHJcbiAgICAgICAgZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMuc3BsaWNlKGksIDEsIC4uLmZlYXR1cmVzKVxyXG4gICAgICAgIGkgKz0gTWF0aC5tYXgoZmVhdHVyZXMubGVuZ3RoIC0gMSwgMClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc3BsaXRNdWx0UG9seWdvbihtdWx0aVBvbHlnb246IE11bHRpUG9seWdvbik6IFBvbHlnb25bXSB7XHJcbiAgcmV0dXJuIG11bHRpUG9seWdvbi5jb29yZGluYXRlcy5tYXAoYyA9PiAoe1xyXG4gICAgdHlwZTogJ1BvbHlnb24nLFxyXG4gICAgY29vcmRpbmF0ZXM6IGMsXHJcbiAgfSkpXHJcbn1cclxuIl19
@@ -1,4 +1,4 @@
1
1
  export function isNullOrUndefined(value) {
2
2
  return value === undefined || value === null;
3
3
  }
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtbnVsbC1vci11bmRlZmluZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vdXRpbHMvaXMtbnVsbC1vci11bmRlZmluZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQVU7SUFDMUMsT0FBTyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUE7QUFDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZCh2YWx1ZTogYW55KSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsXG59XG4iXX0=
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtbnVsbC1vci11bmRlZmluZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vdXRpbHMvaXMtbnVsbC1vci11bmRlZmluZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLGlCQUFpQixDQUFJLEtBQTJCO0lBQzlELE9BQU8sS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFBO0FBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQ8VD4odmFsdWU6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogdmFsdWUgaXMgKG51bGwgfCB1bmRlZmluZWQpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGxcbn1cbiJdfQ==
@@ -11,6 +11,16 @@ export * from './form/has-required-control';
11
11
  export * from './form/is-empty-input-value';
12
12
  export * from './operators/index';
13
13
  export * from './router/index';
14
+ export * from './geo-json/coerce-feature-collection';
15
+ export * from './geo-json/geo-json-to-area';
16
+ export * from './geo-json/is-feature-collection.validator';
17
+ export * from './geo-json/is-only-geometry-types';
18
+ export * from './geo-json/is-only-geometry-types.validator';
19
+ export * from './geo-json/merge-polygons';
20
+ export * from './geo-json/no-inner-rings.validator';
21
+ export * from './geo-json/no-kinks.validator';
22
+ export * from './geo-json/read-geo-file';
23
+ export * from './geo-json/split-multi-polygons';
14
24
  export * from './array-move';
15
25
  export * from './calc-percentage';
16
26
  export * from './toggle-attribute';
@@ -36,4 +46,4 @@ export * from './pad-start';
36
46
  export * from './create-padding';
37
47
  export * from './is-numeric';
38
48
  export * from './fractional-digits-count';
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbW1vbi91dGlscy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsbUNBQW1DLENBQUE7QUFFakQsY0FBYyx5QkFBeUIsQ0FBQTtBQUN2QyxjQUFjLHlCQUF5QixDQUFBO0FBQ3ZDLGNBQWMscUNBQXFDLENBQUE7QUFDbkQsY0FBYywrQkFBK0IsQ0FBQTtBQUM3QyxjQUFjLDhCQUE4QixDQUFBO0FBQzVDLGNBQWMscUNBQXFDLENBQUE7QUFDbkQsY0FBYyw4QkFBOEIsQ0FBQTtBQUM1QyxjQUFjLG1DQUFtQyxDQUFBO0FBQ2pELGNBQWMsNkJBQTZCLENBQUE7QUFDM0MsY0FBYyw2QkFBNkIsQ0FBQTtBQUUzQyxjQUFjLG1CQUFtQixDQUFBO0FBRWpDLGNBQWMsZ0JBQWdCLENBQUE7QUFFOUIsY0FBYyxjQUFjLENBQUE7QUFDNUIsY0FBYyxtQkFBbUIsQ0FBQTtBQUNqQyxjQUFjLG9CQUFvQixDQUFBO0FBQ2xDLGNBQWMsaUJBQWlCLENBQUE7QUFDL0IsY0FBYyxlQUFlLENBQUE7QUFDN0IsY0FBYyx3QkFBd0IsQ0FBQTtBQUN0QyxjQUFjLGNBQWMsQ0FBQTtBQUM1QixjQUFjLG9CQUFvQixDQUFBO0FBQ2xDLGNBQWMsYUFBYSxDQUFBO0FBQzNCLGNBQWMsY0FBYyxDQUFBO0FBQzVCLGNBQWMseUJBQXlCLENBQUE7QUFDdkMsY0FBYywyQkFBMkIsQ0FBQTtBQUN6QyxjQUFjLGtCQUFrQixDQUFBO0FBQ2hDLGNBQWMsZUFBZSxDQUFBO0FBQzdCLGNBQWMsd0JBQXdCLENBQUE7QUFDdEMsY0FBYyxtQkFBbUIsQ0FBQTtBQUNqQyxjQUFjLG9CQUFvQixDQUFBO0FBQ2xDLGNBQWMsZ0JBQWdCLENBQUE7QUFDOUIsY0FBYyxpQkFBaUIsQ0FBQTtBQUMvQixjQUFjLHNCQUFzQixDQUFBO0FBQ3BDLGNBQWMsV0FBVyxDQUFBO0FBQ3pCLGNBQWMsYUFBYSxDQUFBO0FBQzNCLGNBQWMsa0JBQWtCLENBQUE7QUFDaEMsY0FBYyxjQUFjLENBQUE7QUFDNUIsY0FBYywyQkFBMkIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY2RrL2dldC1jbG9zZXN0LXdpZGdldC1jZGstZHJhZydcblxuZXhwb3J0ICogZnJvbSAnLi9mb3JtL2dldC1jb250cm9sLW5hbWUnXG5leHBvcnQgKiBmcm9tICcuL2Zvcm0vZ2V0LWNvbnRyb2wtcGF0aCdcbmV4cG9ydCAqIGZyb20gJy4vZm9ybS9vYnNlcnZlLWNvbnRyb2wtaXMtZGlmZmVyZW50J1xuZXhwb3J0ICogZnJvbSAnLi9mb3JtL29ic2VydmUtY29udHJvbC1zdGF0dXMnXG5leHBvcnQgKiBmcm9tICcuL2Zvcm0vb2JzZXJ2ZS1jb250cm9sLXZhbGlkJ1xuZXhwb3J0ICogZnJvbSAnLi9mb3JtL29ic2VydmUtY29udHJvbC12YWx1ZS1jaGFuZ2UnXG5leHBvcnQgKiBmcm9tICcuL2Zvcm0vb2JzZXJ2ZS1jb250cm9sLXZhbHVlJ1xuZXhwb3J0ICogZnJvbSAnLi9mb3JtL3dhaXQtb24tbm9uLXBlbmRpbmctc3RhdHVzJ1xuZXhwb3J0ICogZnJvbSAnLi9mb3JtL2hhcy1yZXF1aXJlZC1jb250cm9sJ1xuZXhwb3J0ICogZnJvbSAnLi9mb3JtL2lzLWVtcHR5LWlucHV0LXZhbHVlJ1xuXG5leHBvcnQgKiBmcm9tICcuL29wZXJhdG9ycy9pbmRleCdcblxuZXhwb3J0ICogZnJvbSAnLi9yb3V0ZXIvaW5kZXgnXG5cbmV4cG9ydCAqIGZyb20gJy4vYXJyYXktbW92ZSdcbmV4cG9ydCAqIGZyb20gJy4vY2FsYy1wZXJjZW50YWdlJ1xuZXhwb3J0ICogZnJvbSAnLi90b2dnbGUtYXR0cmlidXRlJ1xuZXhwb3J0ICogZnJvbSAnLi9nZXQtYXR0cmlidXRlJ1xuZXhwb3J0ICogZnJvbSAnLi9pbnB1dC1tYXNrcydcbmV4cG9ydCAqIGZyb20gJy4vaXMtbnVsbC1vci11bmRlZmluZWQnXG5leHBvcnQgKiBmcm9tICcuL2xvYWQtc3R5bGUnXG5leHBvcnQgKiBmcm9tICcuL2xvYWQtc3R5bGUtc2hlZXQnXG5leHBvcnQgKiBmcm9tICcuL29iai11dGlscydcbmV4cG9ydCAqIGZyb20gJy4vZmlsZS11dGlscydcbmV4cG9ydCAqIGZyb20gJy4vbm90LW51bGwtb3ItdW5kZWZpbmVkJ1xuZXhwb3J0ICogZnJvbSAnLi93YWl0LW9uLWNvbmRpdGlvbi1hc3luYydcbmV4cG9ydCAqIGZyb20gJy4vcG9sbGluZy10aWNrZXInXG5leHBvcnQgKiBmcm9tICcuL3JlZnJlc2hhYmxlJ1xuZXhwb3J0ICogZnJvbSAnLi93cmFwLWludG8tb2JzZXJ2YWJsZSdcbmV4cG9ydCAqIGZyb20gJy4vaXMtYWJzb2x1dGUtdXJsJ1xuZXhwb3J0ICogZnJvbSAnLi9zdWJzY3JpYmVyLWNvdW50J1xuZXhwb3J0ICogZnJvbSAnLi9oYXMtcHJvcGVydHknXG5leHBvcnQgKiBmcm9tICcuL2hhcy1hdHRyaWJ1dGUnXG5leHBvcnQgKiBmcm9tICcuL29ic2VydmUtcXVlcnktbGlzdCdcbmV4cG9ydCAqIGZyb20gJy4vcGFkLWVuZCdcbmV4cG9ydCAqIGZyb20gJy4vcGFkLXN0YXJ0J1xuZXhwb3J0ICogZnJvbSAnLi9jcmVhdGUtcGFkZGluZydcbmV4cG9ydCAqIGZyb20gJy4vaXMtbnVtZXJpYydcbmV4cG9ydCAqIGZyb20gJy4vZnJhY3Rpb25hbC1kaWdpdHMtY291bnQnXG4iXX0=
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbW1vbi91dGlscy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsbUNBQW1DLENBQUE7QUFFakQsY0FBYyx5QkFBeUIsQ0FBQTtBQUN2QyxjQUFjLHlCQUF5QixDQUFBO0FBQ3ZDLGNBQWMscUNBQXFDLENBQUE7QUFDbkQsY0FBYywrQkFBK0IsQ0FBQTtBQUM3QyxjQUFjLDhCQUE4QixDQUFBO0FBQzVDLGNBQWMscUNBQXFDLENBQUE7QUFDbkQsY0FBYyw4QkFBOEIsQ0FBQTtBQUM1QyxjQUFjLG1DQUFtQyxDQUFBO0FBQ2pELGNBQWMsNkJBQTZCLENBQUE7QUFDM0MsY0FBYyw2QkFBNkIsQ0FBQTtBQUUzQyxjQUFjLG1CQUFtQixDQUFBO0FBRWpDLGNBQWMsZ0JBQWdCLENBQUE7QUFFOUIsY0FBYyxzQ0FBc0MsQ0FBQTtBQUNwRCxjQUFjLDZCQUE2QixDQUFBO0FBQzNDLGNBQWMsNENBQTRDLENBQUE7QUFDMUQsY0FBYyxtQ0FBbUMsQ0FBQTtBQUNqRCxjQUFjLDZDQUE2QyxDQUFBO0FBQzNELGNBQWMsMkJBQTJCLENBQUE7QUFDekMsY0FBYyxxQ0FBcUMsQ0FBQTtBQUNuRCxjQUFjLCtCQUErQixDQUFBO0FBQzdDLGNBQWMsMEJBQTBCLENBQUE7QUFDeEMsY0FBYyxpQ0FBaUMsQ0FBQTtBQUUvQyxjQUFjLGNBQWMsQ0FBQTtBQUM1QixjQUFjLG1CQUFtQixDQUFBO0FBQ2pDLGNBQWMsb0JBQW9CLENBQUE7QUFDbEMsY0FBYyxpQkFBaUIsQ0FBQTtBQUMvQixjQUFjLGVBQWUsQ0FBQTtBQUM3QixjQUFjLHdCQUF3QixDQUFBO0FBQ3RDLGNBQWMsY0FBYyxDQUFBO0FBQzVCLGNBQWMsb0JBQW9CLENBQUE7QUFDbEMsY0FBYyxhQUFhLENBQUE7QUFDM0IsY0FBYyxjQUFjLENBQUE7QUFDNUIsY0FBYyx5QkFBeUIsQ0FBQTtBQUN2QyxjQUFjLDJCQUEyQixDQUFBO0FBQ3pDLGNBQWMsa0JBQWtCLENBQUE7QUFDaEMsY0FBYyxlQUFlLENBQUE7QUFDN0IsY0FBYyx3QkFBd0IsQ0FBQTtBQUN0QyxjQUFjLG1CQUFtQixDQUFBO0FBQ2pDLGNBQWMsb0JBQW9CLENBQUE7QUFDbEMsY0FBYyxnQkFBZ0IsQ0FBQTtBQUM5QixjQUFjLGlCQUFpQixDQUFBO0FBQy9CLGNBQWMsc0JBQXNCLENBQUE7QUFDcEMsY0FBYyxXQUFXLENBQUE7QUFDekIsY0FBYyxhQUFhLENBQUE7QUFDM0IsY0FBYyxrQkFBa0IsQ0FBQTtBQUNoQyxjQUFjLGNBQWMsQ0FBQTtBQUM1QixjQUFjLDJCQUEyQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9jZGsvZ2V0LWNsb3Nlc3Qtd2lkZ2V0LWNkay1kcmFnJ1xuXG5leHBvcnQgKiBmcm9tICcuL2Zvcm0vZ2V0LWNvbnRyb2wtbmFtZSdcbmV4cG9ydCAqIGZyb20gJy4vZm9ybS9nZXQtY29udHJvbC1wYXRoJ1xuZXhwb3J0ICogZnJvbSAnLi9mb3JtL29ic2VydmUtY29udHJvbC1pcy1kaWZmZXJlbnQnXG5leHBvcnQgKiBmcm9tICcuL2Zvcm0vb2JzZXJ2ZS1jb250cm9sLXN0YXR1cydcbmV4cG9ydCAqIGZyb20gJy4vZm9ybS9vYnNlcnZlLWNvbnRyb2wtdmFsaWQnXG5leHBvcnQgKiBmcm9tICcuL2Zvcm0vb2JzZXJ2ZS1jb250cm9sLXZhbHVlLWNoYW5nZSdcbmV4cG9ydCAqIGZyb20gJy4vZm9ybS9vYnNlcnZlLWNvbnRyb2wtdmFsdWUnXG5leHBvcnQgKiBmcm9tICcuL2Zvcm0vd2FpdC1vbi1ub24tcGVuZGluZy1zdGF0dXMnXG5leHBvcnQgKiBmcm9tICcuL2Zvcm0vaGFzLXJlcXVpcmVkLWNvbnRyb2wnXG5leHBvcnQgKiBmcm9tICcuL2Zvcm0vaXMtZW1wdHktaW5wdXQtdmFsdWUnXG5cbmV4cG9ydCAqIGZyb20gJy4vb3BlcmF0b3JzL2luZGV4J1xuXG5leHBvcnQgKiBmcm9tICcuL3JvdXRlci9pbmRleCdcblxuZXhwb3J0ICogZnJvbSAnLi9nZW8tanNvbi9jb2VyY2UtZmVhdHVyZS1jb2xsZWN0aW9uJ1xuZXhwb3J0ICogZnJvbSAnLi9nZW8tanNvbi9nZW8tanNvbi10by1hcmVhJ1xuZXhwb3J0ICogZnJvbSAnLi9nZW8tanNvbi9pcy1mZWF0dXJlLWNvbGxlY3Rpb24udmFsaWRhdG9yJ1xuZXhwb3J0ICogZnJvbSAnLi9nZW8tanNvbi9pcy1vbmx5LWdlb21ldHJ5LXR5cGVzJ1xuZXhwb3J0ICogZnJvbSAnLi9nZW8tanNvbi9pcy1vbmx5LWdlb21ldHJ5LXR5cGVzLnZhbGlkYXRvcidcbmV4cG9ydCAqIGZyb20gJy4vZ2VvLWpzb24vbWVyZ2UtcG9seWdvbnMnXG5leHBvcnQgKiBmcm9tICcuL2dlby1qc29uL25vLWlubmVyLXJpbmdzLnZhbGlkYXRvcidcbmV4cG9ydCAqIGZyb20gJy4vZ2VvLWpzb24vbm8ta2lua3MudmFsaWRhdG9yJ1xuZXhwb3J0ICogZnJvbSAnLi9nZW8tanNvbi9yZWFkLWdlby1maWxlJ1xuZXhwb3J0ICogZnJvbSAnLi9nZW8tanNvbi9zcGxpdC1tdWx0aS1wb2x5Z29ucydcblxuZXhwb3J0ICogZnJvbSAnLi9hcnJheS1tb3ZlJ1xuZXhwb3J0ICogZnJvbSAnLi9jYWxjLXBlcmNlbnRhZ2UnXG5leHBvcnQgKiBmcm9tICcuL3RvZ2dsZS1hdHRyaWJ1dGUnXG5leHBvcnQgKiBmcm9tICcuL2dldC1hdHRyaWJ1dGUnXG5leHBvcnQgKiBmcm9tICcuL2lucHV0LW1hc2tzJ1xuZXhwb3J0ICogZnJvbSAnLi9pcy1udWxsLW9yLXVuZGVmaW5lZCdcbmV4cG9ydCAqIGZyb20gJy4vbG9hZC1zdHlsZSdcbmV4cG9ydCAqIGZyb20gJy4vbG9hZC1zdHlsZS1zaGVldCdcbmV4cG9ydCAqIGZyb20gJy4vb2JqLXV0aWxzJ1xuZXhwb3J0ICogZnJvbSAnLi9maWxlLXV0aWxzJ1xuZXhwb3J0ICogZnJvbSAnLi9ub3QtbnVsbC1vci11bmRlZmluZWQnXG5leHBvcnQgKiBmcm9tICcuL3dhaXQtb24tY29uZGl0aW9uLWFzeW5jJ1xuZXhwb3J0ICogZnJvbSAnLi9wb2xsaW5nLXRpY2tlcidcbmV4cG9ydCAqIGZyb20gJy4vcmVmcmVzaGFibGUnXG5leHBvcnQgKiBmcm9tICcuL3dyYXAtaW50by1vYnNlcnZhYmxlJ1xuZXhwb3J0ICogZnJvbSAnLi9pcy1hYnNvbHV0ZS11cmwnXG5leHBvcnQgKiBmcm9tICcuL3N1YnNjcmliZXItY291bnQnXG5leHBvcnQgKiBmcm9tICcuL2hhcy1wcm9wZXJ0eSdcbmV4cG9ydCAqIGZyb20gJy4vaGFzLWF0dHJpYnV0ZSdcbmV4cG9ydCAqIGZyb20gJy4vb2JzZXJ2ZS1xdWVyeS1saXN0J1xuZXhwb3J0ICogZnJvbSAnLi9wYWQtZW5kJ1xuZXhwb3J0ICogZnJvbSAnLi9wYWQtc3RhcnQnXG5leHBvcnQgKiBmcm9tICcuL2NyZWF0ZS1wYWRkaW5nJ1xuZXhwb3J0ICogZnJvbSAnLi9pcy1udW1lcmljJ1xuZXhwb3J0ICogZnJvbSAnLi9mcmFjdGlvbmFsLWRpZ2l0cy1jb3VudCdcbiJdfQ==