ng-kinintel 0.0.397 → 20.0.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 (184) hide show
  1. package/fesm2022/ng-kinintel.mjs +11874 -0
  2. package/fesm2022/ng-kinintel.mjs.map +1 -0
  3. package/index.d.ts +2818 -5
  4. package/package.json +6 -14
  5. package/esm2020/lib/components/alert-groups/alert-groups.component.mjs +0 -76
  6. package/esm2020/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.mjs +0 -83
  7. package/esm2020/lib/components/dashboard-editor/configure-item/configure-item.component.mjs +0 -853
  8. package/esm2020/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.mjs +0 -56
  9. package/esm2020/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.mjs +0 -114
  10. package/esm2020/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.mjs +0 -163
  11. package/esm2020/lib/components/dashboard-editor/configure-item/vis-network-options.json +0 -135
  12. package/esm2020/lib/components/dashboard-editor/dashboard-editor.component.mjs +0 -580
  13. package/esm2020/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.mjs +0 -15
  14. package/esm2020/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.mjs +0 -50
  15. package/esm2020/lib/components/dashboard-editor/item-component/item-component.component.mjs +0 -1226
  16. package/esm2020/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.mjs +0 -111
  17. package/esm2020/lib/components/dashboards/dashboards.component.mjs +0 -163
  18. package/esm2020/lib/components/dashboards/view-dashboard/view-dashboard.component.mjs +0 -429
  19. package/esm2020/lib/components/data-explorer/change-source-warning/change-source-warning.component.mjs +0 -20
  20. package/esm2020/lib/components/data-explorer/data-explorer.component.mjs +0 -243
  21. package/esm2020/lib/components/data-explorer/export-data/export-data.component.mjs +0 -62
  22. package/esm2020/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.mjs +0 -70
  23. package/esm2020/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.mjs +0 -190
  24. package/esm2020/lib/components/data-picker/data-picker.component.mjs +0 -79
  25. package/esm2020/lib/components/data-search/data-search.component.mjs +0 -11
  26. package/esm2020/lib/components/data-sharing-invite/data-sharing-invite.component.mjs +0 -52
  27. package/esm2020/lib/components/dataset/create-dataset/create-dataset.component.mjs +0 -47
  28. package/esm2020/lib/components/dataset/dataset-editor/available-columns/available-columns.component.mjs +0 -28
  29. package/esm2020/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.mjs +0 -344
  30. package/esm2020/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.mjs +0 -80
  31. package/esm2020/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.mjs +0 -54
  32. package/esm2020/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.mjs +0 -67
  33. package/esm2020/lib/components/dataset/dataset-editor/dataset-editor.component.mjs +0 -1134
  34. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.mjs +0 -201
  35. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.mjs +0 -25
  36. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.mjs +0 -72
  37. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.mjs +0 -62
  38. package/esm2020/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.mjs +0 -41
  39. package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.mjs +0 -78
  40. package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.mjs +0 -39
  41. package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.mjs +0 -75
  42. package/esm2020/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.mjs +0 -107
  43. package/esm2020/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.mjs +0 -20
  44. package/esm2020/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.mjs +0 -20
  45. package/esm2020/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.mjs +0 -58
  46. package/esm2020/lib/components/dataset/dataset-editor/share-query/share-query.component.mjs +0 -110
  47. package/esm2020/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.mjs +0 -20
  48. package/esm2020/lib/components/dataset/dataset.component.mjs +0 -294
  49. package/esm2020/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.mjs +0 -130
  50. package/esm2020/lib/components/datasource/create-datasource/api-access/api-access.component.mjs +0 -132
  51. package/esm2020/lib/components/datasource/create-datasource/create-datasource.component.mjs +0 -729
  52. package/esm2020/lib/components/datasource/create-datasource/import-data/import-data.component.mjs +0 -146
  53. package/esm2020/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.mjs +0 -165
  54. package/esm2020/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.mjs +0 -145
  55. package/esm2020/lib/components/datasource/datasource.component.mjs +0 -162
  56. package/esm2020/lib/components/datasource/document-datasource/document-datasource.component.mjs +0 -297
  57. package/esm2020/lib/components/export-project/export-project.component.mjs +0 -29
  58. package/esm2020/lib/components/feeds/feed/feed.component.mjs +0 -92
  59. package/esm2020/lib/components/feeds/feeds.component.mjs +0 -145
  60. package/esm2020/lib/components/job-tasks/job-tasks.component.mjs +0 -25
  61. package/esm2020/lib/components/marketplace/marketplace.component.mjs +0 -65
  62. package/esm2020/lib/components/metadata/metadata.component.mjs +0 -65
  63. package/esm2020/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.mjs +0 -113
  64. package/esm2020/lib/components/notification-groups/notification-groups.component.mjs +0 -86
  65. package/esm2020/lib/components/project-picker/project-picker.component.mjs +0 -118
  66. package/esm2020/lib/components/project-settings/project-link-selection/project-link-selection.component.mjs +0 -104
  67. package/esm2020/lib/components/project-settings/project-settings.component.mjs +0 -155
  68. package/esm2020/lib/components/query-caching/edit-query-cache/edit-query-cache.component.mjs +0 -51
  69. package/esm2020/lib/components/query-caching/query-cache-view/query-cache-view.component.mjs +0 -121
  70. package/esm2020/lib/components/query-caching/query-caching.component.mjs +0 -162
  71. package/esm2020/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.mjs +0 -45
  72. package/esm2020/lib/components/shared-with-me/shared-with-me.component.mjs +0 -174
  73. package/esm2020/lib/components/snapshots/snapshots.component.mjs +0 -244
  74. package/esm2020/lib/components/tag-picker/tag-picker.component.mjs +0 -74
  75. package/esm2020/lib/components/task-time-periods/task-time-periods.component.mjs +0 -55
  76. package/esm2020/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.mjs +0 -40
  77. package/esm2020/lib/guards/dashboard-changes.guard.mjs +0 -22
  78. package/esm2020/lib/kinintel-config.mjs +0 -3
  79. package/esm2020/lib/ng-kinintel.module.mjs +0 -437
  80. package/esm2020/lib/objects/action-event.mjs +0 -16
  81. package/esm2020/lib/services/alert.service.mjs +0 -52
  82. package/esm2020/lib/services/dashboard.service.mjs +0 -75
  83. package/esm2020/lib/services/data-processor.service.mjs +0 -56
  84. package/esm2020/lib/services/data-search.service.mjs +0 -36
  85. package/esm2020/lib/services/dataset.service.mjs +0 -187
  86. package/esm2020/lib/services/datasource.service.mjs +0 -93
  87. package/esm2020/lib/services/external.service.mjs +0 -33
  88. package/esm2020/lib/services/feed.service.mjs +0 -50
  89. package/esm2020/lib/services/notification.service.mjs +0 -41
  90. package/esm2020/lib/services/project.service.mjs +0 -130
  91. package/esm2020/lib/services/tag.service.mjs +0 -63
  92. package/esm2020/ng-kinintel.mjs +0 -5
  93. package/esm2020/public-api.mjs +0 -43
  94. package/fesm2015/ng-kinintel.mjs +0 -12182
  95. package/fesm2015/ng-kinintel.mjs.map +0 -1
  96. package/fesm2020/ng-kinintel.mjs +0 -11872
  97. package/fesm2020/ng-kinintel.mjs.map +0 -1
  98. package/lib/components/alert-groups/alert-groups.component.d.ts +0 -30
  99. package/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.d.ts +0 -28
  100. package/lib/components/dashboard-editor/configure-item/configure-item.component.d.ts +0 -256
  101. package/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.d.ts +0 -16
  102. package/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.d.ts +0 -59
  103. package/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.d.ts +0 -26
  104. package/lib/components/dashboard-editor/dashboard-editor.component.d.ts +0 -85
  105. package/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.d.ts +0 -8
  106. package/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.d.ts +0 -22
  107. package/lib/components/dashboard-editor/item-component/item-component.component.d.ts +0 -264
  108. package/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.d.ts +0 -30
  109. package/lib/components/dashboards/dashboards.component.d.ts +0 -56
  110. package/lib/components/dashboards/view-dashboard/view-dashboard.component.d.ts +0 -81
  111. package/lib/components/data-explorer/change-source-warning/change-source-warning.component.d.ts +0 -11
  112. package/lib/components/data-explorer/data-explorer.component.d.ts +0 -61
  113. package/lib/components/data-explorer/export-data/export-data.component.d.ts +0 -17
  114. package/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.d.ts +0 -25
  115. package/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.d.ts +0 -44
  116. package/lib/components/data-picker/data-picker.component.d.ts +0 -32
  117. package/lib/components/data-search/data-search.component.d.ts +0 -5
  118. package/lib/components/data-sharing-invite/data-sharing-invite.component.d.ts +0 -21
  119. package/lib/components/dataset/create-dataset/create-dataset.component.d.ts +0 -17
  120. package/lib/components/dataset/dataset-editor/available-columns/available-columns.component.d.ts +0 -12
  121. package/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.d.ts +0 -61
  122. package/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.d.ts +0 -21
  123. package/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.d.ts +0 -20
  124. package/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.d.ts +0 -19
  125. package/lib/components/dataset/dataset-editor/dataset-editor.component.d.ts +0 -131
  126. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.d.ts +0 -63
  127. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.d.ts +0 -11
  128. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.d.ts +0 -20
  129. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.d.ts +0 -16
  130. package/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.d.ts +0 -18
  131. package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.d.ts +0 -23
  132. package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.d.ts +0 -13
  133. package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.d.ts +0 -22
  134. package/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.d.ts +0 -27
  135. package/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.d.ts +0 -11
  136. package/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.d.ts +0 -11
  137. package/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.d.ts +0 -25
  138. package/lib/components/dataset/dataset-editor/share-query/share-query.component.d.ts +0 -41
  139. package/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.d.ts +0 -11
  140. package/lib/components/dataset/dataset.component.d.ts +0 -74
  141. package/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.d.ts +0 -26
  142. package/lib/components/datasource/create-datasource/api-access/api-access.component.d.ts +0 -31
  143. package/lib/components/datasource/create-datasource/create-datasource.component.d.ts +0 -112
  144. package/lib/components/datasource/create-datasource/import-data/import-data.component.d.ts +0 -28
  145. package/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.d.ts +0 -40
  146. package/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.d.ts +0 -34
  147. package/lib/components/datasource/datasource.component.d.ts +0 -46
  148. package/lib/components/datasource/document-datasource/document-datasource.component.d.ts +0 -64
  149. package/lib/components/export-project/export-project.component.d.ts +0 -9
  150. package/lib/components/feeds/feed/feed.component.d.ts +0 -30
  151. package/lib/components/feeds/feeds.component.d.ts +0 -47
  152. package/lib/components/job-tasks/job-tasks.component.d.ts +0 -11
  153. package/lib/components/marketplace/marketplace.component.d.ts +0 -42
  154. package/lib/components/metadata/metadata.component.d.ts +0 -24
  155. package/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.d.ts +0 -37
  156. package/lib/components/notification-groups/notification-groups.component.d.ts +0 -28
  157. package/lib/components/project-picker/project-picker.component.d.ts +0 -37
  158. package/lib/components/project-settings/project-link-selection/project-link-selection.component.d.ts +0 -32
  159. package/lib/components/project-settings/project-settings.component.d.ts +0 -40
  160. package/lib/components/query-caching/edit-query-cache/edit-query-cache.component.d.ts +0 -17
  161. package/lib/components/query-caching/query-cache-view/query-cache-view.component.d.ts +0 -35
  162. package/lib/components/query-caching/query-caching.component.d.ts +0 -38
  163. package/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.d.ts +0 -21
  164. package/lib/components/shared-with-me/shared-with-me.component.d.ts +0 -43
  165. package/lib/components/snapshots/snapshots.component.d.ts +0 -52
  166. package/lib/components/tag-picker/tag-picker.component.d.ts +0 -27
  167. package/lib/components/task-time-periods/task-time-periods.component.d.ts +0 -20
  168. package/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.d.ts +0 -17
  169. package/lib/guards/dashboard-changes.guard.d.ts +0 -11
  170. package/lib/kinintel-config.d.ts +0 -10
  171. package/lib/ng-kinintel.module.d.ts +0 -116
  172. package/lib/objects/action-event.d.ts +0 -12
  173. package/lib/services/alert.service.d.ts +0 -17
  174. package/lib/services/dashboard.service.d.ts +0 -25
  175. package/lib/services/data-processor.service.d.ts +0 -18
  176. package/lib/services/data-search.service.d.ts +0 -14
  177. package/lib/services/dataset.service.d.ts +0 -56
  178. package/lib/services/datasource.service.d.ts +0 -34
  179. package/lib/services/external.service.d.ts +0 -12
  180. package/lib/services/feed.service.d.ts +0 -19
  181. package/lib/services/notification.service.d.ts +0 -16
  182. package/lib/services/project.service.d.ts +0 -27
  183. package/lib/services/tag.service.d.ts +0 -19
  184. package/public-api.d.ts +0 -38
@@ -1,201 +0,0 @@
1
- import { Component, Input, Output, EventEmitter } from '@angular/core';
2
- import * as lodash from 'lodash';
3
- import { COMMA, ENTER } from '@angular/cdk/keycodes';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/material/legacy-dialog";
6
- import * as i2 from "@angular/common";
7
- import * as i3 from "@angular/material/legacy-button";
8
- import * as i4 from "@angular/material/icon";
9
- import * as i5 from "@angular/material/legacy-menu";
10
- import * as i6 from "@angular/material/chips";
11
- import * as i7 from "@angular/forms";
12
- import * as i8 from "@angular/material/legacy-select";
13
- import * as i9 from "@angular/material/legacy-core";
14
- import * as i10 from "@angular/material/legacy-checkbox";
15
- import * as i11 from "../dataset-filter-inclusion/dataset-filter-inclusion.component";
16
- const _ = lodash.default;
17
- export class DatasetFilterComponent {
18
- constructor(dialog) {
19
- this.dialog = dialog;
20
- this.filterFields = [];
21
- this.filtersRemoved = new EventEmitter();
22
- this.customValue = false;
23
- this.customLhs = false;
24
- this._ = _;
25
- this.COMMA = COMMA;
26
- this.ENTER = ENTER;
27
- this.Object = Object;
28
- }
29
- static getFilterType(filterType) {
30
- return _.find(DatasetFilterComponent.filterTypes, { value: filterType }) || null;
31
- }
32
- ngOnInit() {
33
- this.customLhs = String(this.filter.lhsExpression).length &&
34
- !_.find(this.filterFields, field => {
35
- return `[[${field.name}]]` === this.filter.lhsExpression;
36
- });
37
- this.customValue = this.filter.rhsExpression.length && String(this.filter.rhsExpression[0]).length &&
38
- !_.find(this.joinFilterFields, field => {
39
- return `[[${field.name}]]` === this.filter.rhsExpression[0];
40
- });
41
- // Handle legacy string scenarios.
42
- if (_.isString(this.filter.rhsExpression)) {
43
- this.filter.rhsExpression = [this.filter.rhsExpression];
44
- }
45
- if (String(this.filter.rhsExpression[0]).includes('AGO') && !String(this.filter.rhsExpression[0]).includes('AGO}}')) {
46
- this.filter._expType = 'period';
47
- const periodValues = this.filter.rhsExpression[0].split('_');
48
- this.filter._periodValue = periodValues[0];
49
- this.filter._period = periodValues[1];
50
- }
51
- // If parameter value, make temporary members for binding
52
- if (this.filter.inclusionCriteria && this.filter.inclusionCriteria !== 'Always') {
53
- const splitData = this.filter.inclusionData.split('=');
54
- this.filter._inclusionParam = splitData[0];
55
- this.filter._inclusionParamValue = splitData.length > 1 ? splitData[1] : '';
56
- }
57
- }
58
- viewColumns(columns) {
59
- this.openSide.next(true);
60
- }
61
- updateCustom(custom) {
62
- if (!custom) {
63
- this.openSide.next(false);
64
- }
65
- }
66
- updateFilterType(filter) {
67
- if (filter.filterType !== 'similarto' && filter.filterType !== 'between'
68
- && filter.filterType !== 'like' && filter.filterType !== 'notlike' && filter.filterType !== 'in' && filter.filterType !== 'notin') {
69
- if (filter.rhsExpression && filter.rhsExpression.length > 1) {
70
- filter.rhsExpression = filter.rhsExpression.slice(0, 1);
71
- }
72
- }
73
- if (filter.filterType === 'similarto') {
74
- if (!filter.rhsExpression[1]) {
75
- filter.rhsExpression[1] = 1;
76
- }
77
- }
78
- if (filter.filterType === 'like' || filter.filterType === 'notlike') {
79
- if (!filter.rhsExpression[1]) {
80
- filter.rhsExpression[1] = 'likewildcard';
81
- }
82
- }
83
- }
84
- updateExpressionType(filter, type, value, fieldIndex = 0) {
85
- filter[fieldIndex === 0 ? '_expType' : '_otherExpType'] = type;
86
- if (type === 'period') {
87
- filter.rhsExpression[fieldIndex] = `${filter._periodValue || 1}_${filter._period || 'DAYS'}_AGO`;
88
- }
89
- else {
90
- if (filter.filterType == 'in' || filter.filterType == 'notin') {
91
- filter.rhsExpression.push(value);
92
- }
93
- else {
94
- filter.rhsExpression[fieldIndex] = value;
95
- }
96
- }
97
- }
98
- updatePeriodValue(value, period, filter, fieldIndex = 0) {
99
- filter.rhsExpression[fieldIndex] = `${value}_${period}_AGO`;
100
- }
101
- /**
102
- * Add an in value
103
- *
104
- * @param event
105
- */
106
- addInValue(event) {
107
- const value = (event.value || '').trim();
108
- // Add our fruit
109
- if (value) {
110
- this.filter.rhsExpression.push(value);
111
- }
112
- // Clear the input value
113
- event.chipInput.clear();
114
- }
115
- /**
116
- * Remove an in value
117
- *
118
- * @param inValue
119
- */
120
- removeInValue(inValue) {
121
- const index = this.filter.rhsExpression.indexOf(inValue);
122
- if (index >= 0) {
123
- this.filter.rhsExpression.splice(index, 1);
124
- }
125
- }
126
- /**
127
- * Edit an in value
128
- *
129
- * @param inValue
130
- * @param event
131
- */
132
- editInValue(inValue, event) {
133
- const value = event.value.trim();
134
- // Remove fruit if it no longer has a name
135
- if (!value) {
136
- this.removeInValue(inValue);
137
- return;
138
- }
139
- // Edit existing fruit
140
- const index = this.filter.rhsExpression.indexOf(inValue);
141
- if (index >= 0) {
142
- this.filter.rhsExpression[index].name = value;
143
- }
144
- }
145
- removeFilter() {
146
- this.filterJunction.filters.splice(this.filterIndex, 1);
147
- if (!this.filterJunction.filters.length &&
148
- !this.filterJunction.filterJunctions.length) {
149
- this.filtersRemoved.emit(this.filterJunction);
150
- }
151
- }
152
- getFilterTypes() {
153
- return DatasetFilterComponent.filterTypes;
154
- }
155
- }
156
- DatasetFilterComponent.filterTypes = [
157
- { label: '(==) Equal To', value: 'eq', string: '==' },
158
- { label: '(!=) Not Equal To', value: 'neq', string: '!=' },
159
- { label: 'Contains', value: 'contains', string: 'contains' },
160
- { label: 'Starts with', value: 'startswith', string: 'starts with' },
161
- { label: 'Ends with', value: 'endswith', string: 'ends with' },
162
- { label: 'Similar to', value: 'similarto', string: 'similar to' },
163
- { label: '(>) Greater Than', value: 'gt', string: '>' },
164
- { label: '(>=) Greater Than Or Equal To', value: 'gte', string: '>=' },
165
- { label: '(<) Less Than', value: 'lt', string: '<' },
166
- { label: '(<=) Less Than Or Equal To', value: 'lte', string: '<=' },
167
- { label: 'Between', value: 'between', string: 'between' },
168
- { label: 'Is Null', value: 'null', string: 'is null' },
169
- { label: 'Not Null', value: 'notnull', string: 'not null' },
170
- { label: 'Like', value: 'like', string: 'like' },
171
- { label: 'Not Like', value: 'notlike', string: 'not like' },
172
- { label: 'Bitwise AND', value: 'bitwiseand', string: 'bitwise and' },
173
- { label: 'Bitwise OR', value: 'bitwiseor', string: 'bitwise or' },
174
- { label: 'Is One Of', value: 'in', string: 'in' },
175
- { label: 'Is Not One Of', value: 'notin', string: 'not in' }
176
- ];
177
- DatasetFilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DatasetFilterComponent, deps: [{ token: i1.MatLegacyDialog }], target: i0.ɵɵFactoryTarget.Component });
178
- DatasetFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DatasetFilterComponent, selector: "ki-dataset-filter", inputs: { filter: "filter", filterIndex: "filterIndex", filterJunction: "filterJunction", filterFields: "filterFields", joinFilterFields: "joinFilterFields", joinFieldsName: "joinFieldsName", openSide: "openSide", parameterValues: "parameterValues" }, outputs: { filtersRemoved: "filtersRemoved" }, ngImport: i0, template: "<ng-template [ngIf]=\"!joinFilterFields\">\n <div class=\"w-full mr-4\">\n <div>\n <mat-select *ngIf=\"!customLhs\" [(value)]=\"filter.lhsExpression\" class=\"p-2 mr-4\" name=\"fieldName\">\n <mat-option value=\"\">-- Select Column Name --</mat-option>\n <mat-option *ngFor=\"let field of filterFields\" [value]=\"'[['+field.name+']]'\">{{ field.title }}\n </mat-option>\n </mat-select>\n\n <input *ngIf=\"customLhs\" type=\"text\" [(ngModel)]=\"filter.lhsExpression\"\n name=\"lhsExpression\" placeholder=\"Custom expression\" class=\"p-2 mr-4 full font-mono\">\n </div>\n <div class=\"mt-2 custom-checkbox flex items-center justify-between\">\n <div>\n <mat-checkbox [(ngModel)]=\"customLhs\" (ngModelChange)=\"updateCustom($event)\"></mat-checkbox>\n Custom expression\n </div>\n\n <a (click)=\"viewColumns(filterFields)\" *ngIf=\"customLhs && openSide\"\n class=\"text-xs ml-2 hover:underline flex items-center primary\">\n view docs&nbsp;\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path\n d=\"M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z\"/>\n <path d=\"M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z\"/>\n </svg>\n </a>\n </div>\n </div>\n\n <mat-select [(ngModel)]=\"filter.filterType\" class=\"p-2 mr-4\" name=\"filterType\"\n (ngModelChange)=\"updateFilterType(filter)\">\n <mat-option value=\"\">-- Select Condition --</mat-option>\n <mat-option [value]=\"filterType.value\" *ngFor=\"let filterType of getFilterTypes()\">\n {{ filterType.label }}\n </mat-option>\n </mat-select>\n\n <div class=\"w-full flex items-start\">\n <div class=\"relative w-full\">\n\n\n <mat-chip-grid *ngIf=\"filter.filterType === 'in' || filter.filterType === 'notin'\"\n class=\"bg-white pl-2 py-0.5 rounded border border-gray-200\" #chipGrid aria-label=\"Enter values\">\n <mat-chip-row *ngFor=\"let inValue of filter.rhsExpression\"\n class=\"bg-white my-0\"\n (removed)=\"removeInValue(inValue)\"\n [editable]=\"true\"\n (edited)=\"editInValue(inValue, $event)\"\n [aria-description]=\"'press enter to edit ' + inValue\">\n {{inValue}}\n <button matChipRemove [attr.aria-label]=\"'remove ' + inValue\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n <input placeholder=\"Value\" class=\"ml-0 border-0 pl-2 py-1.5 self-center\"\n [matChipInputFor]=\"chipGrid\"\n [matChipInputSeparatorKeyCodes]=\"[ENTER, COMMA]\"\n [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"addInValue($event)\"/>\n </mat-chip-grid>\n\n\n <input *ngIf=\"!filter._expType && filter.filterType !== 'in' && filter.filterType !== 'notin'\" type=\"text\" [(ngModel)]=\"filter.rhsExpression[0]\" name=\"filterValue\"\n placeholder=\"Value\"\n class=\"pl-2 py-2 pr-8 mr-4 full\">\n <input *ngIf=\"filter._expType === 'date-picker'\" type=\"date\" [(ngModel)]=\"filter.rhsExpression[0]\"\n name=\"filterValue\" placeholder=\"Value\"\n class=\"pl-2 py-2 pr-10 mr-4 full\">\n\n <ng-template [ngIf]=\"filter._expType === 'period'\">\n <div class=\"flex items-center\">\n <input #periodValue type=\"number\" placeholder=\"No.\" required autofocus\n class=\"w-32 mr-2 p-2\" min=\"0\" [value]=\"filter._periodValue || 1\"\n (change)=\"updatePeriodValue(periodValue.value, period.value, filter)\">\n\n <select class=\"param-period-picker w-32 mr-2 p-2\" [value]=\"filter._period || 'DAYS'\"\n #period (change)=\"updatePeriodValue(periodValue.value, period.value, filter)\">\n <option value=\"DAYS\">Days</option>\n <option value=\"HOURS\">Hours</option>\n </select>\n\n <div class=\"font-medium\">Ago</div>\n </div>\n </ng-template>\n\n <button class=\"absolute right-0 -top-0.5\" mat-icon-button [matMenuTriggerFor]=\"menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button *ngIf=\"filter.filterType !== 'in' && filter.filterType !== 'notin'\" mat-menu-item (click)=\"updateExpressionType(filter, null, [])\">\n <mat-icon>title</mat-icon>\n <span>Text</span>\n </button>\n <button *ngIf=\"filter.filterType !== 'in' && filter.filterType !== 'notin'\" mat-menu-item [matMenuTriggerFor]=\"columnMenu\">\n <mat-icon>table_chart</mat-icon>\n <span>Columns</span>\n </button>\n <button *ngIf=\"parameterValues && parameterValues.length\" mat-menu-item\n [matMenuTriggerFor]=\"parameterValuesMenu\">\n <mat-icon>text_fields</mat-icon>\n <span>Parameters</span>\n </button>\n <button *ngIf=\"filter.filterType !== 'in' && filter.filterType !== 'notin'\" mat-menu-item (click)=\"updateExpressionType(filter, 'date-picker', [])\">\n <mat-icon>calendar_month</mat-icon>\n <span>Date Picker</span>\n </button>\n <button *ngIf=\"filter.filterType !== 'in' && filter.filterType !== 'notin'\" mat-menu-item (click)=\"updateExpressionType(filter, 'period')\">\n <mat-icon>restore</mat-icon>\n <span>Time Period</span>\n </button>\n </mat-menu>\n <mat-menu #columnMenu=\"matMenu\">\n <button mat-menu-item *ngFor=\"let column of filterFields\"\n (click)=\"updateExpressionType(filter, null, '[[' + column.name + ']]')\">\n <span>{{column.title}}</span>\n </button>\n </mat-menu>\n <mat-menu #parameterValuesMenu=\"matMenu\">\n <button mat-menu-item *ngFor=\"let param of parameterValues\"\n (click)=\"updateExpressionType(filter, null, '{{' + param.name + '}}')\">\n <span>{{param.title}}</span>\n </button>\n </mat-menu>\n </div>\n <div\n *ngIf=\"(filter.filterType === 'similarto' || filter.filterType === 'between' || filter.filterType === 'like' || filter.filterType === 'notlike')\"\n class=\"ml-2 relative w-full\">\n\n <ng-template [ngIf]=\"filter.filterType === 'similarto'\">\n <select class=\"w-full\" name=\"similarityDistance\" [(ngModel)]=\"filter.rhsExpression[1]\">\n <option *ngFor=\"let val of _.range(10)\" [value]=\"val + 1\">\n {{ val + 1 }}\n </option>\n </select>\n <div class=\"text-xs text-gray-400\">Select Maximum Number of Changes</div>\n </ng-template>\n\n <ng-template [ngIf]=\"filter.filterType === 'like' || filter.filterType === 'notlike'\">\n <select class=\"w-full\" name=\"regexp\" [(ngModel)]=\"filter.rhsExpression[1]\">\n <option [value]=\"'likewildcard'\">\n Wildcard pattern\n </option>\n <option [value]=\"'likeregexp'\">\n Regular Expression\n </option>\n\n </select>\n <div class=\"text-xs text-gray-400\">Select Match Type</div>\n </ng-template>\n\n <div *ngIf=\"filter.filterType === 'between'\" class=\"relative flex items-center\">\n <div class=\"mr-2 font-medium\">and</div>\n <input type=\"text\" *ngIf=\"!filter._otherExpType\" type=\"text\" [(ngModel)]=\"filter.rhsExpression[1]\"\n name=\"otherbetween\" placeholder=\"To value\"\n class=\"pl-2 py-2 pr-8 full\">\n\n <input *ngIf=\"filter._otherExpType === 'date-picker'\" type=\"date\" [(ngModel)]=\"filter.rhsExpression[1]\"\n name=\"filterValue\" placeholder=\"Value\"\n class=\"pl-2 py-2 pr-10 mr-4 full\">\n\n <ng-template [ngIf]=\"filter._otherExpType === 'period'\">\n <div class=\"flex items-center\">\n <input #periodValue type=\"number\" placeholder=\"No.\" required autofocus\n class=\"w-32 mr-2 p-2\" min=\"0\" [value]=\"filter._otherPeriodValue || 1\"\n (change)=\"updatePeriodValue(periodValue.value, period.value, filter,1)\">\n\n <select class=\"param-period-picker w-32 mr-2 p-2\" [value]=\"filter._otherPeriod || 'DAYS'\"\n #period (change)=\"updatePeriodValue(periodValue.value, period.value, filter,1)\">\n <option value=\"DAYS\">Days</option>\n <option value=\"HOURS\">Hours</option>\n </select>\n\n <div class=\"font-medium\">Ago</div>\n </div>\n </ng-template>\n\n <button class=\"absolute right-0 -top-0.5\" mat-icon-button [matMenuTriggerFor]=\"otherMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #otherMenu=\"matMenu\">\n <button mat-menu-item (click)=\"updateExpressionType(filter, null, [], 1)\">\n <mat-icon>title</mat-icon>\n <span>Text</span>\n </button>\n <button mat-menu-item (click)=\"updateExpressionType(filter, 'date-picker', [], 1)\">\n <mat-icon>calendar_month</mat-icon>\n <span>Date Picker</span>\n </button>\n <button mat-menu-item (click)=\"updateExpressionType(filter, 'period', null, 1)\">\n <mat-icon>restore</mat-icon>\n <span>Time Period</span>\n </button>\n </mat-menu>\n\n\n </div>\n </div>\n </div>\n\n</ng-template>\n\n\n<ng-template [ngIf]=\"joinFilterFields\">\n <div class=\"w-full mr-4\">\n <div>\n <mat-select *ngIf=\"!customLhs\" [(value)]=\"filter.lhsExpression\" class=\"mr-4 p-2\" name=\"fieldName\">\n <mat-option value=\"\">-- Select Column Name --</mat-option>\n <mat-option *ngFor=\"let field of filterFields\" [value]=\"'[['+field.name+']]'\">{{ field.title }}\n </mat-option>\n </mat-select>\n\n <input *ngIf=\"customLhs\" type=\"text\" [(ngModel)]=\"filter.lhsExpression\"\n name=\"lhsExpression\" placeholder=\"Custom expression\" class=\"p-2 mr-4 full font-mono\">\n </div>\n <div class=\"mt-2 custom-checkbox flex items-center justify-between\">\n <div>\n <mat-checkbox [(ngModel)]=\"customLhs\" (ngModelChange)=\"updateCustom($event)\"></mat-checkbox>\n Custom expression\n </div>\n\n <a (click)=\"viewColumns(filterFields)\" *ngIf=\"customLhs && openSide\"\n class=\"text-xs ml-2 hover:underline flex items-center primary\">\n view docs&nbsp;\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path\n d=\"M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z\"/>\n <path d=\"M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z\"/>\n </svg>\n </a>\n </div>\n </div>\n\n <mat-select [(ngModel)]=\"filter.filterType\" class=\"mr-4 p-2\" name=\"filterType\"\n (ngModelChange)=\"updateFilterType(filter)\">\n <mat-option value=\"\">-- Select Condition --</mat-option>\n <mat-option [value]=\"filterType.value\" *ngFor=\"let filterType of getFilterTypes()\">\n {{ filterType.label }}\n </mat-option>\n </mat-select>\n\n <div class=\"w-full\">\n <div>\n <mat-select *ngIf=\"!customValue\" [(value)]=\"filter.rhsExpression[0]\" class=\"mr-4 p-2\">\n <mat-option value=\"\">-- Select Column Name --</mat-option>\n <mat-option *ngFor=\"let field of joinFilterFields\" [value]=\"'[['+field.name+']]'\">{{ field.title }}\n </mat-option>\n </mat-select>\n\n <input *ngIf=\"customValue\" type=\"text\" [(ngModel)]=\"filter.rhsExpression[0]\"\n name=\"filterValue\" placeholder=\"Custom value\" class=\"mr-4 full p-2 font-mono\">\n\n\n </div>\n <div class=\"mt-2 custom-checkbox flex items-center justify-between\">\n <div>\n <mat-checkbox [(ngModel)]=\"customValue\" (ngModelChange)=\"updateCustom($event)\"></mat-checkbox>\n Custom expression\n </div>\n\n <a (click)=\"viewColumns(filterFields)\" *ngIf=\"customValue && openSide\"\n class=\"text-xs ml-2 hover:underline flex items-center primary\">\n view docs&nbsp;\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path\n d=\"M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z\"/>\n <path d=\"M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z\"/>\n </svg>\n </a>\n </div>\n </div>\n\n <div *ngIf=\"filter.filterType === 'like' || filter.filterType === 'notlike'\" class=\"pl-2 pr-8 mr-4 full\">\n <select name=\"regexp\" [(ngModel)]=\"filter.rhsExpression[1]\">\n <option [value]=\"'likewildcard'\">\n Wildcard pattern\n </option>\n <option [value]=\"'likeregexp'\">\n Regular Expression\n </option>\n\n </select>\n <div class=\"text-xs text-gray-400\">Select Match Type</div>\n </div>\n\n <input *ngIf=\"filter.filterType === 'similarto'\" type=\"number\" [(ngModel)]=\"filter.rhsExpression[1]\"\n name=\"similarityDistance\" placeholder=\"Maximum Distance\"\n class=\"pl-2 py-2 pr-8 mr-4 full\">\n\n <input *ngIf=\"filter.filterType === 'between'\" type=\"text\" [(ngModel)]=\"filter.rhsExpression[1]\" name=\"otherValue\"\n placeholder=\"Other value\"\n class=\"pl-2 py-2 pr-8 mr-4 full\">\n\n\n</ng-template>\n\n<div *ngIf=\"!joinFilterFields\" class=\"flex items-start\">\n\n <ki-dataset-filter-inclusion [filter]=\"filter\" [parameterValues]=\"parameterValues\"></ki-dataset-filter-inclusion>\n\n</div>\n\n\n<div>\n <button mat-icon-button color=\"warn\" title=\"Remove filter\" (click)=\"removeFilter()\">\n <mat-icon>remove_circle_outline</mat-icon>\n </button>\n</div>\n\n", styles: [":host{padding:.5rem 0;display:flex;align-items:flex-start;position:relative}.filter{display:flex;flex-direction:column;margin:0;position:relative;background-color:transparent}.group-filters{margin-left:2rem;padding-left:2rem;position:relative}input{padding:.75rem;border-radius:4px;border-color:#dadada;outline:none;border-width:1px;border-style:solid}select{padding:.55rem!important;border-radius:4px;border-color:#dadada;outline:none;border-width:1px;border-style:solid}.custom-checkbox{margin:0;display:flex;align-items:center;min-width:120px}.custom-checkbox mat-checkbox{margin-right:.5rem}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.MatLegacyMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i5.MatLegacyMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i5.MatLegacyMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i6.MatChipGrid, selector: "mat-chip-grid", inputs: ["tabIndex", "disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i6.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i6.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i6.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["color", "disabled", "disableRipple", "tabIndex", "editable"], outputs: ["edited"] }, { kind: "directive", type: i7.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i7.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i7.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i10.MatLegacyCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i11.DatasetFilterInclusionComponent, selector: "ki-dataset-filter-inclusion", inputs: ["filter", "parameterValues", "dependsString"] }] });
179
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DatasetFilterComponent, decorators: [{
180
- type: Component,
181
- args: [{ selector: 'ki-dataset-filter', template: "<ng-template [ngIf]=\"!joinFilterFields\">\n <div class=\"w-full mr-4\">\n <div>\n <mat-select *ngIf=\"!customLhs\" [(value)]=\"filter.lhsExpression\" class=\"p-2 mr-4\" name=\"fieldName\">\n <mat-option value=\"\">-- Select Column Name --</mat-option>\n <mat-option *ngFor=\"let field of filterFields\" [value]=\"'[['+field.name+']]'\">{{ field.title }}\n </mat-option>\n </mat-select>\n\n <input *ngIf=\"customLhs\" type=\"text\" [(ngModel)]=\"filter.lhsExpression\"\n name=\"lhsExpression\" placeholder=\"Custom expression\" class=\"p-2 mr-4 full font-mono\">\n </div>\n <div class=\"mt-2 custom-checkbox flex items-center justify-between\">\n <div>\n <mat-checkbox [(ngModel)]=\"customLhs\" (ngModelChange)=\"updateCustom($event)\"></mat-checkbox>\n Custom expression\n </div>\n\n <a (click)=\"viewColumns(filterFields)\" *ngIf=\"customLhs && openSide\"\n class=\"text-xs ml-2 hover:underline flex items-center primary\">\n view docs&nbsp;\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path\n d=\"M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z\"/>\n <path d=\"M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z\"/>\n </svg>\n </a>\n </div>\n </div>\n\n <mat-select [(ngModel)]=\"filter.filterType\" class=\"p-2 mr-4\" name=\"filterType\"\n (ngModelChange)=\"updateFilterType(filter)\">\n <mat-option value=\"\">-- Select Condition --</mat-option>\n <mat-option [value]=\"filterType.value\" *ngFor=\"let filterType of getFilterTypes()\">\n {{ filterType.label }}\n </mat-option>\n </mat-select>\n\n <div class=\"w-full flex items-start\">\n <div class=\"relative w-full\">\n\n\n <mat-chip-grid *ngIf=\"filter.filterType === 'in' || filter.filterType === 'notin'\"\n class=\"bg-white pl-2 py-0.5 rounded border border-gray-200\" #chipGrid aria-label=\"Enter values\">\n <mat-chip-row *ngFor=\"let inValue of filter.rhsExpression\"\n class=\"bg-white my-0\"\n (removed)=\"removeInValue(inValue)\"\n [editable]=\"true\"\n (edited)=\"editInValue(inValue, $event)\"\n [aria-description]=\"'press enter to edit ' + inValue\">\n {{inValue}}\n <button matChipRemove [attr.aria-label]=\"'remove ' + inValue\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n <input placeholder=\"Value\" class=\"ml-0 border-0 pl-2 py-1.5 self-center\"\n [matChipInputFor]=\"chipGrid\"\n [matChipInputSeparatorKeyCodes]=\"[ENTER, COMMA]\"\n [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"addInValue($event)\"/>\n </mat-chip-grid>\n\n\n <input *ngIf=\"!filter._expType && filter.filterType !== 'in' && filter.filterType !== 'notin'\" type=\"text\" [(ngModel)]=\"filter.rhsExpression[0]\" name=\"filterValue\"\n placeholder=\"Value\"\n class=\"pl-2 py-2 pr-8 mr-4 full\">\n <input *ngIf=\"filter._expType === 'date-picker'\" type=\"date\" [(ngModel)]=\"filter.rhsExpression[0]\"\n name=\"filterValue\" placeholder=\"Value\"\n class=\"pl-2 py-2 pr-10 mr-4 full\">\n\n <ng-template [ngIf]=\"filter._expType === 'period'\">\n <div class=\"flex items-center\">\n <input #periodValue type=\"number\" placeholder=\"No.\" required autofocus\n class=\"w-32 mr-2 p-2\" min=\"0\" [value]=\"filter._periodValue || 1\"\n (change)=\"updatePeriodValue(periodValue.value, period.value, filter)\">\n\n <select class=\"param-period-picker w-32 mr-2 p-2\" [value]=\"filter._period || 'DAYS'\"\n #period (change)=\"updatePeriodValue(periodValue.value, period.value, filter)\">\n <option value=\"DAYS\">Days</option>\n <option value=\"HOURS\">Hours</option>\n </select>\n\n <div class=\"font-medium\">Ago</div>\n </div>\n </ng-template>\n\n <button class=\"absolute right-0 -top-0.5\" mat-icon-button [matMenuTriggerFor]=\"menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button *ngIf=\"filter.filterType !== 'in' && filter.filterType !== 'notin'\" mat-menu-item (click)=\"updateExpressionType(filter, null, [])\">\n <mat-icon>title</mat-icon>\n <span>Text</span>\n </button>\n <button *ngIf=\"filter.filterType !== 'in' && filter.filterType !== 'notin'\" mat-menu-item [matMenuTriggerFor]=\"columnMenu\">\n <mat-icon>table_chart</mat-icon>\n <span>Columns</span>\n </button>\n <button *ngIf=\"parameterValues && parameterValues.length\" mat-menu-item\n [matMenuTriggerFor]=\"parameterValuesMenu\">\n <mat-icon>text_fields</mat-icon>\n <span>Parameters</span>\n </button>\n <button *ngIf=\"filter.filterType !== 'in' && filter.filterType !== 'notin'\" mat-menu-item (click)=\"updateExpressionType(filter, 'date-picker', [])\">\n <mat-icon>calendar_month</mat-icon>\n <span>Date Picker</span>\n </button>\n <button *ngIf=\"filter.filterType !== 'in' && filter.filterType !== 'notin'\" mat-menu-item (click)=\"updateExpressionType(filter, 'period')\">\n <mat-icon>restore</mat-icon>\n <span>Time Period</span>\n </button>\n </mat-menu>\n <mat-menu #columnMenu=\"matMenu\">\n <button mat-menu-item *ngFor=\"let column of filterFields\"\n (click)=\"updateExpressionType(filter, null, '[[' + column.name + ']]')\">\n <span>{{column.title}}</span>\n </button>\n </mat-menu>\n <mat-menu #parameterValuesMenu=\"matMenu\">\n <button mat-menu-item *ngFor=\"let param of parameterValues\"\n (click)=\"updateExpressionType(filter, null, '{{' + param.name + '}}')\">\n <span>{{param.title}}</span>\n </button>\n </mat-menu>\n </div>\n <div\n *ngIf=\"(filter.filterType === 'similarto' || filter.filterType === 'between' || filter.filterType === 'like' || filter.filterType === 'notlike')\"\n class=\"ml-2 relative w-full\">\n\n <ng-template [ngIf]=\"filter.filterType === 'similarto'\">\n <select class=\"w-full\" name=\"similarityDistance\" [(ngModel)]=\"filter.rhsExpression[1]\">\n <option *ngFor=\"let val of _.range(10)\" [value]=\"val + 1\">\n {{ val + 1 }}\n </option>\n </select>\n <div class=\"text-xs text-gray-400\">Select Maximum Number of Changes</div>\n </ng-template>\n\n <ng-template [ngIf]=\"filter.filterType === 'like' || filter.filterType === 'notlike'\">\n <select class=\"w-full\" name=\"regexp\" [(ngModel)]=\"filter.rhsExpression[1]\">\n <option [value]=\"'likewildcard'\">\n Wildcard pattern\n </option>\n <option [value]=\"'likeregexp'\">\n Regular Expression\n </option>\n\n </select>\n <div class=\"text-xs text-gray-400\">Select Match Type</div>\n </ng-template>\n\n <div *ngIf=\"filter.filterType === 'between'\" class=\"relative flex items-center\">\n <div class=\"mr-2 font-medium\">and</div>\n <input type=\"text\" *ngIf=\"!filter._otherExpType\" type=\"text\" [(ngModel)]=\"filter.rhsExpression[1]\"\n name=\"otherbetween\" placeholder=\"To value\"\n class=\"pl-2 py-2 pr-8 full\">\n\n <input *ngIf=\"filter._otherExpType === 'date-picker'\" type=\"date\" [(ngModel)]=\"filter.rhsExpression[1]\"\n name=\"filterValue\" placeholder=\"Value\"\n class=\"pl-2 py-2 pr-10 mr-4 full\">\n\n <ng-template [ngIf]=\"filter._otherExpType === 'period'\">\n <div class=\"flex items-center\">\n <input #periodValue type=\"number\" placeholder=\"No.\" required autofocus\n class=\"w-32 mr-2 p-2\" min=\"0\" [value]=\"filter._otherPeriodValue || 1\"\n (change)=\"updatePeriodValue(periodValue.value, period.value, filter,1)\">\n\n <select class=\"param-period-picker w-32 mr-2 p-2\" [value]=\"filter._otherPeriod || 'DAYS'\"\n #period (change)=\"updatePeriodValue(periodValue.value, period.value, filter,1)\">\n <option value=\"DAYS\">Days</option>\n <option value=\"HOURS\">Hours</option>\n </select>\n\n <div class=\"font-medium\">Ago</div>\n </div>\n </ng-template>\n\n <button class=\"absolute right-0 -top-0.5\" mat-icon-button [matMenuTriggerFor]=\"otherMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #otherMenu=\"matMenu\">\n <button mat-menu-item (click)=\"updateExpressionType(filter, null, [], 1)\">\n <mat-icon>title</mat-icon>\n <span>Text</span>\n </button>\n <button mat-menu-item (click)=\"updateExpressionType(filter, 'date-picker', [], 1)\">\n <mat-icon>calendar_month</mat-icon>\n <span>Date Picker</span>\n </button>\n <button mat-menu-item (click)=\"updateExpressionType(filter, 'period', null, 1)\">\n <mat-icon>restore</mat-icon>\n <span>Time Period</span>\n </button>\n </mat-menu>\n\n\n </div>\n </div>\n </div>\n\n</ng-template>\n\n\n<ng-template [ngIf]=\"joinFilterFields\">\n <div class=\"w-full mr-4\">\n <div>\n <mat-select *ngIf=\"!customLhs\" [(value)]=\"filter.lhsExpression\" class=\"mr-4 p-2\" name=\"fieldName\">\n <mat-option value=\"\">-- Select Column Name --</mat-option>\n <mat-option *ngFor=\"let field of filterFields\" [value]=\"'[['+field.name+']]'\">{{ field.title }}\n </mat-option>\n </mat-select>\n\n <input *ngIf=\"customLhs\" type=\"text\" [(ngModel)]=\"filter.lhsExpression\"\n name=\"lhsExpression\" placeholder=\"Custom expression\" class=\"p-2 mr-4 full font-mono\">\n </div>\n <div class=\"mt-2 custom-checkbox flex items-center justify-between\">\n <div>\n <mat-checkbox [(ngModel)]=\"customLhs\" (ngModelChange)=\"updateCustom($event)\"></mat-checkbox>\n Custom expression\n </div>\n\n <a (click)=\"viewColumns(filterFields)\" *ngIf=\"customLhs && openSide\"\n class=\"text-xs ml-2 hover:underline flex items-center primary\">\n view docs&nbsp;\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path\n d=\"M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z\"/>\n <path d=\"M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z\"/>\n </svg>\n </a>\n </div>\n </div>\n\n <mat-select [(ngModel)]=\"filter.filterType\" class=\"mr-4 p-2\" name=\"filterType\"\n (ngModelChange)=\"updateFilterType(filter)\">\n <mat-option value=\"\">-- Select Condition --</mat-option>\n <mat-option [value]=\"filterType.value\" *ngFor=\"let filterType of getFilterTypes()\">\n {{ filterType.label }}\n </mat-option>\n </mat-select>\n\n <div class=\"w-full\">\n <div>\n <mat-select *ngIf=\"!customValue\" [(value)]=\"filter.rhsExpression[0]\" class=\"mr-4 p-2\">\n <mat-option value=\"\">-- Select Column Name --</mat-option>\n <mat-option *ngFor=\"let field of joinFilterFields\" [value]=\"'[['+field.name+']]'\">{{ field.title }}\n </mat-option>\n </mat-select>\n\n <input *ngIf=\"customValue\" type=\"text\" [(ngModel)]=\"filter.rhsExpression[0]\"\n name=\"filterValue\" placeholder=\"Custom value\" class=\"mr-4 full p-2 font-mono\">\n\n\n </div>\n <div class=\"mt-2 custom-checkbox flex items-center justify-between\">\n <div>\n <mat-checkbox [(ngModel)]=\"customValue\" (ngModelChange)=\"updateCustom($event)\"></mat-checkbox>\n Custom expression\n </div>\n\n <a (click)=\"viewColumns(filterFields)\" *ngIf=\"customValue && openSide\"\n class=\"text-xs ml-2 hover:underline flex items-center primary\">\n view docs&nbsp;\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path\n d=\"M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z\"/>\n <path d=\"M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z\"/>\n </svg>\n </a>\n </div>\n </div>\n\n <div *ngIf=\"filter.filterType === 'like' || filter.filterType === 'notlike'\" class=\"pl-2 pr-8 mr-4 full\">\n <select name=\"regexp\" [(ngModel)]=\"filter.rhsExpression[1]\">\n <option [value]=\"'likewildcard'\">\n Wildcard pattern\n </option>\n <option [value]=\"'likeregexp'\">\n Regular Expression\n </option>\n\n </select>\n <div class=\"text-xs text-gray-400\">Select Match Type</div>\n </div>\n\n <input *ngIf=\"filter.filterType === 'similarto'\" type=\"number\" [(ngModel)]=\"filter.rhsExpression[1]\"\n name=\"similarityDistance\" placeholder=\"Maximum Distance\"\n class=\"pl-2 py-2 pr-8 mr-4 full\">\n\n <input *ngIf=\"filter.filterType === 'between'\" type=\"text\" [(ngModel)]=\"filter.rhsExpression[1]\" name=\"otherValue\"\n placeholder=\"Other value\"\n class=\"pl-2 py-2 pr-8 mr-4 full\">\n\n\n</ng-template>\n\n<div *ngIf=\"!joinFilterFields\" class=\"flex items-start\">\n\n <ki-dataset-filter-inclusion [filter]=\"filter\" [parameterValues]=\"parameterValues\"></ki-dataset-filter-inclusion>\n\n</div>\n\n\n<div>\n <button mat-icon-button color=\"warn\" title=\"Remove filter\" (click)=\"removeFilter()\">\n <mat-icon>remove_circle_outline</mat-icon>\n </button>\n</div>\n\n", styles: [":host{padding:.5rem 0;display:flex;align-items:flex-start;position:relative}.filter{display:flex;flex-direction:column;margin:0;position:relative;background-color:transparent}.group-filters{margin-left:2rem;padding-left:2rem;position:relative}input{padding:.75rem;border-radius:4px;border-color:#dadada;outline:none;border-width:1px;border-style:solid}select{padding:.55rem!important;border-radius:4px;border-color:#dadada;outline:none;border-width:1px;border-style:solid}.custom-checkbox{margin:0;display:flex;align-items:center;min-width:120px}.custom-checkbox mat-checkbox{margin-right:.5rem}\n"] }]
182
- }], ctorParameters: function () { return [{ type: i1.MatLegacyDialog }]; }, propDecorators: { filter: [{
183
- type: Input
184
- }], filterIndex: [{
185
- type: Input
186
- }], filterJunction: [{
187
- type: Input
188
- }], filterFields: [{
189
- type: Input
190
- }], joinFilterFields: [{
191
- type: Input
192
- }], joinFieldsName: [{
193
- type: Input
194
- }], openSide: [{
195
- type: Input
196
- }], parameterValues: [{
197
- type: Input
198
- }], filtersRemoved: [{
199
- type: Output
200
- }] } });
201
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXNldC1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmcta2luaW50ZWwvc3JjL2xpYi9jb21wb25lbnRzL2RhdGFzZXQvZGF0YXNldC1lZGl0b3IvZGF0YXNldC1maWx0ZXJzL2RhdGFzZXQtZmlsdGVyL2RhdGFzZXQtZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWtpbmludGVsL3NyYy9saWIvY29tcG9uZW50cy9kYXRhc2V0L2RhdGFzZXQtZWRpdG9yL2RhdGFzZXQtZmlsdGVycy9kYXRhc2V0LWZpbHRlci9kYXRhc2V0LWZpbHRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBTWpDLE9BQU8sRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFKbkQsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQVd6QixNQUFNLE9BQU8sc0JBQXNCO0lBeUMvQixZQUFvQixNQUFpQjtRQUFqQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBZDVCLGlCQUFZLEdBQVEsRUFBRSxDQUFDO1FBTXRCLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV2QyxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE1BQUMsR0FBRyxDQUFDLENBQUM7UUFDTixVQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2QsVUFBSyxHQUFHLEtBQUssQ0FBQztRQWdLRixXQUFNLEdBQUcsTUFBTSxD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QUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBQztJQUN6RCxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFDO0lBQzlDLEVBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUM7SUFDekQsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBQztJQUNsRSxFQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFDO0lBQy9ELEVBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUM7SUFDL0MsRUFBQyxLQUFLLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBQztDQUM3RCxDQUFDO29IQXRCTyxzQkFBc0I7d0dBQXRCLHNCQUFzQixvV0NkbkMsNnZmQXFUQTs0RkR2U2Esc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNJLG1CQUFtQjtzR0E0QnBCLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUksY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIEV2ZW50RW1pdHRlcn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBsb2Rhc2ggZnJvbSAnbG9kYXNoJztcblxuY29uc3QgXyA9IGxvZGFzaC5kZWZhdWx0O1xuaW1wb3J0IHtNYXRMZWdhY3lEaWFsb2cgYXMgTWF0RGlhbG9nfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJztcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge01hdENoaXBFZGl0ZWRFdmVudCwgTWF0Q2hpcElucHV0RXZlbnR9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jaGlwc1wiO1xuaW1wb3J0IHtDT01NQSwgRU5URVJ9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAna2ktZGF0YXNldC1maWx0ZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRhc2V0LWZpbHRlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZGF0YXNldC1maWx0ZXIuY29tcG9uZW50LnNhc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRhc2V0RmlsdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZmlsdGVyVHlwZXMgPSBbXG4gICAgICAgIHtsYWJlbDogJyg9PSkgRXF1YWwgVG8nLCB2YWx1ZTogJ2VxJywgc3RyaW5nOiAnPT0nfSxcbiAgICAgICAge2xhYmVsOiAnKCE9KSBOb3QgRXF1YWwgVG8nLCB2YWx1ZTogJ25lcScsIHN0cmluZzogJyE9J30sXG4gICAgICAgIHtsYWJlbDogJ0NvbnRhaW5zJywgdmFsdWU6ICdjb250YWlucycsIHN0cmluZzogJ2NvbnRhaW5zJ30sXG4gICAgICAgIHtsYWJlbDogJ1N0YXJ0cyB3aXRoJywgdmFsdWU6ICdzdGFydHN3aXRoJywgc3RyaW5nOiAnc3RhcnRzIHdpdGgnfSxcbiAgICAgICAge2xhYmVsOiAnRW5kcyB3aXRoJywgdmFsdWU6ICdlbmRzd2l0aCcsIHN0cmluZzogJ2VuZHMgd2l0aCd9LFxuICAgICAgICB7bGFiZWw6ICdTaW1pbGFyIHRvJywgdmFsdWU6ICdzaW1pbGFydG8nLCBzdHJpbmc6ICdzaW1pbGFyIHRvJ30sXG4gICAgICAgIHtsYWJlbDogJyg+KSBHcmVhdGVyIFRoYW4nLCB2YWx1ZTogJ2d0Jywgc3RyaW5nOiAnPid9LFxuICAgICAgICB7bGFiZWw6ICcoPj0pIEdyZWF0ZXIgVGhhbiBPciBFcXVhbCBUbycsIHZhbHVlOiAnZ3RlJywgc3RyaW5nOiAnPj0nfSxcbiAgICAgICAge2xhYmVsOiAnKDwpIExlc3MgVGhhbicsIHZhbHVlOiAnbHQnLCBzdHJpbmc6ICc8J30sXG4gICAgICAgIHtsYWJlbDogJyg8PSkgTGVzcyBUaGFuIE9yIEVxdWFsIFRvJywgdmFsdWU6ICdsdGUnLCBzdHJpbmc6ICc8PSd9LFxuICAgICAgICB7bGFiZWw6ICdCZXR3ZWVuJywgdmFsdWU6ICdiZXR3ZWVuJywgc3RyaW5nOiAnYmV0d2Vlbid9LFxuICAgICAgICB7bGFiZWw6ICdJcyBOdWxsJywgdmFsdWU6ICdudWxsJywgc3RyaW5nOiAnaXMgbnVsbCd9LFxuICAgICAgICB7bGFiZWw6ICdOb3QgTnVsbCcsIHZhbHVlOiAnbm90bnVsbCcsIHN0cmluZzogJ25vdCBudWxsJ30sXG4gICAgICAgIHtsYWJlbDogJ0xpa2UnLCB2YWx1ZTogJ2xpa2UnLCBzdHJpbmc6ICdsaWtlJ30sXG4gICAgICAgIHtsYWJlbDogJ05vdCBMaWtlJywgdmFsdWU6ICdub3RsaWtlJywgc3RyaW5nOiAnbm90IGxpa2UnfSxcbiAgICAgICAge2xhYmVsOiAnQml0d2lzZSBBTkQnLCB2YWx1ZTogJ2JpdHdpc2VhbmQnLCBzdHJpbmc6ICdiaXR3aXNlIGFuZCd9LFxuICAgICAgICB7bGFiZWw6ICdCaXR3aXNlIE9SJywgdmFsdWU6ICdiaXR3aXNlb3InLCBzdHJpbmc6ICdiaXR3aXNlIG9yJ30sXG4gICAgICAgIHtsYWJlbDogJ0lzIE9uZSBPZicsIHZhbHVlOiAnaW4nLCBzdHJpbmc6ICdpbid9LFxuICAgICAgICB7bGFiZWw6ICdJcyBOb3QgT25lIE9mJywgdmFsdWU6ICdub3RpbicsIHN0cmluZzogJ25vdCBpbid9XG4gICAgXTtcblxuICAgIEBJbnB1dCgpIGZpbHRlcjogYW55O1xuICAgIEBJbnB1dCgpIGZpbHRlckluZGV4OiBhbnk7XG4gICAgQElucHV0KCkgZmlsdGVySnVuY3Rpb246IGFueTtcbiAgICBASW5wdXQoKSBmaWx0ZXJGaWVsZHM6IGFueSA9IFtdO1xuICAgIEBJbnB1dCgpIGpvaW5GaWx0ZXJGaWVsZHM6IGFueTtcbiAgICBASW5wdXQoKSBqb2luRmllbGRzTmFtZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpIG9wZW5TaWRlOiBTdWJqZWN0PGJvb2xlYW4+O1xuICAgIEBJbnB1dCgpIHBhcmFtZXRlclZhbHVlczogYW55O1xuXG4gICAgQE91dHB1dCgpIGZpbHRlcnNSZW1vdmVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgcHVibGljIGN1c3RvbVZhbHVlID0gZmFsc2U7XG4gICAgcHVibGljIGN1c3RvbUxocyA9IGZhbHNlO1xuICAgIHB1YmxpYyBfID0gXztcbiAgICBwdWJsaWMgQ09NTUEgPSBDT01NQTtcbiAgICBwdWJsaWMgRU5URVIgPSBFTlRFUjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2cpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEZpbHRlclR5cGUoZmlsdGVyVHlwZSkge1xuICAgICAgICByZXR1cm4gXy5maW5kKERhdGFzZXRGaWx0ZXJDb21wb25lbnQuZmlsdGVyVHlwZXMsIHt2YWx1ZTogZmlsdGVyVHlwZX0pIHx8IG51bGw7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5jdXN0b21MaHMgPSBTdHJpbmcodGhpcy5maWx0ZXIubGhzRXhwcmVzc2lvbikubGVuZ3RoICYmXG4gICAgICAgICAgICAhXy5maW5kKHRoaXMuZmlsdGVyRmllbGRzLCBmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbWyR7ZmllbGQubmFtZX1dXWAgPT09IHRoaXMuZmlsdGVyLmxoc0V4cHJlc3Npb247XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmN1c3RvbVZhbHVlID0gdGhpcy5maWx0ZXIucmhzRXhwcmVzc2lvbi5sZW5ndGggJiYgU3RyaW5nKHRoaXMuZmlsdGVyLnJoc0V4cHJlc3Npb25bMF0pLmxlbmd0aCAmJlxuICAgICAgICAgICAgIV8uZmluZCh0aGlzLmpvaW5GaWx0ZXJGaWVsZHMsIGZpZWxkID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFtbJHtmaWVsZC5uYW1lfV1dYCA9PT0gdGhpcy5maWx0ZXIucmhzRXhwcmVzc2lvblswXTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEhhbmRsZSBsZWdhY3kgc3RyaW5nIHNjZW5hcmlvcy5cbiAgICAgICAgaWYgKF8uaXNTdHJpbmcodGhpcy5maWx0ZXIucmhzRXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyLnJoc0V4cHJlc3Npb24gPSBbdGhpcy5maWx0ZXIucmhzRXhwcmVzc2lvbl07XG4gICAgICAgIH1cblxuXG4gICAgICAgIGlmIChTdHJpbmcodGhpcy5maWx0ZXIucmhzRXhwcmVzc2lvblswXSkuaW5jbHVkZXMoJ0FHTycpICYmICFTdHJpbmcodGhpcy5maWx0ZXIucmhzRXhwcmVzc2lvblswXSkuaW5jbHVkZXMoJ0FHT319JykpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyLl9leHBUeXBlID0gJ3BlcmlvZCc7XG4gICAgICAgICAgICBjb25zdCBwZXJpb2RWYWx1ZXMgPSB0aGlzLmZpbHRlci5yaHNFeHByZXNzaW9uWzBdLnNwbGl0KCdfJyk7XG4gICAgICAgICAgICB0aGlzLmZpbHRlci5fcGVyaW9kVmFsdWUgPSBwZXJpb2RWYWx1ZXNbMF07XG4gICAgICAgICAgICB0aGlzLmZpbHRlci5fcGVyaW9kID0gcGVyaW9kVmFsdWVzWzFdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgcGFyYW1ldGVyIHZhbHVlLCBtYWtlIHRlbXBvcmFyeSBtZW1iZXJzIGZvciBiaW5kaW5nXG4gICAgICAgIGlmICh0aGlzLmZpbHRlci5pbmNsdXNpb25Dcml0ZXJpYSAmJiB0aGlzLmZpbHRlci5pbmNsdXNpb25Dcml0ZXJpYSAhPT0gJ0Fsd2F5cycpIHtcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0RGF0YSA9IHRoaXMuZmlsdGVyLmluY2x1c2lvbkRhdGEuc3BsaXQoJz0nKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyLl9pbmNsdXNpb25QYXJhbSA9IHNwbGl0RGF0YVswXTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyLl9pbmNsdXNpb25QYXJhbVZhbHVlID0gc3BsaXREYXRhLmxlbmd0aCA+IDEgPyBzcGxpdERhdGFbMV0gOiAnJztcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcHVibGljIHZpZXdDb2x1bW5zKGNvbHVtbnMpIHtcbiAgICAgICAgdGhpcy5vcGVuU2lkZS5uZXh0KHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVDdXN0b20oY3VzdG9tKSB7XG4gICAgICAgIGlmICghY3VzdG9tKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5TaWRlLm5leHQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICB1cGRhdGVGaWx0ZXJUeXBlKGZpbHRlcjogYW55KSB7XG4gICAgICAgIGlmIChmaWx0ZXIuZmlsdGVyVHlwZSAhPT0gJ3NpbWlsYXJ0bycgJiYgZmlsdGVyLmZpbHRlclR5cGUgIT09ICdiZXR3ZWVuJ1xuICAgICAgICAgICAgJiYgZmlsdGVyLmZpbHRlclR5cGUgIT09ICdsaWtlJyAmJiBmaWx0ZXIuZmlsdGVyVHlwZSAhPT0gJ25vdGxpa2UnICYmIGZpbHRlci5maWx0ZXJUeXBlICE9PSAnaW4nICYmIGZpbHRlci5maWx0ZXJUeXBlICE9PSAnbm90aW4nKSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyLnJoc0V4cHJlc3Npb24gJiYgZmlsdGVyLnJoc0V4cHJlc3Npb24ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGZpbHRlci5yaHNFeHByZXNzaW9uID0gZmlsdGVyLnJoc0V4cHJlc3Npb24uc2xpY2UoMCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlci5maWx0ZXJUeXBlID09PSAnc2ltaWxhcnRvJykge1xuICAgICAgICAgICAgaWYgKCFmaWx0ZXIucmhzRXhwcmVzc2lvblsxXSkge1xuICAgICAgICAgICAgICAgIGZpbHRlci5yaHNFeHByZXNzaW9uWzFdID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyLmZpbHRlclR5cGUgPT09ICdsaWtlJyB8fCBmaWx0ZXIuZmlsdGVyVHlwZSA9PT0gJ25vdGxpa2UnKSB7XG4gICAgICAgICAgICBpZiAoIWZpbHRlci5yaHNFeHByZXNzaW9uWzFdKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyLnJoc0V4cHJlc3Npb25bMV0gPSAnbGlrZXdpbGRjYXJkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVFeHByZXNzaW9uVHlwZShmaWx0ZXIsIHR5cGUsIHZhbHVlPywgZmllbGRJbmRleCA9IDApIHtcbiAgICAgICAgZmlsdGVyW2ZpZWxkSW5kZXggPT09IDAgPyAnX2V4cFR5cGUnIDogJ19vdGhlckV4cFR5cGUnXSA9IHR5cGU7XG4gICAgICAgIGlmICh0eXBlID09PSAncGVyaW9kJykge1xuICAgICAgICAgICAgZmlsdGVyLnJoc0V4cHJlc3Npb25bZmllbGRJbmRleF0gPSBgJHtmaWx0ZXIuX3BlcmlvZFZhbHVlIHx8IDF9XyR7ZmlsdGVyLl9wZXJpb2QgfHwgJ0RBWVMnfV9BR09gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZpbHRlci5maWx0ZXJUeXBlID09ICdpbicgfHwgZmlsdGVyLmZpbHRlclR5cGUgPT0gJ25vdGluJyl7XG4gICAgICAgICAgICAgICAgZmlsdGVyLnJoc0V4cHJlc3Npb24ucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbHRlci5yaHNFeHByZXNzaW9uW2ZpZWxkSW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlUGVyaW9kVmFsdWUodmFsdWUsIHBlcmlvZCwgZmlsdGVyLCBmaWVsZEluZGV4ID0gMCkge1xuICAgICAgICBmaWx0ZXIucmhzRXhwcmVzc2lvbltmaWVsZEluZGV4XSA9IGAke3ZhbHVlfV8ke3BlcmlvZH1fQUdPYDtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEFkZCBhbiBpbiB2YWx1ZVxuICAgICAqXG4gICAgICogQHBhcmFtIGV2ZW50XG4gICAgICovXG4gICAgcHVibGljIGFkZEluVmFsdWUoZXZlbnQ6IE1hdENoaXBJbnB1dEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnZhbHVlIHx8ICcnKS50cmltKCk7XG5cbiAgICAgICAgLy8gQWRkIG91ciBmcnVpdFxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyLnJoc0V4cHJlc3Npb24ucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciB0aGUgaW5wdXQgdmFsdWVcbiAgICAgICAgZXZlbnQuY2hpcElucHV0IS5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbiBpbiB2YWx1ZVxuICAgICAqXG4gICAgICogQHBhcmFtIGluVmFsdWVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlSW5WYWx1ZShpblZhbHVlOiBzdHJpbmcpIHtcblxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZmlsdGVyLnJoc0V4cHJlc3Npb24uaW5kZXhPZihpblZhbHVlKTtcblxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXIucmhzRXhwcmVzc2lvbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRWRpdCBhbiBpbiB2YWx1ZVxuICAgICAqXG4gICAgICogQHBhcmFtIGluVmFsdWVcbiAgICAgKiBAcGFyYW0gZXZlbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZWRpdEluVmFsdWUoaW5WYWx1ZTogc3RyaW5nLCBldmVudDogTWF0Q2hpcEVkaXRlZEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudmFsdWUudHJpbSgpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBmcnVpdCBpZiBpdCBubyBsb25nZXIgaGFzIGEgbmFtZVxuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUluVmFsdWUoaW5WYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFZGl0IGV4aXN0aW5nIGZydWl0XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5maWx0ZXIucmhzRXhwcmVzc2lvbi5pbmRleE9mKGluVmFsdWUpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXIucmhzRXhwcmVzc2lvbltpbmRleF0ubmFtZSA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICB9XG5cblxuICAgIHB1YmxpYyByZW1vdmVGaWx0ZXIoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVySnVuY3Rpb24uZmlsdGVycy5zcGxpY2UodGhpcy5maWx0ZXJJbmRleCwgMSk7XG4gICAgICAgIGlmICghdGhpcy5maWx0ZXJKdW5jdGlvbi5maWx0ZXJzLmxlbmd0aCAmJlxuICAgICAgICAgICAgIXRoaXMuZmlsdGVySnVuY3Rpb24uZmlsdGVySnVuY3Rpb25zLmxlbmd0aCkge1xuXG4gICAgICAgICAgICB0aGlzLmZpbHRlcnNSZW1vdmVkLmVtaXQodGhpcy5maWx0ZXJKdW5jdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RmlsdGVyVHlwZXMoKSB7XG4gICAgICAgIHJldHVybiBEYXRhc2V0RmlsdGVyQ29tcG9uZW50LmZpbHRlclR5cGVzO1xuICAgIH1cblxuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IE9iamVjdCA9IE9iamVjdDtcbn1cbiIsIjxuZy10ZW1wbGF0ZSBbbmdJZl09XCIham9pbkZpbHRlckZpZWxkc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgbXItNFwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgKm5nSWY9XCIhY3VzdG9tTGhzXCIgWyh2YWx1ZSldPVwiZmlsdGVyLmxoc0V4cHJlc3Npb25cIiBjbGFzcz1cInAtMiBtci00XCIgbmFtZT1cImZpZWxkTmFtZVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiXCI+LS0gU2VsZWN0IENvbHVtbiBOYW1lIC0tPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmaWx0ZXJGaWVsZHNcIiBbdmFsdWVdPVwiJ1tbJytmaWVsZC5uYW1lKyddXSdcIj57eyBmaWVsZC50aXRsZSB9fVxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cblxuICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwiY3VzdG9tTGhzXCIgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImZpbHRlci5saHNFeHByZXNzaW9uXCJcbiAgICAgICAgICAgICAgICAgICBuYW1lPVwibGhzRXhwcmVzc2lvblwiIHBsYWNlaG9sZGVyPVwiQ3VzdG9tIGV4cHJlc3Npb25cIiBjbGFzcz1cInAtMiBtci00IGZ1bGwgZm9udC1tb25vXCI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMiBjdXN0b20tY2hlY2tib3ggZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggWyhuZ01vZGVsKV09XCJjdXN0b21MaHNcIiAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVDdXN0b20oJGV2ZW50KVwiPjwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIEN1c3RvbSBleHByZXNzaW9uXG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGEgKGNsaWNrKT1cInZpZXdDb2x1bW5zKGZpbHRlckZpZWxkcylcIiAqbmdJZj1cImN1c3RvbUxocyAmJiBvcGVuU2lkZVwiXG4gICAgICAgICAgICAgICBjbGFzcz1cInRleHQteHMgbWwtMiBob3Zlcjp1bmRlcmxpbmUgZmxleCBpdGVtcy1jZW50ZXIgcHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgIHZpZXcgZG9jcyZuYnNwO1xuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGNsYXNzPVwiaC00IHctNFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExIDNhMSAxIDAgMTAwIDJoMi41ODZsLTYuMjkzIDYuMjkzYTEgMSAwIDEwMS40MTQgMS40MTRMMTUgNi40MTRWOWExIDEgMCAxMDIgMFY0YTEgMSAwIDAwLTEtMWgtNXpcIi8+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSA1YTIgMiAwIDAwLTIgMnY4YTIgMiAwIDAwMiAyaDhhMiAyIDAgMDAyLTJ2LTNhMSAxIDAgMTAtMiAwdjNINVY3aDNhMSAxIDAgMDAwLTJINXpcIi8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJmaWx0ZXIuZmlsdGVyVHlwZVwiIGNsYXNzPVwicC0yIG1yLTRcIiBuYW1lPVwiZmlsdGVyVHlwZVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlRmlsdGVyVHlwZShmaWx0ZXIpXCI+XG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiXCI+LS0gU2VsZWN0IENvbmRpdGlvbiAtLTwvbWF0LW9wdGlvbj5cbiAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cImZpbHRlclR5cGUudmFsdWVcIiAqbmdGb3I9XCJsZXQgZmlsdGVyVHlwZSBvZiBnZXRGaWx0ZXJUeXBlcygpXCI+XG4gICAgICAgICAgICB7eyBmaWx0ZXJUeXBlLmxhYmVsIH19XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICA8L21hdC1zZWxlY3Q+XG5cbiAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGZsZXggaXRlbXMtc3RhcnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIHctZnVsbFwiPlxuXG5cbiAgICAgICAgICAgIDxtYXQtY2hpcC1ncmlkICpuZ0lmPVwiZmlsdGVyLmZpbHRlclR5cGUgPT09ICdpbicgfHwgZmlsdGVyLmZpbHRlclR5cGUgPT09ICdub3RpbidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJiZy13aGl0ZSBwbC0yIHB5LTAuNSByb3VuZGVkIGJvcmRlciBib3JkZXItZ3JheS0yMDBcIiAjY2hpcEdyaWQgYXJpYS1sYWJlbD1cIkVudGVyIHZhbHVlc1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtY2hpcC1yb3cgKm5nRm9yPVwibGV0IGluVmFsdWUgb2YgZmlsdGVyLnJoc0V4cHJlc3Npb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJiZy13aGl0ZSBteS0wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZW1vdmVkKT1cInJlbW92ZUluVmFsdWUoaW5WYWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VkaXRhYmxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVkaXRlZCk9XCJlZGl0SW5WYWx1ZShpblZhbHVlLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthcmlhLWRlc2NyaXB0aW9uXT1cIidwcmVzcyBlbnRlciB0byBlZGl0ICcgKyBpblZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7aW5WYWx1ZX19XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0Q2hpcFJlbW92ZSBbYXR0ci5hcmlhLWxhYmVsXT1cIidyZW1vdmUgJyArIGluVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jYW5jZWw8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L21hdC1jaGlwLXJvdz5cbiAgICAgICAgICAgICAgICA8aW5wdXQgcGxhY2Vob2xkZXI9XCJWYWx1ZVwiIGNsYXNzPVwibWwtMCBib3JkZXItMCBwbC0yIHB5LTEuNSBzZWxmLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRGb3JdPVwiY2hpcEdyaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICBbbWF0Q2hpcElucHV0U2VwYXJhdG9yS2V5Q29kZXNdPVwiW0VOVEVSLCBDT01NQV1cIlxuICAgICAgICAgICAgICAgICAgICAgICBbbWF0Q2hpcElucHV0QWRkT25CbHVyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAobWF0Q2hpcElucHV0VG9rZW5FbmQpPVwiYWRkSW5WYWx1ZSgkZXZlbnQpXCIvPlxuICAgICAgICAgICAgPC9tYXQtY2hpcC1ncmlkPlxuXG5cbiAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIiFmaWx0ZXIuX2V4cFR5cGUgJiYgZmlsdGVyLmZpbHRlclR5cGUgIT09ICdpbicgJiYgZmlsdGVyLmZpbHRlclR5cGUgIT09ICdub3RpbidcIiB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiZmlsdGVyLnJoc0V4cHJlc3Npb25bMF1cIiBuYW1lPVwiZmlsdGVyVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGwtMiBweS0yIHByLTggbXItNCBmdWxsXCI+XG4gICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJmaWx0ZXIuX2V4cFR5cGUgPT09ICdkYXRlLXBpY2tlcidcIiB0eXBlPVwiZGF0ZVwiIFsobmdNb2RlbCldPVwiZmlsdGVyLnJoc0V4cHJlc3Npb25bMF1cIlxuICAgICAgICAgICAgICAgICAgIG5hbWU9XCJmaWx0ZXJWYWx1ZVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGwtMiBweS0yIHByLTEwIG1yLTQgZnVsbFwiPlxuXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiZmlsdGVyLl9leHBUeXBlID09PSAncGVyaW9kJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgI3BlcmlvZFZhbHVlIHR5cGU9XCJudW1iZXJcIiBwbGFjZWhvbGRlcj1cIk5vLlwiIHJlcXVpcmVkIGF1dG9mb2N1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTMyIG1yLTIgcC0yXCIgbWluPVwiMFwiIFt2YWx1ZV09XCJmaWx0ZXIuX3BlcmlvZFZhbHVlIHx8IDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ1cGRhdGVQZXJpb2RWYWx1ZShwZXJpb2RWYWx1ZS52YWx1ZSwgcGVyaW9kLnZhbHVlLCBmaWx0ZXIpXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cInBhcmFtLXBlcmlvZC1waWNrZXIgdy0zMiBtci0yIHAtMlwiIFt2YWx1ZV09XCJmaWx0ZXIuX3BlcmlvZCB8fCAnREFZUydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICNwZXJpb2QgKGNoYW5nZSk9XCJ1cGRhdGVQZXJpb2RWYWx1ZShwZXJpb2RWYWx1ZS52YWx1ZSwgcGVyaW9kLnZhbHVlLCBmaWx0ZXIpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiREFZU1wiPkRheXM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJIT1VSU1wiPkhvdXJzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LW1lZGl1bVwiPkFnbzwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFic29sdXRlIHJpZ2h0LTAgLXRvcC0wLjVcIiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJmaWx0ZXIuZmlsdGVyVHlwZSAhPT0gJ2luJyAmJiBmaWx0ZXIuZmlsdGVyVHlwZSAhPT0gJ25vdGluJ1wiICBtYXQtbWVudS1pdGVtIChjbGljayk9XCJ1cGRhdGVFeHByZXNzaW9uVHlwZShmaWx0ZXIsIG51bGwsIFtdKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+dGl0bGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5UZXh0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJmaWx0ZXIuZmlsdGVyVHlwZSAhPT0gJ2luJyAmJiBmaWx0ZXIuZmlsdGVyVHlwZSAhPT0gJ25vdGluJ1wiICBtYXQtbWVudS1pdGVtIFttYXRNZW51VHJpZ2dlckZvcl09XCJjb2x1bW5NZW51XCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj50YWJsZV9jaGFydDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkNvbHVtbnM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInBhcmFtZXRlclZhbHVlcyAmJiBwYXJhbWV0ZXJWYWx1ZXMubGVuZ3RoXCIgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cInBhcmFtZXRlclZhbHVlc01lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnRleHRfZmllbGRzPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+UGFyYW1ldGVyczwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZmlsdGVyLmZpbHRlclR5cGUgIT09ICdpbicgJiYgZmlsdGVyLmZpbHRlclR5cGUgIT09ICdub3RpbidcIiAgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwidXBkYXRlRXhwcmVzc2lvblR5cGUoZmlsdGVyLCAnZGF0ZS1waWNrZXInLCBbXSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbGVuZGFyX21vbnRoPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+RGF0ZSBQaWNrZXI8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImZpbHRlci5maWx0ZXJUeXBlICE9PSAnaW4nICYmIGZpbHRlci5maWx0ZXJUeXBlICE9PSAnbm90aW4nXCIgIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInVwZGF0ZUV4cHJlc3Npb25UeXBlKGZpbHRlciwgJ3BlcmlvZCcpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5yZXN0b3JlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+VGltZSBQZXJpb2Q8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICAgICAgPG1hdC1tZW51ICNjb2x1bW5NZW51PVwibWF0TWVudVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGZpbHRlckZpZWxkc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlRXhwcmVzc2lvblR5cGUoZmlsdGVyLCBudWxsLCAnW1snICsgY29sdW1uLm5hbWUgKyAnXV0nKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2NvbHVtbi50aXRsZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICAgIDxtYXQtbWVudSAjcGFyYW1ldGVyVmFsdWVzTWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKm5nRm9yPVwibGV0IHBhcmFtIG9mIHBhcmFtZXRlclZhbHVlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlRXhwcmVzc2lvblR5cGUoZmlsdGVyLCBudWxsLCAne3snICsgcGFyYW0ubmFtZSArICd9fScpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7cGFyYW0udGl0bGV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cIihmaWx0ZXIuZmlsdGVyVHlwZSA9PT0gJ3NpbWlsYXJ0bycgfHwgZmlsdGVyLmZpbHRlclR5cGUgPT09ICdiZXR3ZWVuJyB8fCBmaWx0ZXIuZmlsdGVyVHlwZSA9PT0gJ2xpa2UnIHx8IGZpbHRlci5maWx0ZXJUeXBlID09PSAnbm90bGlrZScpXCJcbiAgICAgICAgICAgIGNsYXNzPVwibWwtMiByZWxhdGl2ZSB3LWZ1bGxcIj5cblxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImZpbHRlci5maWx0ZXJUeXBlID09PSAnc2ltaWxhcnRvJ1wiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJ3LWZ1bGxcIiBuYW1lPVwic2ltaWxhcml0eURpc3RhbmNlXCIgWyhuZ01vZGVsKV09XCJmaWx0ZXIucmhzRXhwcmVzc2lvblsxXVwiPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB2YWwgb2YgXy5yYW5nZSgxMClcIiBbdmFsdWVdPVwidmFsICsgMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdmFsICsgMSB9fVxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyB0ZXh0LWdyYXktNDAwXCI+U2VsZWN0IE1heGltdW0gTnVtYmVyIG9mIENoYW5nZXM8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJmaWx0ZXIuZmlsdGVyVHlwZSA9PT0gJ2xpa2UnIHx8IGZpbHRlci5maWx0ZXJUeXBlID09PSAnbm90bGlrZSdcIj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwidy1mdWxsXCIgbmFtZT1cInJlZ2V4cFwiIFsobmdNb2RlbCldPVwiZmlsdGVyLnJoc0V4cHJlc3Npb25bMV1cIj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiJ2xpa2V3aWxkY2FyZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFdpbGRjYXJkIHBhdHRlcm5cbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIidsaWtlcmVnZXhwJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgUmVndWxhciBFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgdGV4dC1ncmF5LTQwMFwiPlNlbGVjdCBNYXRjaCBUeXBlPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyLmZpbHRlclR5cGUgPT09ICdiZXR3ZWVuJ1wiIGNsYXNzPVwicmVsYXRpdmUgZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXItMiBmb250LW1lZGl1bVwiPmFuZDwvZGl2PlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiICpuZ0lmPVwiIWZpbHRlci5fb3RoZXJFeHBUeXBlXCIgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImZpbHRlci5yaHNFeHByZXNzaW9uWzFdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cIm90aGVyYmV0d2VlblwiIHBsYWNlaG9sZGVyPVwiVG8gdmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBsLTIgcHktMiBwci04IGZ1bGxcIj5cblxuICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cImZpbHRlci5fb3RoZXJFeHBUeXBlID09PSAnZGF0ZS1waWNrZXInXCIgdHlwZT1cImRhdGVcIiBbKG5nTW9kZWwpXT1cImZpbHRlci5yaHNFeHByZXNzaW9uWzFdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImZpbHRlclZhbHVlXCIgcGxhY2Vob2xkZXI9XCJWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGwtMiBweS0yIHByLTEwIG1yLTQgZnVsbFwiPlxuXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImZpbHRlci5fb3RoZXJFeHBUeXBlID09PSAncGVyaW9kJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAjcGVyaW9kVmFsdWUgdHlwZT1cIm51bWJlclwiIHBsYWNlaG9sZGVyPVwiTm8uXCIgcmVxdWlyZWQgYXV0b2ZvY3VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTMyIG1yLTIgcC0yXCIgbWluPVwiMFwiIFt2YWx1ZV09XCJmaWx0ZXIuX290aGVyUGVyaW9kVmFsdWUgfHwgMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ1cGRhdGVQZXJpb2RWYWx1ZShwZXJpb2RWYWx1ZS52YWx1ZSwgcGVyaW9kLnZhbHVlLCBmaWx0ZXIsMSlcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cInBhcmFtLXBlcmlvZC1waWNrZXIgdy0zMiBtci0yIHAtMlwiIFt2YWx1ZV09XCJmaWx0ZXIuX290aGVyUGVyaW9kIHx8ICdEQVlTJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNwZXJpb2QgKGNoYW5nZSk9XCJ1cGRhdGVQZXJpb2RWYWx1ZShwZXJpb2RWYWx1ZS52YWx1ZSwgcGVyaW9kLnZhbHVlLCBmaWx0ZXIsMSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiREFZU1wiPkRheXM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiSE9VUlNcIj5Ib3Vyczwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LW1lZGl1bVwiPkFnbzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFic29sdXRlIHJpZ2h0LTAgLXRvcC0wLjVcIiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm90aGVyTWVudVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI290aGVyTWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJ1cGRhdGVFeHByZXNzaW9uVHlwZShmaWx0ZXIsIG51bGwsIFtdLCAxKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnRpdGxlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlRleHQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInVwZGF0ZUV4cHJlc3Npb25UeXBlKGZpbHRlciwgJ2RhdGUtcGlja2VyJywgW10sIDEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2FsZW5kYXJfbW9udGg8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+RGF0ZSBQaWNrZXI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInVwZGF0ZUV4cHJlc3Npb25UeXBlKGZpbHRlciwgJ3BlcmlvZCcsIG51bGwsIDEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+cmVzdG9yZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5UaW1lIFBlcmlvZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cblxuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbjwvbmctdGVtcGxhdGU+XG5cblxuPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImpvaW5GaWx0ZXJGaWVsZHNcIj5cbiAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIG1yLTRcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0ICpuZ0lmPVwiIWN1c3RvbUxoc1wiIFsodmFsdWUpXT1cImZpbHRlci5saHNFeHByZXNzaW9uXCIgY2xhc3M9XCJtci00IHAtMlwiIG5hbWU9XCJmaWVsZE5hbWVcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlwiPi0tIFNlbGVjdCBDb2x1bW4gTmFtZSAtLTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZmlsdGVyRmllbGRzXCIgW3ZhbHVlXT1cIidbWycrZmllbGQubmFtZSsnXV0nXCI+e3sgZmllbGQudGl0bGUgfX1cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG5cbiAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cImN1c3RvbUxoc1wiIHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJmaWx0ZXIubGhzRXhwcmVzc2lvblwiXG4gICAgICAgICAgICAgICAgICAgbmFtZT1cImxoc0V4cHJlc3Npb25cIiBwbGFjZWhvbGRlcj1cIkN1c3RvbSBleHByZXNzaW9uXCIgY2xhc3M9XCJwLTIgbXItNCBmdWxsIGZvbnQtbW9ub1wiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgY3VzdG9tLWNoZWNrYm94IGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IFsobmdNb2RlbCldPVwiY3VzdG9tTGhzXCIgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlQ3VzdG9tKCRldmVudClcIj48L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICBDdXN0b20gZXhwcmVzc2lvblxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxhIChjbGljayk9XCJ2aWV3Q29sdW1ucyhmaWx0ZXJGaWVsZHMpXCIgKm5nSWY9XCJjdXN0b21MaHMgJiYgb3BlblNpZGVcIlxuICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXhzIG1sLTIgaG92ZXI6dW5kZXJsaW5lIGZsZXggaXRlbXMtY2VudGVyIHByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICB2aWV3IGRvY3MmbmJzcDtcbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBjbGFzcz1cImgtNCB3LTRcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMSAzYTEgMSAwIDEwMCAyaDIuNTg2bC02LjI5MyA2LjI5M2ExIDEgMCAxMDEuNDE0IDEuNDE0TDE1IDYuNDE0VjlhMSAxIDAgMTAyIDBWNGExIDEgMCAwMC0xLTFoLTV6XCIvPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUgNWEyIDIgMCAwMC0yIDJ2OGEyIDIgMCAwMDIgMmg4YTIgMiAwIDAwMi0ydi0zYTEgMSAwIDEwLTIgMHYzSDVWN2gzYTEgMSAwIDAwMC0ySDV6XCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwiZmlsdGVyLmZpbHRlclR5cGVcIiBjbGFzcz1cIm1yLTQgcC0yXCIgbmFtZT1cImZpbHRlclR5cGVcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUZpbHRlclR5cGUoZmlsdGVyKVwiPlxuICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlwiPi0tIFNlbGVjdCBDb25kaXRpb24gLS08L21hdC1vcHRpb24+XG4gICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJmaWx0ZXJUeXBlLnZhbHVlXCIgKm5nRm9yPVwibGV0IGZpbHRlclR5cGUgb2YgZ2V0RmlsdGVyVHlwZXMoKVwiPlxuICAgICAgICAgICAge3sgZmlsdGVyVHlwZS5sYWJlbCB9fVxuICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgPC9tYXQtc2VsZWN0PlxuXG4gICAgPGRpdiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgKm5nSWY9XCIhY3VzdG9tVmFsdWVcIiBbKHZhbHVlKV09XCJmaWx0ZXIucmhzRXhwcmVzc2lvblswXVwiIGNsYXNzPVwibXItNCBwLTJcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlwiPi0tIFNlbGVjdCBDb2x1bW4gTmFtZSAtLTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgZmllbGQgb2Ygam9pbkZpbHRlckZpZWxkc1wiIFt2YWx1ZV09XCInW1snK2ZpZWxkLm5hbWUrJ11dJ1wiPnt7IGZpZWxkLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuXG4gICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJjdXN0b21WYWx1ZVwiIHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJmaWx0ZXIucmhzRXhwcmVzc2lvblswXVwiXG4gICAgICAgICAgICAgICAgICAgbmFtZT1cImZpbHRlclZhbHVlXCIgcGxhY2Vob2xkZXI9XCJDdXN0b20gdmFsdWVcIiBjbGFzcz1cIm1yLTQgZnVsbCBwLTIgZm9udC1tb25vXCI+XG5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgY3VzdG9tLWNoZWNrYm94IGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IFsobmdNb2RlbCldPVwiY3VzdG9tVmFsdWVcIiAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVDdXN0b20oJGV2ZW50KVwiPjwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIEN1c3RvbSBleHByZXNzaW9uXG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGEgKGNsaWNrKT1cInZpZXdDb2x1bW5zKGZpbHRlckZpZWxkcylcIiAqbmdJZj1cImN1c3RvbVZhbHVlICYmIG9wZW5TaWRlXCJcbiAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC14cyBtbC0yIGhvdmVyOnVuZGVybGluZSBmbGV4IGl0ZW1zLWNlbnRlciBwcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgdmlldyBkb2NzJm5ic3A7XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgY2xhc3M9XCJoLTQgdy00XCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTEgM2ExIDEgMCAxMDAgMmgyLjU4NmwtNi4yOTMgNi4yOTNhMSAxIDAgMTAxLjQxNCAxLjQxNEwxNSA2LjQxNFY5YTEgMSAwIDEwMiAwVjRhMSAxIDAgMDAtMS0xaC01elwiLz5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk01IDVhMiAyIDAgMDAtMiAydjhhMiAyIDAgMDAyIDJoOGEyIDIgMCAwMDItMnYtM2ExIDEgMCAxMC0yIDB2M0g1VjdoM2ExIDEgMCAwMDAtMkg1elwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyLmZpbHRlclR5cGUgPT09ICdsaWtlJyB8fCBmaWx0ZXIuZmlsdGVyVHlwZSA9PT0gJ25vdGxpa2UnXCIgY2xhc3M9XCJwbC0yIHByLTggbXItNCBmdWxsXCI+XG4gICAgICAgIDxzZWxlY3QgbmFtZT1cInJlZ2V4cFwiIFsobmdNb2RlbCldPVwiZmlsdGVyLnJoc0V4cHJlc3Npb25bMV1cIj5cbiAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIidsaWtld2lsZGNhcmQnXCI+XG4gICAgICAgICAgICAgICAgV2lsZGNhcmQgcGF0dGVyblxuICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCInbGlrZXJlZ2V4cCdcIj5cbiAgICAgICAgICAgICAgICBSZWd1bGFyIEV4cHJlc3Npb25cbiAgICAgICAgICAgIDwvb3B0aW9uPlxuXG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyB0ZXh0LWdyYXktNDAwXCI+U2VsZWN0IE1hdGNoIFR5cGU8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxpbnB1dCAqbmdJZj1cImZpbHRlci5maWx0ZXJUeXBlID09PSAnc2ltaWxhcnRvJ1wiIHR5cGU9XCJudW1iZXJcIiBbKG5nTW9kZWwpXT1cImZpbHRlci5yaHNFeHByZXNzaW9uWzFdXCJcbiAgICAgICAgICAgbmFtZT1cInNpbWlsYXJpdHlEaXN0YW5jZVwiIHBsYWNlaG9sZGVyPVwiTWF4aW11bSBEaXN0YW5jZVwiXG4gICAgICAgICAgIGNsYXNzPVwicGwtMiBweS0yIHByLTggbXItNCBmdWxsXCI+XG5cbiAgICA8aW5wdXQgKm5nSWY9XCJmaWx0ZXIuZmlsdGVyVHlwZSA9PT0gJ2JldHdlZW4nXCIgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImZpbHRlci5yaHNFeHByZXNzaW9uWzFdXCIgbmFtZT1cIm90aGVyVmFsdWVcIlxuICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk90aGVyIHZhbHVlXCJcbiAgICAgICAgICAgY2xhc3M9XCJwbC0yIHB5LTIgcHItOCBtci00IGZ1bGxcIj5cblxuXG48L25nLXRlbXBsYXRlPlxuXG48ZGl2ICpuZ0lmPVwiIWpvaW5GaWx0ZXJGaWVsZHNcIiBjbGFzcz1cImZsZXggaXRlbXMtc3RhcnRcIj5cblxuICAgIDxraS1kYXRhc2V0LWZpbHRlci1pbmNsdXNpb24gW2ZpbHRlcl09XCJmaWx0ZXJcIiBbcGFyYW1ldGVyVmFsdWVzXT1cInBhcmFtZXRlclZhbHVlc1wiPjwva2ktZGF0YXNldC1maWx0ZXItaW5jbHVzaW9uPlxuXG48L2Rpdj5cblxuXG48ZGl2PlxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGNvbG9yPVwid2FyblwiIHRpdGxlPVwiUmVtb3ZlIGZpbHRlclwiIChjbGljayk9XCJyZW1vdmVGaWx0ZXIoKVwiPlxuICAgICAgICA8bWF0LWljb24+cmVtb3ZlX2NpcmNsZV9vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbjwvZGl2PlxuXG4iXX0=
@@ -1,25 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/common";
4
- import * as i2 from "@angular/forms";
5
- import * as i3 from "@angular/material/legacy-checkbox";
6
- export class DatasetFilterInclusionComponent {
7
- constructor() {
8
- this.dependsString = 'Depends';
9
- }
10
- ngOnInit() {
11
- }
12
- }
13
- DatasetFilterInclusionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DatasetFilterInclusionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
14
- DatasetFilterInclusionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DatasetFilterInclusionComponent, selector: "ki-dataset-filter-inclusion", inputs: { filter: "filter", parameterValues: "parameterValues", dependsString: "dependsString" }, ngImport: i0, template: "<ng-template [ngIf]=\"parameterValues && parameterValues.length\">\n <div class=\"m-2\">\n <mat-checkbox #depends [checked]=\"filter.inclusionCriteria && filter.inclusionCriteria !== 'Always'\"\n (change)=\"filter.inclusionCriteria = depends.checked ? 'ParameterPresent' : 'Always'\">\n <span class=\"font-normal\">{{ dependsString }}</span>\n </mat-checkbox>\n </div>\n\n <select *ngIf=\"filter.inclusionCriteria && filter.inclusionCriteria !== 'Always'\"\n class=\"mr-1 py-2\" [(ngModel)]=\"filter.inclusionCriteria\">\n <option value=\"ParameterPresent\">Parameter Is Set</option>\n <option value=\"ParameterNotPresent\">Parameter Is Not Set</option>\n <option value=\"ParameterValue\">Parameter Has Value</option>\n </select>\n\n <select *ngIf=\"filter.inclusionCriteria == 'ParameterPresent' || filter.inclusionCriteria == 'ParameterNotPresent'\" class=\"mr-1 py-2\"\n [(ngModel)]=\"filter._inclusionParam\" (change)=\"filter.inclusionData = filter._inclusionParam\">\n <option *ngFor=\"let param of parameterValues\" [ngValue]=\"param.name\">\n {{ param.title }}\n </option>\n </select>\n\n\n <select *ngIf=\"filter.inclusionCriteria == 'ParameterValue'\" class=\"mr-1 py-2\"\n [(ngModel)]=\"filter._inclusionParam\">\n <option *ngFor=\"let param of parameterValues\" [ngValue]=\"param.name\">\n {{ param.title }}\n </option>\n </select>\n\n <input *ngIf=\"filter.inclusionCriteria == 'ParameterValue'\"\n placeholder=\"Enter value\"\n class=\"py-2\" [(ngModel)]=\"filter._inclusionParamValue\"\n (change)=\"filter.inclusionData = filter._inclusionParam + '=' + filter._inclusionParamValue\"/>\n</ng-template>\n", styles: [":host{display:flex;align-items:flex-start}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.MatLegacyCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }] });
15
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DatasetFilterInclusionComponent, decorators: [{
16
- type: Component,
17
- args: [{ selector: 'ki-dataset-filter-inclusion', template: "<ng-template [ngIf]=\"parameterValues && parameterValues.length\">\n <div class=\"m-2\">\n <mat-checkbox #depends [checked]=\"filter.inclusionCriteria && filter.inclusionCriteria !== 'Always'\"\n (change)=\"filter.inclusionCriteria = depends.checked ? 'ParameterPresent' : 'Always'\">\n <span class=\"font-normal\">{{ dependsString }}</span>\n </mat-checkbox>\n </div>\n\n <select *ngIf=\"filter.inclusionCriteria && filter.inclusionCriteria !== 'Always'\"\n class=\"mr-1 py-2\" [(ngModel)]=\"filter.inclusionCriteria\">\n <option value=\"ParameterPresent\">Parameter Is Set</option>\n <option value=\"ParameterNotPresent\">Parameter Is Not Set</option>\n <option value=\"ParameterValue\">Parameter Has Value</option>\n </select>\n\n <select *ngIf=\"filter.inclusionCriteria == 'ParameterPresent' || filter.inclusionCriteria == 'ParameterNotPresent'\" class=\"mr-1 py-2\"\n [(ngModel)]=\"filter._inclusionParam\" (change)=\"filter.inclusionData = filter._inclusionParam\">\n <option *ngFor=\"let param of parameterValues\" [ngValue]=\"param.name\">\n {{ param.title }}\n </option>\n </select>\n\n\n <select *ngIf=\"filter.inclusionCriteria == 'ParameterValue'\" class=\"mr-1 py-2\"\n [(ngModel)]=\"filter._inclusionParam\">\n <option *ngFor=\"let param of parameterValues\" [ngValue]=\"param.name\">\n {{ param.title }}\n </option>\n </select>\n\n <input *ngIf=\"filter.inclusionCriteria == 'ParameterValue'\"\n placeholder=\"Enter value\"\n class=\"py-2\" [(ngModel)]=\"filter._inclusionParamValue\"\n (change)=\"filter.inclusionData = filter._inclusionParam + '=' + filter._inclusionParamValue\"/>\n</ng-template>\n", styles: [":host{display:flex;align-items:flex-start}\n"] }]
18
- }], ctorParameters: function () { return []; }, propDecorators: { filter: [{
19
- type: Input
20
- }], parameterValues: [{
21
- type: Input
22
- }], dependsString: [{
23
- type: Input
24
- }] } });
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXNldC1maWx0ZXItaW5jbHVzaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWtpbmludGVsL3NyYy9saWIvY29tcG9uZW50cy9kYXRhc2V0L2RhdGFzZXQtZWRpdG9yL2RhdGFzZXQtZmlsdGVycy9kYXRhc2V0LWZpbHRlci1pbmNsdXNpb24vZGF0YXNldC1maWx0ZXItaW5jbHVzaW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWtpbmludGVsL3NyYy9saWIvY29tcG9uZW50cy9kYXRhc2V0L2RhdGFzZXQtZWRpdG9yL2RhdGFzZXQtZmlsdGVycy9kYXRhc2V0LWZpbHRlci1pbmNsdXNpb24vZGF0YXNldC1maWx0ZXItaW5jbHVzaW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFTLE1BQU0sZUFBZSxDQUFDOzs7OztBQU92RCxNQUFNLE9BQU8sK0JBQStCO0lBTXhDO1FBRlMsa0JBQWEsR0FBRyxTQUFTLENBQUM7SUFHbkMsQ0FBQztJQUVELFFBQVE7SUFDUixDQUFDOzs2SEFWUSwrQkFBK0I7aUhBQS9CLCtCQUErQixxS0NQNUMsa3lEQW1DQTs0RkQ1QmEsK0JBQStCO2tCQUwzQyxTQUFTOytCQUNJLDZCQUE2QjswRUFNOUIsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbnB1dCwgT25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdraS1kYXRhc2V0LWZpbHRlci1pbmNsdXNpb24nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRhc2V0LWZpbHRlci1pbmNsdXNpb24uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2RhdGFzZXQtZmlsdGVyLWluY2x1c2lvbi5jb21wb25lbnQuc2FzcyddXG59KVxuZXhwb3J0IGNsYXNzIERhdGFzZXRGaWx0ZXJJbmNsdXNpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgQElucHV0KCkgZmlsdGVyOiBhbnk7XG4gICAgQElucHV0KCkgcGFyYW1ldGVyVmFsdWVzOiBhbnk7XG4gICAgQElucHV0KCkgZGVwZW5kc1N0cmluZyA9ICdEZXBlbmRzJztcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgIH1cblxufVxuIiwiPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInBhcmFtZXRlclZhbHVlcyAmJiBwYXJhbWV0ZXJWYWx1ZXMubGVuZ3RoXCI+XG4gICAgPGRpdiBjbGFzcz1cIm0tMlwiPlxuICAgICAgICA8bWF0LWNoZWNrYm94ICNkZXBlbmRzIFtjaGVja2VkXT1cImZpbHRlci5pbmNsdXNpb25Dcml0ZXJpYSAmJiBmaWx0ZXIuaW5jbHVzaW9uQ3JpdGVyaWEgIT09ICdBbHdheXMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImZpbHRlci5pbmNsdXNpb25Dcml0ZXJpYSA9IGRlcGVuZHMuY2hlY2tlZCA/ICdQYXJhbWV0ZXJQcmVzZW50JyA6ICdBbHdheXMnXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtbm9ybWFsXCI+e3sgZGVwZW5kc1N0cmluZyB9fTwvc3Bhbj5cbiAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgPC9kaXY+XG5cbiAgICA8c2VsZWN0ICpuZ0lmPVwiZmlsdGVyLmluY2x1c2lvbkNyaXRlcmlhICYmIGZpbHRlci5pbmNsdXNpb25Dcml0ZXJpYSAhPT0gJ0Fsd2F5cydcIlxuICAgICAgICAgICAgY2xhc3M9XCJtci0xIHB5LTJcIiBbKG5nTW9kZWwpXT1cImZpbHRlci5pbmNsdXNpb25Dcml0ZXJpYVwiPlxuICAgICAgICA8b3B0aW9uIHZhbHVlPVwiUGFyYW1ldGVyUHJlc2VudFwiPlBhcmFtZXRlciBJcyBTZXQ8L29wdGlvbj5cbiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlBhcmFtZXRlck5vdFByZXNlbnRcIj5QYXJhbWV0ZXIgSXMgTm90IFNldDwvb3B0aW9uPlxuICAgICAgICA8b3B0aW9uIHZhbHVlPVwiUGFyYW1ldGVyVmFsdWVcIj5QYXJhbWV0ZXIgSGFzIFZhbHVlPC9vcHRpb24+XG4gICAgPC9zZWxlY3Q+XG5cbiAgICA8c2VsZWN0ICpuZ0lmPVwiZmlsdGVyLmluY2x1c2lvbkNyaXRlcmlhID09ICdQYXJhbWV0ZXJQcmVzZW50JyB8fCBmaWx0ZXIuaW5jbHVzaW9uQ3JpdGVyaWEgPT0gJ1BhcmFtZXRlck5vdFByZXNlbnQnXCIgY2xhc3M9XCJtci0xIHB5LTJcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaWx0ZXIuX2luY2x1c2lvblBhcmFtXCIgKGNoYW5nZSk9XCJmaWx0ZXIuaW5jbHVzaW9uRGF0YSA9IGZpbHRlci5faW5jbHVzaW9uUGFyYW1cIj5cbiAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgcGFyYW0gb2YgcGFyYW1ldGVyVmFsdWVzXCIgW25nVmFsdWVdPVwicGFyYW0ubmFtZVwiPlxuICAgICAgICAgICAge3sgcGFyYW0udGl0bGUgfX1cbiAgICAgICAgPC9vcHRpb24+XG4gICAgPC9zZWxlY3Q+XG5cblxuICAgIDxzZWxlY3QgKm5nSWY9XCJmaWx0ZXIuaW5jbHVzaW9uQ3JpdGVyaWEgPT0gJ1BhcmFtZXRlclZhbHVlJ1wiIGNsYXNzPVwibXItMSBweS0yXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyLl9pbmNsdXNpb25QYXJhbVwiPlxuICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBwYXJhbSBvZiBwYXJhbWV0ZXJWYWx1ZXNcIiBbbmdWYWx1ZV09XCJwYXJhbS5uYW1lXCI+XG4gICAgICAgICAgICB7eyBwYXJhbS50aXRsZSB9fVxuICAgICAgICA8L29wdGlvbj5cbiAgICA8L3NlbGVjdD5cblxuICAgIDxpbnB1dCAqbmdJZj1cImZpbHRlci5pbmNsdXNpb25Dcml0ZXJpYSA9PSAnUGFyYW1ldGVyVmFsdWUnXCJcbiAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciB2YWx1ZVwiXG4gICAgICAgICAgIGNsYXNzPVwicHktMlwiIFsobmdNb2RlbCldPVwiZmlsdGVyLl9pbmNsdXNpb25QYXJhbVZhbHVlXCJcbiAgICAgICAgICAgKGNoYW5nZSk9XCJmaWx0ZXIuaW5jbHVzaW9uRGF0YSA9IGZpbHRlci5faW5jbHVzaW9uUGFyYW0gKyAnPScgKyBmaWx0ZXIuX2luY2x1c2lvblBhcmFtVmFsdWVcIi8+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -1,72 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/common";
4
- import * as i2 from "@angular/material/legacy-button";
5
- import * as i3 from "@angular/material/icon";
6
- import * as i4 from "@angular/forms";
7
- import * as i5 from "@angular/material/button-toggle";
8
- import * as i6 from "../dataset-filter/dataset-filter.component";
9
- import * as i7 from "../dataset-filter-inclusion/dataset-filter-inclusion.component";
10
- export class DatasetFilterJunctionComponent {
11
- constructor() {
12
- this.filterFields = [];
13
- this.filterJunctionChange = new EventEmitter();
14
- }
15
- ngOnInit() {
16
- // If parameter value, make temporary members for binding
17
- if (this.filterJunction.inclusionCriteria && this.filterJunction.inclusionCriteria !== "Always") {
18
- let splitData = this.filterJunction.inclusionData.split("=");
19
- this.filterJunction._inclusionParam = splitData[0];
20
- this.filterJunction._inclusionParamValue = splitData.length > 1 ? splitData[1] : "";
21
- }
22
- }
23
- addFilter(type) {
24
- if (type === 'single') {
25
- this.filterJunction.filters.push({
26
- lhsExpression: '',
27
- rhsExpression: [],
28
- filterType: ''
29
- });
30
- }
31
- else if (type === 'group') {
32
- this.filterJunction.filterJunctions.push({
33
- logic: 'AND',
34
- filters: [{
35
- lhsExpression: '',
36
- rhsExpression: [],
37
- filterType: ''
38
- }],
39
- filterJunctions: []
40
- });
41
- }
42
- this.filterJunctionChange.emit(this.filterJunction);
43
- }
44
- filtersRemoved() {
45
- this.parentJunction.filterJunctions.splice(this.junctionIndex, 1);
46
- }
47
- }
48
- DatasetFilterJunctionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DatasetFilterJunctionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
49
- DatasetFilterJunctionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DatasetFilterJunctionComponent, selector: "ki-dataset-filter-junction", inputs: { filterJunction: "filterJunction", filterFields: "filterFields", parentJunction: "parentJunction", junctionIndex: "junctionIndex", joinFilterFields: "joinFilterFields", joinFieldsName: "joinFieldsName", openSide: "openSide", parameterValues: "parameterValues" }, outputs: { filterJunctionChange: "filterJunctionChange" }, ngImport: i0, template: "<ng-template [ngIf]=\"filterJunction\">\n\n\n <div class=\"filter\">\n <div class=\"flex align-center justify-between\">\n <mat-button-toggle-group [(ngModel)]=\"filterJunction.logic\"\n [ngStyle]=\"{visibility: (filterJunction.filters.length <= 1 && filterJunction.filterJunctions.length === 0) ? 'hidden': 'visible'}\">\n <mat-button-toggle value=\"AND\">All of the following apply</mat-button-toggle>\n <mat-button-toggle value=\"OR\">Any of the following apply</mat-button-toggle>\n </mat-button-toggle-group>\n\n </div>\n\n <div *ngIf=\"!joinFilterFields\" class=\"flex {{(filterJunction.filters.length <= 1 && filterJunction.filterJunctions.length === 0) ? 'mt-0': 'mt-2'}}\">\n <ki-dataset-filter-inclusion class=\"-ml-2\" [filter]=\"filterJunction\" [parameterValues]=\"parameterValues\"\n dependsString=\"Filter group depends\"></ki-dataset-filter-inclusion>\n\n </div>\n\n <ng-template ngFor let-filter [ngForOf]=\"filterJunction.filters\" let-i=index>\n\n <ki-dataset-filter [filter]=\"filter\" [filterJunction]=\"filterJunction\" [filterIndex]=\"i\"\n [parameterValues]=\"parameterValues\"\n [filterFields]=\"filterFields\" [joinFilterFields]=\"joinFilterFields\" [openSide]=\"openSide\"\n (filtersRemoved)=\"filtersRemoved()\" [joinFieldsName]=\"joinFieldsName\"></ki-dataset-filter>\n\n </ng-template>\n <div>\n <button mat-button color=\"primary\" title=\"Add single filter\" (click)=\"addFilter('single')\">\n <mat-icon>add_circle</mat-icon>\n filter\n </button>\n <button mat-button color=\"primary\" title=\"Add group filters\" (click)=\"addFilter('group')\">\n <mat-icon>playlist_add</mat-icon>\n filter group\n </button>\n <button mat-button color=\"warn\" title=\"Remove group filter\" (click)=\"filtersRemoved()\">\n <mat-icon>delete_sweep</mat-icon>\n remove group\n </button>\n </div>\n </div>\n\n\n <div class=\"group-filters mb-4\" *ngFor=\"let junction of filterJunction.filterJunctions; let j = index\">\n <ki-dataset-filter-junction [(filterJunction)]=\"filterJunction.filterJunctions[j]\" [openSide]=\"openSide\"\n [joinFilterFields]=\"joinFilterFields\" [joinFieldsName]=\"joinFieldsName\"\n [filterFields]=\"filterFields\" [parentJunction]=\"filterJunction\"\n [parameterValues]=\"parameterValues\"\n [junctionIndex]=\"j\"></ki-dataset-filter-junction>\n </div>\n</ng-template>\n", styles: [".filter{display:flex;flex-direction:column;margin:0;position:relative;background-color:transparent;padding:.5rem}.group-filters{margin-left:2rem;padding:.5rem;position:relative;background-color:#0000000d}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i5.MatButtonToggle, selector: "mat-button-toggle", inputs: ["disableRipple", "aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "appearance", "checked", "disabled"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "component", type: i6.DatasetFilterComponent, selector: "ki-dataset-filter", inputs: ["filter", "filterIndex", "filterJunction", "filterFields", "joinFilterFields", "joinFieldsName", "openSide", "parameterValues"], outputs: ["filtersRemoved"] }, { kind: "component", type: DatasetFilterJunctionComponent, selector: "ki-dataset-filter-junction", inputs: ["filterJunction", "filterFields", "parentJunction", "junctionIndex", "joinFilterFields", "joinFieldsName", "openSide", "parameterValues"], outputs: ["filterJunctionChange"] }, { kind: "component", type: i7.DatasetFilterInclusionComponent, selector: "ki-dataset-filter-inclusion", inputs: ["filter", "parameterValues", "dependsString"] }] });
50
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DatasetFilterJunctionComponent, decorators: [{
51
- type: Component,
52
- args: [{ selector: 'ki-dataset-filter-junction', template: "<ng-template [ngIf]=\"filterJunction\">\n\n\n <div class=\"filter\">\n <div class=\"flex align-center justify-between\">\n <mat-button-toggle-group [(ngModel)]=\"filterJunction.logic\"\n [ngStyle]=\"{visibility: (filterJunction.filters.length <= 1 && filterJunction.filterJunctions.length === 0) ? 'hidden': 'visible'}\">\n <mat-button-toggle value=\"AND\">All of the following apply</mat-button-toggle>\n <mat-button-toggle value=\"OR\">Any of the following apply</mat-button-toggle>\n </mat-button-toggle-group>\n\n </div>\n\n <div *ngIf=\"!joinFilterFields\" class=\"flex {{(filterJunction.filters.length <= 1 && filterJunction.filterJunctions.length === 0) ? 'mt-0': 'mt-2'}}\">\n <ki-dataset-filter-inclusion class=\"-ml-2\" [filter]=\"filterJunction\" [parameterValues]=\"parameterValues\"\n dependsString=\"Filter group depends\"></ki-dataset-filter-inclusion>\n\n </div>\n\n <ng-template ngFor let-filter [ngForOf]=\"filterJunction.filters\" let-i=index>\n\n <ki-dataset-filter [filter]=\"filter\" [filterJunction]=\"filterJunction\" [filterIndex]=\"i\"\n [parameterValues]=\"parameterValues\"\n [filterFields]=\"filterFields\" [joinFilterFields]=\"joinFilterFields\" [openSide]=\"openSide\"\n (filtersRemoved)=\"filtersRemoved()\" [joinFieldsName]=\"joinFieldsName\"></ki-dataset-filter>\n\n </ng-template>\n <div>\n <button mat-button color=\"primary\" title=\"Add single filter\" (click)=\"addFilter('single')\">\n <mat-icon>add_circle</mat-icon>\n filter\n </button>\n <button mat-button color=\"primary\" title=\"Add group filters\" (click)=\"addFilter('group')\">\n <mat-icon>playlist_add</mat-icon>\n filter group\n </button>\n <button mat-button color=\"warn\" title=\"Remove group filter\" (click)=\"filtersRemoved()\">\n <mat-icon>delete_sweep</mat-icon>\n remove group\n </button>\n </div>\n </div>\n\n\n <div class=\"group-filters mb-4\" *ngFor=\"let junction of filterJunction.filterJunctions; let j = index\">\n <ki-dataset-filter-junction [(filterJunction)]=\"filterJunction.filterJunctions[j]\" [openSide]=\"openSide\"\n [joinFilterFields]=\"joinFilterFields\" [joinFieldsName]=\"joinFieldsName\"\n [filterFields]=\"filterFields\" [parentJunction]=\"filterJunction\"\n [parameterValues]=\"parameterValues\"\n [junctionIndex]=\"j\"></ki-dataset-filter-junction>\n </div>\n</ng-template>\n", styles: [".filter{display:flex;flex-direction:column;margin:0;position:relative;background-color:transparent;padding:.5rem}.group-filters{margin-left:2rem;padding:.5rem;position:relative;background-color:#0000000d}\n"] }]
53
- }], ctorParameters: function () { return []; }, propDecorators: { filterJunction: [{
54
- type: Input
55
- }], filterFields: [{
56
- type: Input
57
- }], parentJunction: [{
58
- type: Input
59
- }], junctionIndex: [{
60
- type: Input
61
- }], joinFilterFields: [{
62
- type: Input
63
- }], joinFieldsName: [{
64
- type: Input
65
- }], openSide: [{
66
- type: Input
67
- }], parameterValues: [{
68
- type: Input
69
- }], filterJunctionChange: [{
70
- type: Output
71
- }] } });
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXNldC1maWx0ZXItanVuY3Rpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmcta2luaW50ZWwvc3JjL2xpYi9jb21wb25lbnRzL2RhdGFzZXQvZGF0YXNldC1lZGl0b3IvZGF0YXNldC1maWx0ZXJzL2RhdGFzZXQtZmlsdGVyLWp1bmN0aW9uL2RhdGFzZXQtZmlsdGVyLWp1bmN0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWtpbmludGVsL3NyYy9saWIvY29tcG9uZW50cy9kYXRhc2V0L2RhdGFzZXQtZWRpdG9yL2RhdGFzZXQtZmlsdGVycy9kYXRhc2V0LWZpbHRlci1qdW5jdGlvbi9kYXRhc2V0LWZpbHRlci1qdW5jdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7QUFRN0UsTUFBTSxPQUFPLDhCQUE4QjtJQWF2QztRQVZTLGlCQUFZLEdBQVEsRUFBRSxDQUFDO1FBUXRCLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFHekQsQ0FBQztJQUVELFFBQVE7UUFDSix5REFBeUQ7UUFDekQsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLEtBQUssUUFBUSxFQUFFO1lBQzdGLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDdkY7SUFDTCxDQUFDO0lBRU0sU0FBUyxDQUFDLElBQUk7UUFDakIsSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQ25CLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDN0IsYUFBYSxFQUFFLEVBQUU7Z0JBQ2pCLGFBQWEsRUFBRSxFQUFFO2dCQUNqQixVQUFVLEVBQUUsRUFBRTthQUNqQixDQUFDLENBQUM7U0FDTjthQUFNLElBQUksSUFBSSxLQUFLLE9BQU8sRUFBRTtZQUN6QixJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7Z0JBQ3JDLEtBQUssRUFBRSxLQUFLO2dCQUNaLE9BQU8sRUFBRSxDQUFDO3dCQUNOLGFBQWEsRUFBRSxFQUFFO3dCQUNqQixhQUFhLEVBQUUsRUFBRTt3QkFDakIsVUFBVSxFQUFFLEVBQUU7cUJBQ2pCLENBQUM7Z0JBQ0YsZUFBZSxFQUFFLEVBQUU7YUFDdEIsQ0FBQyxDQUFDO1NBQ047UUFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU0sY0FBYztRQUNqQixJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDOzs0SEFoRFEsOEJBQThCO2dIQUE5Qiw4QkFBOEIsNllDUjNDLDQyRkFvREEsMmtFRDVDYSw4QkFBOEI7NEZBQTlCLDhCQUE4QjtrQkFMMUMsU0FBUzsrQkFDSSw0QkFBNEI7MEVBTTdCLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVJLG9CQUFvQjtzQkFBN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1N1YmplY3R9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2tpLWRhdGFzZXQtZmlsdGVyLWp1bmN0aW9uJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0YXNldC1maWx0ZXItanVuY3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2RhdGFzZXQtZmlsdGVyLWp1bmN0aW9uLmNvbXBvbmVudC5zYXNzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGF0YXNldEZpbHRlckp1bmN0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIEBJbnB1dCgpIGZpbHRlckp1bmN0aW9uOiBhbnk7XG4gICAgQElucHV0KCkgZmlsdGVyRmllbGRzOiBhbnkgPSBbXTtcbiAgICBASW5wdXQoKSBwYXJlbnRKdW5jdGlvbjogYW55O1xuICAgIEBJbnB1dCgpIGp1bmN0aW9uSW5kZXg6IG51bWJlcjtcbiAgICBASW5wdXQoKSBqb2luRmlsdGVyRmllbGRzOiBhbnk7XG4gICAgQElucHV0KCkgam9pbkZpZWxkc05hbWU6IHN0cmluZztcbiAgICBASW5wdXQoKSBvcGVuU2lkZTogU3ViamVjdDxib29sZWFuPjtcbiAgICBASW5wdXQoKSBwYXJhbWV0ZXJWYWx1ZXM6IGFueTtcblxuICAgIEBPdXRwdXQoKSBmaWx0ZXJKdW5jdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIC8vIElmIHBhcmFtZXRlciB2YWx1ZSwgbWFrZSB0ZW1wb3JhcnkgbWVtYmVycyBmb3IgYmluZGluZ1xuICAgICAgICBpZiAodGhpcy5maWx0ZXJKdW5jdGlvbi5pbmNsdXNpb25Dcml0ZXJpYSAmJiB0aGlzLmZpbHRlckp1bmN0aW9uLmluY2x1c2lvbkNyaXRlcmlhICE9PSBcIkFsd2F5c1wiKSB7XG4gICAgICAgICAgICBsZXQgc3BsaXREYXRhID0gdGhpcy5maWx0ZXJKdW5jdGlvbi5pbmNsdXNpb25EYXRhLnNwbGl0KFwiPVwiKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVySnVuY3Rpb24uX2luY2x1c2lvblBhcmFtID0gc3BsaXREYXRhWzBdO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJKdW5jdGlvbi5faW5jbHVzaW9uUGFyYW1WYWx1ZSA9IHNwbGl0RGF0YS5sZW5ndGggPiAxID8gc3BsaXREYXRhWzFdIDogXCJcIjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWx0ZXIodHlwZSkge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVySnVuY3Rpb24uZmlsdGVycy5wdXNoKHtcbiAgICAgICAgICAgICAgICBsaHNFeHByZXNzaW9uOiAnJyxcbiAgICAgICAgICAgICAgICByaHNFeHByZXNzaW9uOiBbXSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJUeXBlOiAnJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2dyb3VwJykge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJKdW5jdGlvbi5maWx0ZXJKdW5jdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbG9naWM6ICdBTkQnLFxuICAgICAgICAgICAgICAgIGZpbHRlcnM6IFt7XG4gICAgICAgICAgICAgICAgICAgIGxoc0V4cHJlc3Npb246ICcnLFxuICAgICAgICAgICAgICAgICAgICByaHNFeHByZXNzaW9uOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyVHlwZTogJydcbiAgICAgICAgICAgICAgICB9XSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJKdW5jdGlvbnM6IFtdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbHRlckp1bmN0aW9uQ2hhbmdlLmVtaXQodGhpcy5maWx0ZXJKdW5jdGlvbik7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbHRlcnNSZW1vdmVkKCkge1xuICAgICAgICB0aGlzLnBhcmVudEp1bmN0aW9uLmZpbHRlckp1bmN0aW9ucy5zcGxpY2UodGhpcy5qdW5jdGlvbkluZGV4LCAxKTtcbiAgICB9XG59XG4iLCI8bmctdGVtcGxhdGUgW25nSWZdPVwiZmlsdGVySnVuY3Rpb25cIj5cblxuXG4gICAgPGRpdiBjbGFzcz1cImZpbHRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAgWyhuZ01vZGVsKV09XCJmaWx0ZXJKdW5jdGlvbi5sb2dpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie3Zpc2liaWxpdHk6IChmaWx0ZXJKdW5jdGlvbi5maWx0ZXJzLmxlbmd0aCA8PSAxICYmIGZpbHRlckp1bmN0aW9uLmZpbHRlckp1bmN0aW9ucy5sZW5ndGggPT09IDApID8gJ2hpZGRlbic6ICd2aXNpYmxlJ31cIj5cbiAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgdmFsdWU9XCJBTkRcIj5BbGwgb2YgdGhlIGZvbGxvd2luZyBhcHBseTwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVwiT1JcIj5Bbnkgb2YgdGhlIGZvbGxvd2luZyBhcHBseTwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlLWdyb3VwPlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCIham9pbkZpbHRlckZpZWxkc1wiIGNsYXNzPVwiZmxleCB7eyhmaWx0ZXJKdW5jdGlvbi5maWx0ZXJzLmxlbmd0aCA8PSAxICYmIGZpbHRlckp1bmN0aW9uLmZpbHRlckp1bmN0aW9ucy5sZW5ndGggPT09IDApID8gJ210LTAnOiAnbXQtMid9fVwiPlxuICAgICAgICAgICAgPGtpLWRhdGFzZXQtZmlsdGVyLWluY2x1c2lvbiBjbGFzcz1cIi1tbC0yXCIgW2ZpbHRlcl09XCJmaWx0ZXJKdW5jdGlvblwiIFtwYXJhbWV0ZXJWYWx1ZXNdPVwicGFyYW1ldGVyVmFsdWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kc1N0cmluZz1cIkZpbHRlciBncm91cCBkZXBlbmRzXCI+PC9raS1kYXRhc2V0LWZpbHRlci1pbmNsdXNpb24+XG5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlIG5nRm9yIGxldC1maWx0ZXIgW25nRm9yT2ZdPVwiZmlsdGVySnVuY3Rpb24uZmlsdGVyc1wiIGxldC1pPWluZGV4PlxuXG4gICAgICAgICAgICA8a2ktZGF0YXNldC1maWx0ZXIgW2ZpbHRlcl09XCJmaWx0ZXJcIiBbZmlsdGVySnVuY3Rpb25dPVwiZmlsdGVySnVuY3Rpb25cIiBbZmlsdGVySW5kZXhdPVwiaVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmFtZXRlclZhbHVlc109XCJwYXJhbWV0ZXJWYWx1ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJGaWVsZHNdPVwiZmlsdGVyRmllbGRzXCIgW2pvaW5GaWx0ZXJGaWVsZHNdPVwiam9pbkZpbHRlckZpZWxkc1wiIFtvcGVuU2lkZV09XCJvcGVuU2lkZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbHRlcnNSZW1vdmVkKT1cImZpbHRlcnNSZW1vdmVkKClcIiBbam9pbkZpZWxkc05hbWVdPVwiam9pbkZpZWxkc05hbWVcIj48L2tpLWRhdGFzZXQtZmlsdGVyPlxuXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdGl0bGU9XCJBZGQgc2luZ2xlIGZpbHRlclwiIChjbGljayk9XCJhZGRGaWx0ZXIoJ3NpbmdsZScpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmFkZF9jaXJjbGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIGZpbHRlclxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdGl0bGU9XCJBZGQgZ3JvdXAgZmlsdGVyc1wiIChjbGljayk9XCJhZGRGaWx0ZXIoJ2dyb3VwJylcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+cGxheWxpc3RfYWRkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICBmaWx0ZXIgZ3JvdXBcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVwid2FyblwiIHRpdGxlPVwiUmVtb3ZlIGdyb3VwIGZpbHRlclwiIChjbGljayk9XCJmaWx0ZXJzUmVtb3ZlZCgpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmRlbGV0ZV9zd2VlcDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgcmVtb3ZlIGdyb3VwXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cblxuICAgIDxkaXYgY2xhc3M9XCJncm91cC1maWx0ZXJzIG1iLTRcIiAqbmdGb3I9XCJsZXQganVuY3Rpb24gb2YgZmlsdGVySnVuY3Rpb24uZmlsdGVySnVuY3Rpb25zOyBsZXQgaiA9IGluZGV4XCI+XG4gICAgICAgIDxraS1kYXRhc2V0LWZpbHRlci1qdW5jdGlvbiBbKGZpbHRlckp1bmN0aW9uKV09XCJmaWx0ZXJKdW5jdGlvbi5maWx0ZXJKdW5jdGlvbnNbal1cIiBbb3BlblNpZGVdPVwib3BlblNpZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2pvaW5GaWx0ZXJGaWVsZHNdPVwiam9pbkZpbHRlckZpZWxkc1wiIFtqb2luRmllbGRzTmFtZV09XCJqb2luRmllbGRzTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyRmllbGRzXT1cImZpbHRlckZpZWxkc1wiIFtwYXJlbnRKdW5jdGlvbl09XCJmaWx0ZXJKdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFyYW1ldGVyVmFsdWVzXT1cInBhcmFtZXRlclZhbHVlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbanVuY3Rpb25JbmRleF09XCJqXCI+PC9raS1kYXRhc2V0LWZpbHRlci1qdW5jdGlvbj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=