@seniorsistemas/data-seniorx-core 2.3.0 → 3.0.0
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.
- package/core/constants/autocomplete.const.d.ts +4 -0
- package/core/constants/context-selector.const.d.ts +1 -0
- package/core/constants/gantt.const.d.ts +7 -0
- package/core/constants/hyperlink.const.d.ts +1 -0
- package/core/constants/inline-edit.const.d.ts +4 -0
- package/core/constants/kanban.const.d.ts +2 -0
- package/core/constants/pin-code-field.const.d.ts +5 -0
- package/core/constants/rating-scale.const.d.ts +1 -0
- package/core/constants/spotlight.const.d.ts +8 -0
- package/core/constants/star-rating.const.d.ts +4 -0
- package/core/constants/stepper.const.d.ts +1 -0
- package/core/constants/tiered-menu.const.d.ts +3 -0
- package/core/types/autocomplete.type.d.ts +9 -0
- package/core/types/chat.type.d.ts +12 -0
- package/core/types/checkbox-list.type.d.ts +12 -0
- package/core/types/gantt.type.d.ts +22 -0
- package/core/types/grid-menu.type.d.ts +13 -0
- package/core/types/hyperlink.type.d.ts +1 -0
- package/core/types/image-cropper.type.d.ts +20 -0
- package/core/types/inline-edit.type.d.ts +26 -0
- package/core/types/kanban.type.d.ts +36 -0
- package/core/types/panel.type.d.ts +16 -0
- package/core/types/profile-picture-picker.type.d.ts +9 -0
- package/core/types/rating-scale.type.d.ts +5 -0
- package/core/types/select-button.type.d.ts +1 -0
- package/core/types/spotlight.type.d.ts +34 -0
- package/core/types/star-rating.type.d.ts +1 -0
- package/core/types/stepper.type.d.ts +20 -0
- package/core/types/table-column.type.d.ts +3 -1
- package/core/types/table-options.type.d.ts +8 -2
- package/core/types/table.type.d.ts +1 -1
- package/core/types/tiered-menu.type.d.ts +16 -0
- package/core/types/tree.type.d.ts +25 -0
- package/core/types/workspace-switch.type.d.ts +6 -0
- package/core/utils/body-scroll.util.d.ts +2 -0
- package/core/utils/roving-focus.util.d.ts +2 -0
- package/core/utils/selection.util.d.ts +3 -0
- package/core/utils/tree.util.d.ts +4 -0
- package/esm2022/core/constants/autocomplete.const.mjs +5 -0
- package/esm2022/core/constants/context-selector.const.mjs +2 -0
- package/esm2022/core/constants/gantt.const.mjs +7 -0
- package/esm2022/core/constants/hyperlink.const.mjs +2 -1
- package/esm2022/core/constants/inline-edit.const.mjs +5 -0
- package/esm2022/core/constants/kanban.const.mjs +3 -0
- package/esm2022/core/constants/pin-code-field.const.mjs +6 -0
- package/esm2022/core/constants/rating-scale.const.mjs +2 -0
- package/esm2022/core/constants/spotlight.const.mjs +9 -0
- package/esm2022/core/constants/star-rating.const.mjs +5 -0
- package/esm2022/core/constants/stepper.const.mjs +2 -0
- package/esm2022/core/constants/table.const.mjs +2 -2
- package/esm2022/core/constants/tiered-menu.const.mjs +4 -0
- package/esm2022/core/types/autocomplete.type.mjs +2 -0
- package/esm2022/core/types/chat.type.mjs +2 -0
- package/esm2022/core/types/checkbox-list.type.mjs +2 -0
- package/esm2022/core/types/gantt.type.mjs +2 -0
- package/esm2022/core/types/grid-menu.type.mjs +2 -0
- package/esm2022/core/types/hyperlink.type.mjs +1 -1
- package/esm2022/core/types/image-cropper.type.mjs +2 -0
- package/esm2022/core/types/inline-edit.type.mjs +2 -0
- package/esm2022/core/types/kanban.type.mjs +2 -0
- package/esm2022/core/types/panel.type.mjs +9 -0
- package/esm2022/core/types/profile-picture-picker.type.mjs +2 -0
- package/esm2022/core/types/rating-scale.type.mjs +2 -0
- package/esm2022/core/types/select-button.type.mjs +1 -1
- package/esm2022/core/types/spotlight.type.mjs +2 -0
- package/esm2022/core/types/star-rating.type.mjs +2 -0
- package/esm2022/core/types/stepper.type.mjs +7 -0
- package/esm2022/core/types/table-column.type.mjs +1 -1
- package/esm2022/core/types/table-options.type.mjs +1 -1
- package/esm2022/core/types/table.type.mjs +1 -1
- package/esm2022/core/types/tiered-menu.type.mjs +2 -0
- package/esm2022/core/types/tree.type.mjs +2 -0
- package/esm2022/core/types/workspace-switch.type.mjs +2 -0
- package/esm2022/core/utils/body-scroll.util.mjs +19 -0
- package/esm2022/core/utils/combobox.util.mjs +3 -2
- package/esm2022/core/utils/roving-focus.util.mjs +20 -0
- package/esm2022/core/utils/selection.util.mjs +13 -0
- package/esm2022/core/utils/string.util.mjs +8 -3
- package/esm2022/core/utils/tree.util.mjs +23 -0
- package/esm2022/features/accordion/accordion.component.mjs +2 -2
- package/esm2022/features/accordion/{accordion-item.component.mjs → components/accordion-item/accordion-item.component.mjs} +7 -7
- package/esm2022/features/autocomplete/autocomplete.component.mjs +501 -0
- package/esm2022/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +30 -0
- package/esm2022/features/breadcrumb/breadcrumb.component.mjs +2 -2
- package/esm2022/features/card-list/card/card.component.mjs +63 -99
- package/esm2022/features/chat/chat.component.mjs +126 -0
- package/esm2022/features/checkbox-list/checkbox-list.component.mjs +125 -0
- package/esm2022/features/combobox/combobox.component.mjs +20 -8
- package/esm2022/features/context-selector/context-selector.component.mjs +198 -0
- package/esm2022/features/filters/filters.component.mjs +1 -1
- package/esm2022/features/gantt/components/gantt-side-table/gantt-side-table.component.mjs +17 -0
- package/esm2022/features/gantt/gantt-date.utils.mjs +97 -0
- package/esm2022/features/gantt/gantt.component.mjs +89 -0
- package/esm2022/features/gantt/gantt.engine.mjs +662 -0
- package/esm2022/features/grid-menu/grid-menu.component.mjs +104 -0
- package/esm2022/features/hyperlink/hyperlink.component.mjs +7 -4
- package/esm2022/features/icon-picker/icon-picker.component.mjs +3 -3
- package/esm2022/features/image-cropper/image-cropper.component.mjs +218 -0
- package/esm2022/features/image-cropper/services/image-cropper.service.mjs +50 -0
- package/esm2022/features/infinite-scroll/infinite-scroll.directive.mjs +89 -0
- package/esm2022/features/info-sign/info-sign.component.mjs +3 -3
- package/esm2022/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +38 -0
- package/esm2022/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.mjs +29 -0
- package/esm2022/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.mjs +29 -0
- package/esm2022/features/inline-edit/components/inline-edit-item/inline-edit-item.component.mjs +131 -0
- package/esm2022/features/inline-edit/fields/inline-edit-field.mjs +17 -0
- package/esm2022/features/inline-edit/fields/inline-edit-number-field.mjs +15 -0
- package/esm2022/features/inline-edit/fields/inline-edit-text-field.mjs +11 -0
- package/esm2022/features/inline-edit/fields/inline-edit-textarea-field.mjs +15 -0
- package/esm2022/features/inline-edit/inline-edit.component.mjs +27 -0
- package/esm2022/features/interactive-content/interactive-content.directive.mjs +140 -0
- package/esm2022/features/kanban/components/kanban-column/kanban-column.component.mjs +88 -0
- package/esm2022/features/kanban/components/kanban-item/kanban-item.component.mjs +72 -0
- package/esm2022/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.mjs +19 -0
- package/esm2022/features/kanban/directives/kanban-template.directive.mjs +22 -0
- package/esm2022/features/kanban/kanban.component.mjs +198 -0
- package/esm2022/features/kanban/services/kanban-event.service.mjs +27 -0
- package/esm2022/features/loading-state/loading-state.component.mjs +3 -62
- package/esm2022/features/mouse-events/directives/double-click.directive.mjs +34 -0
- package/esm2022/features/mouse-events/directives/long-press.directive.mjs +61 -0
- package/esm2022/features/paginator/paginator.component.mjs +8 -3
- package/esm2022/features/panel/panel.component.mjs +43 -11
- package/esm2022/features/pin-code-field/pin-code-field.component.mjs +234 -0
- package/esm2022/features/profile-picture-picker/profile-picture-picker.component.mjs +330 -0
- package/esm2022/features/rating-scale/rating-scale.component.mjs +86 -0
- package/esm2022/features/row-card-list/row-card/row-card.component.mjs +3 -3
- package/esm2022/features/scaffold/scaffold.component.mjs +4 -6
- package/esm2022/features/select-button/select-button.component.mjs +7 -4
- package/esm2022/features/speech-recognition/services/speech-recognition.service.mjs +148 -0
- package/esm2022/features/speech-recognition/services/text-to-speech.service.mjs +88 -0
- package/esm2022/features/speech-recognition/speech-recognition.component.mjs +243 -0
- package/esm2022/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.mjs +521 -0
- package/esm2022/features/spotlight/directives/spotlight-step.directive.mjs +38 -0
- package/esm2022/features/spotlight/services/spotlight-tour.service.mjs +179 -0
- package/esm2022/features/spotlight/spotlight.component.mjs +160 -0
- package/esm2022/features/star-rating/star-rating.component.mjs +95 -0
- package/esm2022/features/stepper/stepper.component.mjs +86 -0
- package/esm2022/features/switch/switch.component.mjs +12 -8
- package/esm2022/features/tab/{tab-item.component.mjs → components/tab-item/tab-item.component.mjs} +1 -1
- package/esm2022/features/tab/tab.component.mjs +4 -4
- package/esm2022/features/table/components/table-cell-content.component.mjs +14 -5
- package/esm2022/features/table/table.component.mjs +220 -29
- package/esm2022/features/table/utils/table-data.util.mjs +71 -8
- package/esm2022/features/table/utils/table-layout.util.mjs +21 -1
- package/esm2022/features/tiered-menu/components/tiered-menu/tiered-menu.component.mjs +367 -0
- package/esm2022/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.mjs +11 -0
- package/esm2022/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +97 -0
- package/esm2022/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.mjs +181 -0
- package/esm2022/features/tiered-menu/directives/tiered-menu.directive.mjs +246 -0
- package/esm2022/features/tiered-menu/services/tiered-menu.event.service.mjs +16 -0
- package/esm2022/features/tiered-menu/services/tiered-menu.global.service.mjs +12 -0
- package/esm2022/features/tiered-menu/services/tiered-menu.service.mjs +49 -0
- package/esm2022/features/tree/components/tree-node-item/tree-node-item.component.mjs +169 -0
- package/esm2022/features/tree/tree.component.mjs +211 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.mjs +41 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.mjs +38 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.mjs +29 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.mjs +29 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.mjs +35 -0
- package/esm2022/features/visual-sql-editor/services/visual-sql-editor-flow.service.mjs +106 -0
- package/esm2022/features/visual-sql-editor/services/visual-sql-editor-state.service.mjs +230 -0
- package/esm2022/features/visual-sql-editor/types/visual-sql-editor.types.mjs +2 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.mjs +72 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sql.util.mjs +281 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-text.util.mjs +37 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor.constants.mjs +89 -0
- package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +172 -630
- package/esm2022/locales/en.json +351 -3
- package/esm2022/locales/es-CO.json +351 -3
- package/esm2022/locales/pt.json +351 -3
- package/esm2022/providers/features.provider.mjs +40 -4
- package/esm2022/public-api.mjs +56 -3
- package/features/accordion/accordion.component.d.ts +1 -1
- package/features/accordion/{accordion-item.component.d.ts → components/accordion-item/accordion-item.component.d.ts} +1 -1
- package/features/autocomplete/autocomplete.component.d.ts +102 -0
- package/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.d.ts +11 -0
- package/features/card-list/card/card.component.d.ts +14 -34
- package/features/chat/chat.component.d.ts +31 -0
- package/features/checkbox-list/checkbox-list.component.d.ts +26 -0
- package/features/combobox/combobox.component.d.ts +2 -1
- package/features/context-selector/context-selector.component.d.ts +37 -0
- package/features/gantt/components/gantt-side-table/gantt-side-table.component.d.ts +8 -0
- package/features/gantt/gantt-date.utils.d.ts +36 -0
- package/features/gantt/gantt.component.d.ts +24 -0
- package/features/gantt/gantt.engine.d.ts +52 -0
- package/features/grid-menu/grid-menu.component.d.ts +29 -0
- package/features/hyperlink/hyperlink.component.d.ts +2 -1
- package/features/image-cropper/image-cropper.component.d.ts +43 -0
- package/features/image-cropper/services/image-cropper.service.d.ts +13 -0
- package/features/infinite-scroll/infinite-scroll.directive.d.ts +25 -0
- package/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.d.ts +13 -0
- package/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.d.ts +13 -0
- package/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.d.ts +13 -0
- package/features/inline-edit/components/inline-edit-item/inline-edit-item.component.d.ts +37 -0
- package/features/inline-edit/fields/inline-edit-field.d.ts +12 -0
- package/features/inline-edit/fields/inline-edit-number-field.d.ts +9 -0
- package/features/inline-edit/fields/inline-edit-text-field.d.ts +7 -0
- package/features/inline-edit/fields/inline-edit-textarea-field.d.ts +9 -0
- package/features/inline-edit/inline-edit.component.d.ts +13 -0
- package/features/interactive-content/interactive-content.directive.d.ts +31 -0
- package/features/kanban/components/kanban-column/kanban-column.component.d.ts +22 -0
- package/features/kanban/components/kanban-item/kanban-item.component.d.ts +23 -0
- package/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.d.ts +8 -0
- package/features/kanban/directives/kanban-template.directive.d.ts +10 -0
- package/features/kanban/kanban.component.d.ts +32 -0
- package/features/kanban/services/kanban-event.service.d.ts +15 -0
- package/features/loading-state/loading-state.component.d.ts +0 -2
- package/features/mouse-events/directives/double-click.directive.d.ts +11 -0
- package/features/mouse-events/directives/long-press.directive.d.ts +14 -0
- package/features/panel/panel.component.d.ts +12 -3
- package/features/pin-code-field/pin-code-field.component.d.ts +44 -0
- package/features/profile-picture-picker/profile-picture-picker.component.d.ts +77 -0
- package/features/rating-scale/rating-scale.component.d.ts +24 -0
- package/features/select-button/select-button.component.d.ts +2 -1
- package/features/speech-recognition/services/speech-recognition.service.d.ts +29 -0
- package/features/speech-recognition/services/text-to-speech.service.d.ts +24 -0
- package/features/speech-recognition/speech-recognition.component.d.ts +50 -0
- package/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.d.ts +59 -0
- package/features/spotlight/directives/spotlight-step.directive.d.ts +13 -0
- package/features/spotlight/services/spotlight-tour.service.d.ts +46 -0
- package/features/spotlight/spotlight.component.d.ts +59 -0
- package/features/star-rating/star-rating.component.d.ts +26 -0
- package/features/stepper/stepper.component.d.ts +23 -0
- package/features/switch/switch.component.d.ts +2 -1
- package/features/tab/tab.component.d.ts +1 -1
- package/features/table/components/table-cell-content.component.d.ts +4 -3
- package/features/table/table.component.d.ts +40 -5
- package/features/table/utils/table-data.util.d.ts +1 -0
- package/features/table/utils/table-layout.util.d.ts +1 -0
- package/features/tiered-menu/components/tiered-menu/tiered-menu.component.d.ts +49 -0
- package/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.d.ts +5 -0
- package/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.d.ts +19 -0
- package/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.d.ts +26 -0
- package/features/tiered-menu/directives/tiered-menu.directive.d.ts +44 -0
- package/features/tiered-menu/services/tiered-menu.event.service.d.ts +13 -0
- package/features/tiered-menu/services/tiered-menu.global.service.d.ts +7 -0
- package/features/tiered-menu/services/tiered-menu.service.d.ts +14 -0
- package/features/tree/components/tree-node-item/tree-node-item.component.d.ts +37 -0
- package/features/tree/tree.component.d.ts +37 -0
- package/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.d.ts +18 -0
- package/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.d.ts +17 -0
- package/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.d.ts +13 -0
- package/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.d.ts +13 -0
- package/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.d.ts +15 -0
- package/features/visual-sql-editor/services/visual-sql-editor-flow.service.d.ts +26 -0
- package/features/visual-sql-editor/services/visual-sql-editor-state.service.d.ts +72 -0
- package/features/visual-sql-editor/types/visual-sql-editor.types.d.ts +182 -0
- package/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.d.ts +14 -0
- package/features/visual-sql-editor/utils/visual-sql-editor-sql.util.d.ts +81 -0
- package/features/visual-sql-editor/utils/visual-sql-editor-text.util.d.ts +15 -0
- package/features/visual-sql-editor/utils/visual-sql-editor.constants.d.ts +36 -0
- package/features/visual-sql-editor/visual-sql-editor.component.d.ts +37 -199
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs +14883 -6353
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
- package/package.json +8 -8
- package/public-api.d.ts +72 -2
- package/src/locales/en.json +353 -15
- package/src/locales/es-CO.json +352 -14
- package/src/locales/pt.json +352 -14
- package/styles/sdc-global-variables.scss +1 -1
- package/styles.css +1 -1
- /package/features/tab/{tab-item.component.d.ts → components/tab-item/tab-item.component.d.ts} +0 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { EMPTY_VALUE, FILTER_MODE_DOMAIN } from "./visual-sql-editor.constants";
|
|
2
|
+
import { isNumericType } from "./visual-sql-editor-sanitize.util";
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Helper: normalize a field entry (mirrors component's normalizeGeneratedField)
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
function normalizeGeneratedField(value) {
|
|
7
|
+
if (typeof value === "string") {
|
|
8
|
+
return { column: value };
|
|
9
|
+
}
|
|
10
|
+
return {
|
|
11
|
+
column: value.column,
|
|
12
|
+
alias: value.alias?.trim() ?? EMPTY_VALUE,
|
|
13
|
+
width: value.width?.trim() ?? EMPTY_VALUE,
|
|
14
|
+
function: value.function
|
|
15
|
+
? {
|
|
16
|
+
functionName: value.function.functionName?.trim() ?? EMPTY_VALUE,
|
|
17
|
+
alias: value.function.alias?.trim() ?? EMPTY_VALUE,
|
|
18
|
+
}
|
|
19
|
+
: null,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Leaf helpers (no context dependency)
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
/**
|
|
26
|
+
* Wraps a SQL string value in single quotes, escaping internal single quotes.
|
|
27
|
+
*/
|
|
28
|
+
export function quoteSqlValue(value) {
|
|
29
|
+
return `'${value.replace(/'/g, "''")}'`;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Decorates a string value with % wildcards according to the LIKE operator variant.
|
|
33
|
+
*/
|
|
34
|
+
export function decorateLikeValue(operator, value) {
|
|
35
|
+
if (operator === "STARTS_WITH") {
|
|
36
|
+
return `${value}%`;
|
|
37
|
+
}
|
|
38
|
+
if (operator === "ENDS_WITH") {
|
|
39
|
+
return `%${value}`;
|
|
40
|
+
}
|
|
41
|
+
if (operator === "CONTAINS" || operator === "DOES_NOT_CONTAIN") {
|
|
42
|
+
return `%${value}%`;
|
|
43
|
+
}
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
// Context-aware helpers
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
/**
|
|
50
|
+
* Resolves a column option from the context by its value identifier.
|
|
51
|
+
*/
|
|
52
|
+
function resolveColumnOption(ctx, value) {
|
|
53
|
+
return ctx.columns.find((item) => item.value === value);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Resolves a table option from the context by its value identifier.
|
|
57
|
+
*/
|
|
58
|
+
function resolveTableOption(ctx, value) {
|
|
59
|
+
return ctx.tables.find((item) => item.value === value);
|
|
60
|
+
}
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// Exported SQL resolution functions
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
/**
|
|
65
|
+
* Resolves the SQL fragment for a source table including its alias.
|
|
66
|
+
*/
|
|
67
|
+
export function resolveSourceSql(ctx, source) {
|
|
68
|
+
const table = "table" in source ? resolveTableOption(ctx, source.table) : source;
|
|
69
|
+
if (!table) {
|
|
70
|
+
return EMPTY_VALUE;
|
|
71
|
+
}
|
|
72
|
+
const sourceAlias = "table" in source ? source.alias : EMPTY_VALUE;
|
|
73
|
+
const fullName = table.schema ? `${table.schema}.${table.value}` : table.value;
|
|
74
|
+
return sourceAlias ? `${fullName} ${sourceAlias}` : fullName;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Resolves the SQL fragment for a column reference using the source alias.
|
|
78
|
+
*/
|
|
79
|
+
export function resolveColumnSql(ctx, value) {
|
|
80
|
+
const column = resolveColumnOption(ctx, value);
|
|
81
|
+
if (!column) {
|
|
82
|
+
return value;
|
|
83
|
+
}
|
|
84
|
+
const alias = ctx.sources.find((item) => item.table === column.table)?.alias;
|
|
85
|
+
const fieldName = column.fullName.split(".").pop() ?? column.value;
|
|
86
|
+
return alias ? `${alias}.${fieldName}` : column.fullName;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Resolves the SQL fragment for an aggregate function call.
|
|
90
|
+
*/
|
|
91
|
+
export function resolveFunctionSql(ctx, item) {
|
|
92
|
+
const normalizedFunction = item.functionName.toUpperCase();
|
|
93
|
+
const argument = resolveColumnSql(ctx, item.column);
|
|
94
|
+
const alias = item.alias?.trim();
|
|
95
|
+
return alias
|
|
96
|
+
? `${normalizedFunction}(${argument}) AS ${alias}`
|
|
97
|
+
: `${normalizedFunction}(${argument})`;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Resolves the SQL fragment for a field (column or function expression) in the SELECT list.
|
|
101
|
+
*/
|
|
102
|
+
export function resolveFieldSql(ctx, field) {
|
|
103
|
+
const normalizedField = normalizeGeneratedField(field);
|
|
104
|
+
const fieldSql = resolveColumnSql(ctx, normalizedField.column);
|
|
105
|
+
if (normalizedField.function?.functionName) {
|
|
106
|
+
return resolveFunctionSql(ctx, {
|
|
107
|
+
functionName: normalizedField.function.functionName,
|
|
108
|
+
column: normalizedField.column,
|
|
109
|
+
alias: normalizedField.function.alias?.trim() || // NOSONAR
|
|
110
|
+
normalizedField.alias?.trim() || // NOSONAR
|
|
111
|
+
EMPTY_VALUE,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
const alias = normalizedField.alias?.trim();
|
|
115
|
+
return alias ? `${fieldSql} AS ${alias}` : fieldSql;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Resolves the SQL fragment for a sort item (column or function expression).
|
|
119
|
+
*/
|
|
120
|
+
export function resolveSortSql(ctx, item) {
|
|
121
|
+
if (!item.functionName?.trim()) {
|
|
122
|
+
return resolveColumnSql(ctx, item.column);
|
|
123
|
+
}
|
|
124
|
+
return `${item.functionName.trim().toUpperCase()}(${resolveColumnSql(ctx, item.column)})`;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Resolves the SQL comparison operator string for a filter operator key.
|
|
128
|
+
*/
|
|
129
|
+
export function resolveFilterOperatorSql(value) {
|
|
130
|
+
return ({
|
|
131
|
+
EQUAL: "=",
|
|
132
|
+
NOT_EQUAL: "<>",
|
|
133
|
+
GREATER: ">",
|
|
134
|
+
GREATER_THAN: ">",
|
|
135
|
+
GREATER_OR_EQUAL: ">=",
|
|
136
|
+
GREATER_THAN_OR_EQUAL: ">=",
|
|
137
|
+
LESS: "<",
|
|
138
|
+
LESS_THAN: "<",
|
|
139
|
+
LESS_OR_EQUAL: "<=",
|
|
140
|
+
LESS_THAN_OR_EQUAL: "<=",
|
|
141
|
+
CONTAINS: "LIKE",
|
|
142
|
+
DOES_NOT_CONTAIN: "NOT LIKE",
|
|
143
|
+
STARTS_WITH: "LIKE",
|
|
144
|
+
ENDS_WITH: "LIKE",
|
|
145
|
+
}[value] ?? value);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Resolves the SQL value fragment for a filter, applying quoting and LIKE decoration.
|
|
149
|
+
*/
|
|
150
|
+
export function resolveFilterValueSql(ctx, columnValue, operator, value) {
|
|
151
|
+
const stringValue = String(value ?? EMPTY_VALUE);
|
|
152
|
+
const column = resolveColumnOption(ctx, columnValue);
|
|
153
|
+
if (column?.dataType === "boolean") {
|
|
154
|
+
return stringValue.toLowerCase() === "true" ? "TRUE" : "FALSE";
|
|
155
|
+
}
|
|
156
|
+
if (isNumericType(column?.dataType) && stringValue) {
|
|
157
|
+
return stringValue;
|
|
158
|
+
}
|
|
159
|
+
if (["CONTAINS", "DOES_NOT_CONTAIN", "STARTS_WITH", "ENDS_WITH"].includes(operator)) {
|
|
160
|
+
return quoteSqlValue(decorateLikeValue(operator, stringValue));
|
|
161
|
+
}
|
|
162
|
+
return quoteSqlValue(stringValue);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Resolves the full SQL fragment for a single filter condition.
|
|
166
|
+
*/
|
|
167
|
+
export function resolveFilterSql(// NOSONAR - complexity: extraction would risk behavior change
|
|
168
|
+
ctx, filter) {
|
|
169
|
+
if (filter.valueType === FILTER_MODE_DOMAIN) {
|
|
170
|
+
return `(${filter.domainExpression ?? EMPTY_VALUE})`;
|
|
171
|
+
}
|
|
172
|
+
const field = resolveColumnSql(ctx, filter.column);
|
|
173
|
+
if (!field) {
|
|
174
|
+
return EMPTY_VALUE;
|
|
175
|
+
}
|
|
176
|
+
if (filter.operator === "EMPTY") {
|
|
177
|
+
return `${field} IS NULL`;
|
|
178
|
+
}
|
|
179
|
+
if (filter.operator === "NOT_EMPTY") {
|
|
180
|
+
return `${field} IS NOT NULL`;
|
|
181
|
+
}
|
|
182
|
+
if (filter.operator === "IN") {
|
|
183
|
+
const values = (filter.values ?? []).map((item) => resolveFilterValueSql(ctx, filter.column, filter.operator, item));
|
|
184
|
+
return `${field} IN (${values.join(", ")})`;
|
|
185
|
+
}
|
|
186
|
+
if (filter.operator === "BETWEEN") {
|
|
187
|
+
return `${field} BETWEEN ${resolveFilterValueSql(ctx, filter.column, filter.operator, filter.values?.[0])} AND ${resolveFilterValueSql(ctx, filter.column, filter.operator, filter.values?.[1])}`;
|
|
188
|
+
}
|
|
189
|
+
if (filter.valueType === "parameter") {
|
|
190
|
+
return `${field} ${resolveFilterOperatorSql(filter.operator)} :${filter.parameterName ?? EMPTY_VALUE}`;
|
|
191
|
+
}
|
|
192
|
+
return `${field} ${resolveFilterOperatorSql(filter.operator)} ${resolveFilterValueSql(ctx, filter.column, filter.operator, filter.value)}`;
|
|
193
|
+
}
|
|
194
|
+
function resolveJoinOperatorSql(value) {
|
|
195
|
+
return ({
|
|
196
|
+
EQUALS: "=",
|
|
197
|
+
NOT_EQUALS: "<>",
|
|
198
|
+
}[value] ?? value);
|
|
199
|
+
}
|
|
200
|
+
function resolveJoinedTableSql(ctx, item) {
|
|
201
|
+
const targetColumn = resolveColumnOption(ctx, item.targetColumn);
|
|
202
|
+
if (!targetColumn) {
|
|
203
|
+
return EMPTY_VALUE;
|
|
204
|
+
}
|
|
205
|
+
const source = ctx.sources.find((entry) => entry.table === targetColumn.table);
|
|
206
|
+
if (!source) {
|
|
207
|
+
return EMPTY_VALUE;
|
|
208
|
+
}
|
|
209
|
+
return resolveSourceSql(ctx, source);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Resolves the full SQL fragment for a JOIN clause.
|
|
213
|
+
*/
|
|
214
|
+
export function resolveJoinSql(ctx, item) {
|
|
215
|
+
return `JOIN ${resolveJoinedTableSql(ctx, item)} ON ${resolveColumnSql(ctx, item.sourceColumn)} ${resolveJoinOperatorSql(item.operator)} ${resolveColumnSql(ctx, item.targetColumn)}`;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Builds the WHERE clause lines for a list of filters.
|
|
219
|
+
* Returns an empty array when no filters are provided.
|
|
220
|
+
*/
|
|
221
|
+
export function buildWhereSql(ctx, filters) {
|
|
222
|
+
const expressions = filters
|
|
223
|
+
.map((filter, index) => {
|
|
224
|
+
const connector = index === 0 ? "WHERE" : filter.connector;
|
|
225
|
+
const conditionSql = resolveFilterSql(ctx, filter);
|
|
226
|
+
return conditionSql !== EMPTY_VALUE ? ` ${connector} ${conditionSql}` : EMPTY_VALUE;
|
|
227
|
+
})
|
|
228
|
+
.filter((item) => item !== EMPTY_VALUE);
|
|
229
|
+
return expressions.length ? expressions : [];
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Builds the GROUP BY clause lines for a list of column identifiers.
|
|
233
|
+
* Returns an empty array when groupBy is empty.
|
|
234
|
+
*/
|
|
235
|
+
export function buildGroupBySql(ctx, groupBy) {
|
|
236
|
+
if (!groupBy.length) {
|
|
237
|
+
return [];
|
|
238
|
+
}
|
|
239
|
+
return [
|
|
240
|
+
"GROUP BY",
|
|
241
|
+
` ${groupBy.map((item) => resolveColumnSql(ctx, item)).join(",\n ")}`,
|
|
242
|
+
];
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Builds the ORDER BY clause lines for a list of sort items.
|
|
246
|
+
* Returns an empty array when sorting is empty.
|
|
247
|
+
*/
|
|
248
|
+
export function buildOrderBySql(ctx, sorting) {
|
|
249
|
+
if (!sorting.length) {
|
|
250
|
+
return [];
|
|
251
|
+
}
|
|
252
|
+
return [
|
|
253
|
+
"ORDER BY",
|
|
254
|
+
` ${sorting
|
|
255
|
+
.map((item) => `${resolveSortSql(ctx, item)} ${item.direction}`)
|
|
256
|
+
.join(",\n ")}`,
|
|
257
|
+
];
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Builds the complete generated SQL string from the provided config data.
|
|
261
|
+
* Returns an empty string when sources is empty.
|
|
262
|
+
*/
|
|
263
|
+
export function buildGeneratedSql(sources, normalizedFields, joins, filters, groupBy, sorting, ctx) {
|
|
264
|
+
if (!sources.length) {
|
|
265
|
+
return EMPTY_VALUE;
|
|
266
|
+
}
|
|
267
|
+
const selectParts = normalizedFields
|
|
268
|
+
.map((field) => resolveFieldSql(ctx, field))
|
|
269
|
+
.filter(Boolean);
|
|
270
|
+
const sql = [
|
|
271
|
+
"SELECT",
|
|
272
|
+
` ${(selectParts.length ? selectParts : ["*"]).join(",\n ")}`,
|
|
273
|
+
`FROM ${resolveSourceSql(ctx, sources[0])}`,
|
|
274
|
+
...joins.map((item) => resolveJoinSql(ctx, item)),
|
|
275
|
+
...buildWhereSql(ctx, filters),
|
|
276
|
+
...buildGroupBySql(ctx, groupBy),
|
|
277
|
+
...buildOrderBySql(ctx, sorting),
|
|
278
|
+
];
|
|
279
|
+
return sql.join("\n");
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsLXNxbC1lZGl0b3Itc3FsLnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3Zpc3VhbC1zcWwtZWRpdG9yL3V0aWxzL3Zpc3VhbC1zcWwtZWRpdG9yLXNxbC51dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVVBLE9BQU8sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFlbEUsOEVBQThFO0FBQzlFLGdGQUFnRjtBQUNoRiw4RUFBOEU7QUFDOUUsU0FBUyx1QkFBdUIsQ0FDNUIsS0FBdUM7SUFFdkMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QixPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFDRCxPQUFPO1FBQ0gsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1FBQ3BCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVc7UUFDekMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksV0FBVztRQUN6QyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDcEIsQ0FBQyxDQUFDO2dCQUNFLFlBQVksRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXO2dCQUNoRSxLQUFLLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksV0FBVzthQUNyRDtZQUNELENBQUMsQ0FBQyxJQUFJO0tBQ2IsQ0FBQztBQUNOLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsdUNBQXVDO0FBQ3ZDLDhFQUE4RTtBQUU5RTs7R0FFRztBQUNILE1BQU0sVUFBVSxhQUFh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Q0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQztRQUM5QixHQUFHLGVBQWUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDO1FBQ2hDLEdBQUcsZUFBZSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUM7S0FDbkMsQ0FBQztJQUNGLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICAgIER5bmFtaWNWaWV3QnVpbGRlckNvbHVtbk9wdGlvbixcbiAgICBEeW5hbWljVmlld0J1aWxkZXJGaWVsZCxcbiAgICBEeW5hbWljVmlld0J1aWxkZXJGaWx0ZXIsXG4gICAgRHluYW1pY1ZpZXdCdWlsZGVyRnVuY3Rpb24sXG4gICAgRHluYW1pY1ZpZXdCdWlsZGVySm9pbixcbiAgICBEeW5hbWljVmlld0J1aWxkZXJTb3J0LFxuICAgIER5bmFtaWNWaWV3QnVpbGRlclNvdXJjZSxcbiAgICBEeW5hbWljVmlld0J1aWxkZXJUYWJsZU9wdGlvbixcbn0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvdHlwZXMvZHluYW1pYy12aWV3LWJ1aWxkZXIudHlwZVwiO1xuaW1wb3J0IHsgRU1QVFlfVkFMVUUsIEZJTFRFUl9NT0RFX0RPTUFJTiB9IGZyb20gXCIuL3Zpc3VhbC1zcWwtZWRpdG9yLmNvbnN0YW50c1wiO1xuaW1wb3J0IHsgaXNOdW1lcmljVHlwZSB9IGZyb20gXCIuL3Zpc3VhbC1zcWwtZWRpdG9yLXNhbml0aXplLnV0aWxcIjtcblxuLyoqXG4gKiBDb250ZXh0IG9iamVjdCBjYXJyeWluZyB0aGUgcmVzb2x2ZWQgY29uZmlnIGRhdGEgbmVlZGVkIGJ5IFNRTCBnZW5lcmF0aW9uIGZ1bmN0aW9ucy5cbiAqIEFsbCBmdW5jdGlvbnMgaW4gdGhpcyB1dGlsIGFyZSBwdXJlIHdpdGggcmVzcGVjdCB0byB0aGlzIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3FsQ29udGV4dCB7XG4gICAgLyoqIEF2YWlsYWJsZSBjb2x1bW4gb3B0aW9ucyBmcm9tIGNvbmZpZy5hdmFpbGFibGVEYXRhLmNvbHVtbnMgKi9cbiAgICBjb2x1bW5zOiBEeW5hbWljVmlld0J1aWxkZXJDb2x1bW5PcHRpb25bXTtcbiAgICAvKiogQXZhaWxhYmxlIHRhYmxlIG9wdGlvbnMgZnJvbSBjb25maWcuYXZhaWxhYmxlRGF0YS50YWJsZXMgKi9cbiAgICB0YWJsZXM6IER5bmFtaWNWaWV3QnVpbGRlclRhYmxlT3B0aW9uW107XG4gICAgLyoqIFNlbGVjdGVkIHNvdXJjZXMgZnJvbSBjb25maWcuZ2VuZXJhdGVkLnNvdXJjZXMgKi9cbiAgICBzb3VyY2VzOiBEeW5hbWljVmlld0J1aWxkZXJTb3VyY2VbXTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIZWxwZXI6IG5vcm1hbGl6ZSBhIGZpZWxkIGVudHJ5IChtaXJyb3JzIGNvbXBvbmVudCdzIG5vcm1hbGl6ZUdlbmVyYXRlZEZpZWxkKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBub3JtYWxpemVHZW5lcmF0ZWRGaWVsZChcbiAgICB2YWx1ZTogc3RyaW5nIHwgRHluYW1pY1ZpZXdCdWlsZGVyRmllbGRcbik6IER5bmFtaWNWaWV3QnVpbGRlckZpZWxkIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiB7IGNvbHVtbjogdmFsdWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uOiB2YWx1ZS5jb2x1bW4sXG4gICAgICAgIGFsaWFzOiB2YWx1ZS5hbGlhcz8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICB3aWR0aDogdmFsdWUud2lkdGg/LnRyaW0oKSA/PyBFTVBUWV9WQUxVRSxcbiAgICAgICAgZnVuY3Rpb246IHZhbHVlLmZ1bmN0aW9uXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbk5hbWU6IHZhbHVlLmZ1bmN0aW9uLmZ1bmN0aW9uTmFtZT8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICAgICAgICAgIGFsaWFzOiB2YWx1ZS5mdW5jdGlvbi5hbGlhcz8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBudWxsLFxuICAgIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTGVhZiBoZWxwZXJzIChubyBjb250ZXh0IGRlcGVuZGVuY3kpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBXcmFwcyBhIFNRTCBzdHJpbmcgdmFsdWUgaW4gc2luZ2xlIHF1b3RlcywgZXNjYXBpbmcgaW50ZXJuYWwgc2luZ2xlIHF1b3Rlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlU3FsVmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAnJHt2YWx1ZS5yZXBsYWNlKC8nL2csIFwiJydcIil9J2A7XG59XG5cbi8qKlxuICogRGVjb3JhdGVzIGEgc3RyaW5nIHZhbHVlIHdpdGggJSB3aWxkY2FyZHMgYWNjb3JkaW5nIHRvIHRoZSBMSUtFIG9wZXJhdG9yIHZhcmlhbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvcmF0ZUxpa2VWYWx1ZShvcGVyYXRvcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAob3BlcmF0b3IgPT09IFwiU1RBUlRTX1dJVEhcIikge1xuICAgICAgICByZXR1cm4gYCR7dmFsdWV9JWA7XG4gICAgfVxuICAgIGlmIChvcGVyYXRvciA9PT0gXCJFTkRTX1dJVEhcIikge1xuICAgICAgICByZXR1cm4gYCUke3ZhbHVlfWA7XG4gICAgfVxuICAgIGlmIChvcGVyYXRvciA9PT0gXCJDT05UQUlOU1wiIHx8IG9wZXJhdG9yID09PSBcIkRPRVNfTk9UX0NPTlRBSU5cIikge1xuICAgICAgICByZXR1cm4gYCUke3ZhbHVlfSVgO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29udGV4dC1hd2FyZSBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIGNvbHVtbiBvcHRpb24gZnJvbSB0aGUgY29udGV4dCBieSBpdHMgdmFsdWUgaWRlbnRpZmllci5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUNvbHVtbk9wdGlvbihcbiAgICBjdHg6IFNxbENvbnRleHQsXG4gICAgdmFsdWU6IHN0cmluZ1xuKTogRHluYW1pY1ZpZXdCdWlsZGVyQ29sdW1uT3B0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gY3R4LmNvbHVtbnMuZmluZCgoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gdmFsdWUpO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGEgdGFibGUgb3B0aW9uIGZyb20gdGhlIGNvbnRleHQgYnkgaXRzIHZhbHVlIGlkZW50aWZpZXIuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVUYWJsZU9wdGlvbihcbiAgICBjdHg6IFNxbENvbnRleHQsXG4gICAgdmFsdWU6IHN0cmluZ1xuKTogRHluYW1pY1ZpZXdCdWlsZGVyVGFibGVPcHRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBjdHgudGFibGVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IHZhbHVlKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeHBvcnRlZCBTUUwgcmVzb2x1dGlvbiBmdW5jdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBTUUwgZnJhZ21lbnQgZm9yIGEgc291cmNlIHRhYmxlIGluY2x1ZGluZyBpdHMgYWxpYXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU291cmNlU3FsKFxuICAgIGN0eDogU3FsQ29udGV4dCxcbiAgICBzb3VyY2U6IER5bmFtaWNWaWV3QnVpbGRlclRhYmxlT3B0aW9uIHwgeyB0YWJsZTogc3RyaW5nOyBhbGlhczogc3RyaW5nIH1cbik6IHN0cmluZyB7XG4gICAgY29uc3QgdGFibGUgPSBcInRhYmxlXCIgaW4gc291cmNlID8gcmVzb2x2ZVRhYmxlT3B0aW9uKGN0eCwgc291cmNlLnRhYmxlKSA6IHNvdXJjZTtcbiAgICBpZiAoIXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBFTVBUWV9WQUxVRTtcbiAgICB9XG4gICAgY29uc3Qgc291cmNlQWxpYXMgPSBcInRhYmxlXCIgaW4gc291cmNlID8gc291cmNlLmFsaWFzIDogRU1QVFlfVkFMVUU7XG4gICAgY29uc3QgZnVsbE5hbWUgPSB0YWJsZS5zY2hlbWEgPyBgJHt0YWJsZS5zY2hlbWF9LiR7dGFibGUudmFsdWV9YCA6IHRhYmxlLnZhbHVlO1xuICAgIHJldHVybiBzb3VyY2VBbGlhcyA/IGAke2Z1bGxOYW1lfSAke3NvdXJjZUFsaWFzfWAgOiBmdWxsTmFtZTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgU1FMIGZyYWdtZW50IGZvciBhIGNvbHVtbiByZWZlcmVuY2UgdXNpbmcgdGhlIHNvdXJjZSBhbGlhcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDb2x1bW5TcWwoY3R4OiBTcWxDb250ZXh0LCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb2x1bW4gPSByZXNvbHZlQ29sdW1uT3B0aW9uKGN0eCwgdmFsdWUpO1xuICAgIGlmICghY29sdW1uKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3QgYWxpYXMgPSBjdHguc291cmNlcy5maW5kKFxuICAgICAgICAoaXRlbSkgPT4gaXRlbS50YWJsZSA9PT0gY29sdW1uLnRhYmxlXG4gICAgKT8uYWxpYXM7XG4gICAgY29uc3QgZmllbGROYW1lID0gY29sdW1uLmZ1bGxOYW1lLnNwbGl0KFwiLlwiKS5wb3AoKSA/PyBjb2x1bW4udmFsdWU7XG4gICAgcmV0dXJuIGFsaWFzID8gYCR7YWxpYXN9LiR7ZmllbGROYW1lfWAgOiBjb2x1bW4uZnVsbE5hbWU7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIFNRTCBmcmFnbWVudCBmb3IgYW4gYWdncmVnYXRlIGZ1bmN0aW9uIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRnVuY3Rpb25TcWwoXG4gICAgY3R4OiBTcWxDb250ZXh0LFxuICAgIGl0ZW06IER5bmFtaWNWaWV3QnVpbGRlckZ1bmN0aW9uXG4pOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRGdW5jdGlvbiA9IGl0ZW0uZnVuY3Rpb25OYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgY29uc3QgYXJndW1lbnQgPSByZXNvbHZlQ29sdW1uU3FsKGN0eCwgaXRlbS5jb2x1bW4pO1xuICAgIGNvbnN0IGFsaWFzID0gaXRlbS5hbGlhcz8udHJpbSgpO1xuICAgIHJldHVybiBhbGlhc1xuICAgICAgICA/IGAke25vcm1hbGl6ZWRGdW5jdGlvbn0oJHthcmd1bWVudH0pIEFTICR7YWxpYXN9YFxuICAgICAgICA6IGAke25vcm1hbGl6ZWRGdW5jdGlvbn0oJHthcmd1bWVudH0pYDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgU1FMIGZyYWdtZW50IGZvciBhIGZpZWxkIChjb2x1bW4gb3IgZnVuY3Rpb24gZXhwcmVzc2lvbikgaW4gdGhlIFNFTEVDVCBsaXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZpZWxkU3FsKFxuICAgIGN0eDogU3FsQ29udGV4dCxcbiAgICBmaWVsZDogc3RyaW5nIHwgRHluYW1pY1ZpZXdCdWlsZGVyRmllbGRcbik6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEZpZWxkID0gbm9ybWFsaXplR2VuZXJhdGVkRmllbGQoZmllbGQpO1xuICAgIGNvbnN0IGZpZWxkU3FsID0gcmVzb2x2ZUNvbHVtblNxbChjdHgsIG5vcm1hbGl6ZWRGaWVsZC5jb2x1bW4pO1xuICAgIGlmIChub3JtYWxpemVkRmllbGQuZnVuY3Rpb24/LmZ1bmN0aW9uTmFtZSkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZUZ1bmN0aW9uU3FsKGN0eCwge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBub3JtYWxpemVkRmllbGQuZnVuY3Rpb24uZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgY29sdW1uOiBub3JtYWxpemVkRmllbGQuY29sdW1uLFxuICAgICAgICAgICAgYWxpYXM6XG4gICAgICAgICAgICAgICAgbm9ybWFsaXplZEZpZWxkLmZ1bmN0aW9uLmFsaWFzPy50cmltKCkgfHwgLy8gTk9TT05BUlxuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRGaWVsZC5hbGlhcz8udHJpbSgpIHx8IC8vIE5PU09OQVJcbiAgICAgICAgICAgICAgICBFTVBUWV9WQUxVRSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGFsaWFzID0gbm9ybWFsaXplZEZpZWxkLmFsaWFzPy50cmltKCk7XG4gICAgcmV0dXJuIGFsaWFzID8gYCR7ZmllbGRTcWx9IEFTICR7YWxpYXN9YCA6IGZpZWxkU3FsO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBTUUwgZnJhZ21lbnQgZm9yIGEgc29ydCBpdGVtIChjb2x1bW4gb3IgZnVuY3Rpb24gZXhwcmVzc2lvbikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU29ydFNxbChjdHg6IFNxbENvbnRleHQsIGl0ZW06IER5bmFtaWNWaWV3QnVpbGRlclNvcnQpOiBzdHJpbmcge1xuICAgIGlmICghaXRlbS5mdW5jdGlvbk5hbWU/LnRyaW0oKSkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZUNvbHVtblNxbChjdHgsIGl0ZW0uY29sdW1uKTtcbiAgICB9XG4gICAgcmV0dXJuIGAke2l0ZW0uZnVuY3Rpb25OYW1lLnRyaW0oKS50b1VwcGVyQ2FzZSgpfSgke3Jlc29sdmVDb2x1bW5TcWwoY3R4LCBpdGVtLmNvbHVtbil9KWA7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIFNRTCBjb21wYXJpc29uIG9wZXJhdG9yIHN0cmluZyBmb3IgYSBmaWx0ZXIgb3BlcmF0b3Iga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZpbHRlck9wZXJhdG9yU3FsKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICAgICh7XG4gICAgICAgICAgICBFUVVBTDogXCI9XCIsXG4gICAgICAgICAgICBOT1RfRVFVQUw6IFwiPD5cIixcbiAgICAgICAgICAgIEdSRUFURVI6IFwiPlwiLFxuICAgICAgICAgICAgR1JFQVRFUl9USEFOOiBcIj5cIixcbiAgICAgICAgICAgIEdSRUFURVJfT1JfRVFVQUw6IFwiPj1cIixcbiAgICAgICAgICAgIEdSRUFURVJfVEhBTl9PUl9FUVVBTDogXCI+PVwiLFxuICAgICAgICAgICAgTEVTUzogXCI8XCIsXG4gICAgICAgICAgICBMRVNTX1RIQU46IFwiPFwiLFxuICAgICAgICAgICAgTEVTU19PUl9FUVVBTDogXCI8PVwiLFxuICAgICAgICAgICAgTEVTU19USEFOX09SX0VRVUFMOiBcIjw9XCIsXG4gICAgICAgICAgICBDT05UQUlOUzogXCJMSUtFXCIsXG4gICAgICAgICAgICBET0VTX05PVF9DT05UQUlOOiBcIk5PVCBMSUtFXCIsXG4gICAgICAgICAgICBTVEFSVFNfV0lUSDogXCJMSUtFXCIsXG4gICAgICAgICAgICBFTkRTX1dJVEg6IFwiTElLRVwiLFxuICAgICAgICB9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pW3ZhbHVlXSA/PyB2YWx1ZVxuICAgICk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIFNRTCB2YWx1ZSBmcmFnbWVudCBmb3IgYSBmaWx0ZXIsIGFwcGx5aW5nIHF1b3RpbmcgYW5kIExJS0UgZGVjb3JhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGaWx0ZXJWYWx1ZVNxbChcbiAgICBjdHg6IFNxbENvbnRleHQsXG4gICAgY29sdW1uVmFsdWU6IHN0cmluZyxcbiAgICBvcGVyYXRvcjogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duXG4pOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gU3RyaW5nKHZhbHVlID8/IEVNUFRZX1ZBTFVFKTtcbiAgICBjb25zdCBjb2x1bW4gPSByZXNvbHZlQ29sdW1uT3B0aW9uKGN0eCwgY29sdW1uVmFsdWUpO1xuICAgIGlmIChjb2x1bW4/LmRhdGFUeXBlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCIgPyBcIlRSVUVcIiA6IFwiRkFMU0VcIjtcbiAgICB9XG4gICAgaWYgKGlzTnVtZXJpY1R5cGUoY29sdW1uPy5kYXRhVHlwZSkgJiYgc3RyaW5nVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1ZhbHVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAgIFtcIkNPTlRBSU5TXCIsIFwiRE9FU19OT1RfQ09OVEFJTlwiLCBcIlNUQVJUU19XSVRIXCIsIFwiRU5EU19XSVRIXCJdLmluY2x1ZGVzKG9wZXJhdG9yKVxuICAgICkge1xuICAgICAgICByZXR1cm4gcXVvdGVTcWxWYWx1ZShkZWNvcmF0ZUxpa2VWYWx1ZShvcGVyYXRvciwgc3RyaW5nVmFsdWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHF1b3RlU3FsVmFsdWUoc3RyaW5nVmFsdWUpO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBmdWxsIFNRTCBmcmFnbWVudCBmb3IgYSBzaW5nbGUgZmlsdGVyIGNvbmRpdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGaWx0ZXJTcWwoIC8vIE5PU09OQVIgLSBjb21wbGV4aXR5OiBleHRyYWN0aW9uIHdvdWxkIHJpc2sgYmVoYXZpb3IgY2hhbmdlXG4gICAgY3R4OiBTcWxDb250ZXh0LFxuICAgIGZpbHRlcjogRHluYW1pY1ZpZXdCdWlsZGVyRmlsdGVyXG4pOiBzdHJpbmcge1xuICAgIGlmIChmaWx0ZXIudmFsdWVUeXBlID09PSBGSUxURVJfTU9ERV9ET01BSU4pIHtcbiAgICAgICAgcmV0dXJuIGAoJHtmaWx0ZXIuZG9tYWluRXhwcmVzc2lvbiA/PyBFTVBUWV9WQUxVRX0pYDtcbiAgICB9XG4gICAgY29uc3QgZmllbGQgPSByZXNvbHZlQ29sdW1uU3FsKGN0eCwgZmlsdGVyLmNvbHVtbik7XG4gICAgaWYgKCFmaWVsZCkge1xuICAgICAgICByZXR1cm4gRU1QVFlfVkFMVUU7XG4gICAgfVxuICAgIGlmIChmaWx0ZXIub3BlcmF0b3IgPT09IFwiRU1QVFlcIikge1xuICAgICAgICByZXR1cm4gYCR7ZmllbGR9IElTIE5VTExgO1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLm9wZXJhdG9yID09PSBcIk5PVF9FTVBUWVwiKSB7XG4gICAgICAgIHJldHVybiBgJHtmaWVsZH0gSVMgTk9UIE5VTExgO1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLm9wZXJhdG9yID09PSBcIklOXCIpIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gKGZpbHRlci52YWx1ZXMgPz8gW10pLm1hcCgoaXRlbSkgPT5cbiAgICAgICAgICAgIHJlc29sdmVGaWx0ZXJWYWx1ZVNxbChjdHgsIGZpbHRlci5jb2x1bW4sIGZpbHRlci5vcGVyYXRvciwgaXRlbSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGAke2ZpZWxkfSBJTiAoJHt2YWx1ZXMuam9pbihcIiwgXCIpfSlgO1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLm9wZXJhdG9yID09PSBcIkJFVFdFRU5cIikge1xuICAgICAgICByZXR1cm4gYCR7ZmllbGR9IEJFVFdFRU4gJHtyZXNvbHZlRmlsdGVyVmFsdWVTcWwoXG4gICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICBmaWx0ZXIuY29sdW1uLFxuICAgICAgICAgICAgZmlsdGVyLm9wZXJhdG9yLFxuICAgICAgICAgICAgZmlsdGVyLnZhbHVlcz8uWzBdXG4gICAgICAgICl9IEFORCAke3Jlc29sdmVGaWx0ZXJWYWx1ZVNxbChcbiAgICAgICAgICAgIGN0eCxcbiAgICAgICAgICAgIGZpbHRlci5jb2x1bW4sXG4gICAgICAgICAgICBmaWx0ZXIub3BlcmF0b3IsXG4gICAgICAgICAgICBmaWx0ZXIudmFsdWVzPy5bMV1cbiAgICAgICAgKX1gO1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLnZhbHVlVHlwZSA9PT0gXCJwYXJhbWV0ZXJcIikge1xuICAgICAgICByZXR1cm4gYCR7ZmllbGR9ICR7cmVzb2x2ZUZpbHRlck9wZXJhdG9yU3FsKFxuICAgICAgICAgICAgZmlsdGVyLm9wZXJhdG9yXG4gICAgICAgICl9IDoke2ZpbHRlci5wYXJhbWV0ZXJOYW1lID8/IEVNUFRZX1ZBTFVFfWA7XG4gICAgfVxuICAgIHJldHVybiBgJHtmaWVsZH0gJHtyZXNvbHZlRmlsdGVyT3BlcmF0b3JTcWwoZmlsdGVyLm9wZXJhdG9yKX0gJHtyZXNvbHZlRmlsdGVyVmFsdWVTcWwoXG4gICAgICAgIGN0eCxcbiAgICAgICAgZmlsdGVyLmNvbHVtbixcbiAgICAgICAgZmlsdGVyLm9wZXJhdG9yLFxuICAgICAgICBmaWx0ZXIudmFsdWVcbiAgICApfWA7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVKb2luT3BlcmF0b3JTcWwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgKHtcbiAgICAgICAgICAgIEVRVUFMUzogXCI9XCIsXG4gICAgICAgICAgICBOT1RfRVFVQUxTOiBcIjw+XCIsXG4gICAgICAgIH0gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPilbdmFsdWVdID8/IHZhbHVlXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUpvaW5lZFRhYmxlU3FsKGN0eDogU3FsQ29udGV4dCwgaXRlbTogRHluYW1pY1ZpZXdCdWlsZGVySm9pbik6IHN0cmluZyB7XG4gICAgY29uc3QgdGFyZ2V0Q29sdW1uID0gcmVzb2x2ZUNvbHVtbk9wdGlvbihjdHgsIGl0ZW0udGFyZ2V0Q29sdW1uKTtcbiAgICBpZiAoIXRhcmdldENvbHVtbikge1xuICAgICAgICByZXR1cm4gRU1QVFlfVkFMVUU7XG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZSA9IGN0eC5zb3VyY2VzLmZpbmQoKGVudHJ5KSA9PiBlbnRyeS50YWJsZSA9PT0gdGFyZ2V0Q29sdW1uLnRhYmxlKTtcbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICByZXR1cm4gRU1QVFlfVkFMVUU7XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlU291cmNlU3FsKGN0eCwgc291cmNlKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgZnVsbCBTUUwgZnJhZ21lbnQgZm9yIGEgSk9JTiBjbGF1c2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSm9pblNxbChjdHg6IFNxbENvbnRleHQsIGl0ZW06IER5bmFtaWNWaWV3QnVpbGRlckpvaW4pOiBzdHJpbmcge1xuICAgIHJldHVybiBgSk9JTiAke3Jlc29sdmVKb2luZWRUYWJsZVNxbChjdHgsIGl0ZW0pfSBPTiAke3Jlc29sdmVDb2x1bW5TcWwoXG4gICAgICAgIGN0eCxcbiAgICAgICAgaXRlbS5zb3VyY2VDb2x1bW5cbiAgICApfSAke3Jlc29sdmVKb2luT3BlcmF0b3JTcWwoaXRlbS5vcGVyYXRvcil9ICR7cmVzb2x2ZUNvbHVtblNxbChjdHgsIGl0ZW0udGFyZ2V0Q29sdW1uKX1gO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgV0hFUkUgY2xhdXNlIGxpbmVzIGZvciBhIGxpc3Qgb2YgZmlsdGVycy5cbiAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgd2hlbiBubyBmaWx0ZXJzIGFyZSBwcm92aWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkV2hlcmVTcWwoXG4gICAgY3R4OiBTcWxDb250ZXh0LFxuICAgIGZpbHRlcnM6IER5bmFtaWNWaWV3QnVpbGRlckZpbHRlcltdXG4pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXhwcmVzc2lvbnMgPSBmaWx0ZXJzXG4gICAgICAgIC5tYXAoKGZpbHRlciwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3RvciA9IGluZGV4ID09PSAwID8gXCJXSEVSRVwiIDogZmlsdGVyLmNvbm5lY3RvcjtcbiAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvblNxbCA9IHJlc29sdmVGaWx0ZXJTcWwoY3R4LCBmaWx0ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvblNxbCAhPT0gRU1QVFlfVkFMVUUgPyBgICAke2Nvbm5lY3Rvcn0gJHtjb25kaXRpb25TcWx9YCA6IEVNUFRZX1ZBTFVFO1xuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSBFTVBUWV9WQUxVRSk7XG4gICAgcmV0dXJuIGV4cHJlc3Npb25zLmxlbmd0aCA/IGV4cHJlc3Npb25zIDogW107XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBHUk9VUCBCWSBjbGF1c2UgbGluZXMgZm9yIGEgbGlzdCBvZiBjb2x1bW4gaWRlbnRpZmllcnMuXG4gKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IHdoZW4gZ3JvdXBCeSBpcyBlbXB0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkR3JvdXBCeVNxbChjdHg6IFNxbENvbnRleHQsIGdyb3VwQnk6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIGlmICghZ3JvdXBCeS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgICBcIkdST1VQIEJZXCIsXG4gICAgICAgIGAgICR7Z3JvdXBCeS5tYXAoKGl0ZW0pID0+IHJlc29sdmVDb2x1bW5TcWwoY3R4LCBpdGVtKSkuam9pbihcIixcXG4gIFwiKX1gLFxuICAgIF07XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBPUkRFUiBCWSBjbGF1c2UgbGluZXMgZm9yIGEgbGlzdCBvZiBzb3J0IGl0ZW1zLlxuICogUmV0dXJucyBhbiBlbXB0eSBhcnJheSB3aGVuIHNvcnRpbmcgaXMgZW1wdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE9yZGVyQnlTcWwoXG4gICAgY3R4OiBTcWxDb250ZXh0LFxuICAgIHNvcnRpbmc6IER5bmFtaWNWaWV3QnVpbGRlclNvcnRbXVxuKTogc3RyaW5nW10ge1xuICAgIGlmICghc29ydGluZy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgICBcIk9SREVSIEJZXCIsXG4gICAgICAgIGAgICR7c29ydGluZ1xuICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4gYCR7cmVzb2x2ZVNvcnRTcWwoY3R4LCBpdGVtKX0gJHtpdGVtLmRpcmVjdGlvbn1gKVxuICAgICAgICAgICAgLmpvaW4oXCIsXFxuICBcIil9YCxcbiAgICBdO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY29tcGxldGUgZ2VuZXJhdGVkIFNRTCBzdHJpbmcgZnJvbSB0aGUgcHJvdmlkZWQgY29uZmlnIGRhdGEuXG4gKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyB3aGVuIHNvdXJjZXMgaXMgZW1wdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEdlbmVyYXRlZFNxbChcbiAgICBzb3VyY2VzOiBEeW5hbWljVmlld0J1aWxkZXJTb3VyY2VbXSxcbiAgICBub3JtYWxpemVkRmllbGRzOiBEeW5hbWljVmlld0J1aWxkZXJGaWVsZFtdLFxuICAgIGpvaW5zOiBEeW5hbWljVmlld0J1aWxkZXJKb2luW10sXG4gICAgZmlsdGVyczogRHluYW1pY1ZpZXdCdWlsZGVyRmlsdGVyW10sXG4gICAgZ3JvdXBCeTogc3RyaW5nW10sXG4gICAgc29ydGluZzogRHluYW1pY1ZpZXdCdWlsZGVyU29ydFtdLFxuICAgIGN0eDogU3FsQ29udGV4dFxuKTogc3RyaW5nIHtcbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBFTVBUWV9WQUxVRTtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0UGFydHMgPSBub3JtYWxpemVkRmllbGRzXG4gICAgICAgIC5tYXAoKGZpZWxkKSA9PiByZXNvbHZlRmllbGRTcWwoY3R4LCBmaWVsZCkpXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3Qgc3FsID0gW1xuICAgICAgICBcIlNFTEVDVFwiLFxuICAgICAgICBgICAkeyhzZWxlY3RQYXJ0cy5sZW5ndGggPyBzZWxlY3RQYXJ0cyA6IFtcIipcIl0pLmpvaW4oXCIsXFxuICBcIil9YCxcbiAgICAgICAgYEZST00gJHtyZXNvbHZlU291cmNlU3FsKGN0eCwgc291cmNlc1swXSl9YCxcbiAgICAgICAgLi4uam9pbnMubWFwKChpdGVtKSA9PiByZXNvbHZlSm9pblNxbChjdHgsIGl0ZW0pKSxcbiAgICAgICAgLi4uYnVpbGRXaGVyZVNxbChjdHgsIGZpbHRlcnMpLFxuICAgICAgICAuLi5idWlsZEdyb3VwQnlTcWwoY3R4LCBncm91cEJ5KSxcbiAgICAgICAgLi4uYnVpbGRPcmRlckJ5U3FsKGN0eCwgc29ydGluZyksXG4gICAgXTtcbiAgICByZXR1cm4gc3FsLmpvaW4oXCJcXG5cIik7XG59XG4iXX0=
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalizes a string for search comparison by removing diacritics,
|
|
3
|
+
* converting to lowercase and trimming whitespace.
|
|
4
|
+
*/
|
|
5
|
+
export function normalize(value) {
|
|
6
|
+
return (value ?? "")
|
|
7
|
+
.normalize("NFD")
|
|
8
|
+
.replace(/[\u0300-\u036f]/g, "")
|
|
9
|
+
.toLowerCase()
|
|
10
|
+
.trim();
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Converts a string to a slug by normalizing and replacing non-alphanumeric
|
|
14
|
+
* characters with underscores, then trimming leading/trailing underscores.
|
|
15
|
+
*/
|
|
16
|
+
export function slugify(value) {
|
|
17
|
+
const normalized = normalize(value).replace(/[^a-z0-9]+/g, "_");
|
|
18
|
+
let start = 0;
|
|
19
|
+
let end = normalized.length;
|
|
20
|
+
while (start < end && normalized.charAt(start) === "_") {
|
|
21
|
+
start += 1;
|
|
22
|
+
}
|
|
23
|
+
while (end > start && normalized.charAt(end - 1) === "_") {
|
|
24
|
+
end -= 1;
|
|
25
|
+
}
|
|
26
|
+
return normalized.slice(start, end);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Deduplicates an array of items by a key resolved from each item.
|
|
30
|
+
* Preserves the last occurrence of each key.
|
|
31
|
+
*/
|
|
32
|
+
export function deduplicateByKey(items, keyResolver) {
|
|
33
|
+
const map = new Map();
|
|
34
|
+
items.forEach((item) => map.set(keyResolver(item), item));
|
|
35
|
+
return Array.from(map.values());
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsLXNxbC1lZGl0b3ItdGV4dC51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy92aXN1YWwtc3FsLWVkaXRvci91dGlscy92aXN1YWwtc3FsLWVkaXRvci10ZXh0LnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxLQUFhO0lBQ25DLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1NBQ2YsU0FBUyxDQUFDLEtBQUssQ0FBQztTQUNoQixPQUFPLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO1NBQy9CLFdBQVcsRUFBRTtTQUNiLElBQUksRUFBRSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUFDLEtBQWE7SUFDakMsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsSUFBSSxHQUFHLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUU1QixPQUFPLEtBQUssR0FBRyxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNyRCxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUVELE9BQU8sR0FBRyxHQUFHLEtBQUssSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUN2RCxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDNUIsS0FBVSxFQUNWLFdBQWdDO0lBRWhDLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUFhLENBQUM7SUFDakMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMxRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTm9ybWFsaXplcyBhIHN0cmluZyBmb3Igc2VhcmNoIGNvbXBhcmlzb24gYnkgcmVtb3ZpbmcgZGlhY3JpdGljcyxcbiAqIGNvbnZlcnRpbmcgdG8gbG93ZXJjYXNlIGFuZCB0cmltbWluZyB3aGl0ZXNwYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAodmFsdWUgPz8gXCJcIilcbiAgICAgICAgLm5vcm1hbGl6ZShcIk5GRFwiKVxuICAgICAgICAucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgXCJcIilcbiAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyB0byBhIHNsdWcgYnkgbm9ybWFsaXppbmcgYW5kIHJlcGxhY2luZyBub24tYWxwaGFudW1lcmljXG4gKiBjaGFyYWN0ZXJzIHdpdGggdW5kZXJzY29yZXMsIHRoZW4gdHJpbW1pbmcgbGVhZGluZy90cmFpbGluZyB1bmRlcnNjb3Jlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsdWdpZnkodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZSh2YWx1ZSkucmVwbGFjZSgvW15hLXowLTldKy9nLCBcIl9cIik7XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBsZXQgZW5kID0gbm9ybWFsaXplZC5sZW5ndGg7XG5cbiAgICB3aGlsZSAoc3RhcnQgPCBlbmQgJiYgbm9ybWFsaXplZC5jaGFyQXQoc3RhcnQpID09PSBcIl9cIikge1xuICAgICAgICBzdGFydCArPSAxO1xuICAgIH1cblxuICAgIHdoaWxlIChlbmQgPiBzdGFydCAmJiBub3JtYWxpemVkLmNoYXJBdChlbmQgLSAxKSA9PT0gXCJfXCIpIHtcbiAgICAgICAgZW5kIC09IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQuc2xpY2Uoc3RhcnQsIGVuZCk7XG59XG5cbi8qKlxuICogRGVkdXBsaWNhdGVzIGFuIGFycmF5IG9mIGl0ZW1zIGJ5IGEga2V5IHJlc29sdmVkIGZyb20gZWFjaCBpdGVtLlxuICogUHJlc2VydmVzIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgZWFjaCBrZXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWR1cGxpY2F0ZUJ5S2V5PFQ+KFxuICAgIGl0ZW1zOiBUW10sXG4gICAga2V5UmVzb2x2ZXI6IChpdGVtOiBUKSA9PiBzdHJpbmdcbik6IFRbXSB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIFQ+KCk7XG4gICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4gbWFwLnNldChrZXlSZXNvbHZlcihpdGVtKSwgaXRlbSkpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKG1hcC52YWx1ZXMoKSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { DEFAULT_MODAL_Z_INDEX } from "../../../core/constants/modal.const";
|
|
2
|
+
export const EMPTY_VALUE = "";
|
|
3
|
+
export const DEFAULT_JOIN_OPERATOR = "EQUALS";
|
|
4
|
+
export const DEFAULT_FUNCTION_NAME = "count";
|
|
5
|
+
export const DEFAULT_SORT_DIRECTION = "ASC";
|
|
6
|
+
export const EMPTY_SORT_FUNCTION = "__base__";
|
|
7
|
+
export const FLOW_ARROW_INSET = 3;
|
|
8
|
+
export const FLOW_ARROW_MIN_GAP = 12;
|
|
9
|
+
export const FLOW_ARROWS_REFRESH_DELAY_MS = 120;
|
|
10
|
+
export const DEFAULT_FILTER_OPERATOR = "EQUAL";
|
|
11
|
+
export const DEFAULT_FILTER_CONNECTOR = "AND";
|
|
12
|
+
export const DEFAULT_FILTER_VALUE_TYPE = "value";
|
|
13
|
+
export const FILTER_MODE_DOMAIN = "domain";
|
|
14
|
+
export const OVERLAY_APPEND_TARGET = "body";
|
|
15
|
+
export const MODAL_Z_INDEX_OFFSET = 20;
|
|
16
|
+
export const MODAL_OVERLAY_Z_INDEX = DEFAULT_MODAL_Z_INDEX + MODAL_Z_INDEX_OFFSET;
|
|
17
|
+
export const FIELD_PICKLIST_ROWS = 8;
|
|
18
|
+
export const FILTER_PICKLIST_ROWS = 9;
|
|
19
|
+
export const VISUAL_SQL_TABLE_COLOR = "#425466";
|
|
20
|
+
export const VISUAL_SQL_FIELD_COLOR = "#1f8a52";
|
|
21
|
+
export const PICKLIST_DATA_TYPE_BADGE_COLOR = "gray";
|
|
22
|
+
export const PICKLIST_FUNCTION_BADGE_COLOR = "blue";
|
|
23
|
+
export const FALLBACK_SELECT_TABLES = "Selecionar tabelas";
|
|
24
|
+
export const FALLBACK_EMPTY_SELECTION = "Nenhum selecionado";
|
|
25
|
+
const PREVIEW_ROWS_PER_PAGE_SMALL = 5;
|
|
26
|
+
const PREVIEW_ROWS_PER_PAGE_MEDIUM = 10;
|
|
27
|
+
const PREVIEW_ROWS_PER_PAGE_LARGE = 20;
|
|
28
|
+
export const PREVIEW_ROWS_PER_PAGE_OPTIONS = [
|
|
29
|
+
PREVIEW_ROWS_PER_PAGE_SMALL,
|
|
30
|
+
PREVIEW_ROWS_PER_PAGE_MEDIUM,
|
|
31
|
+
PREVIEW_ROWS_PER_PAGE_LARGE,
|
|
32
|
+
];
|
|
33
|
+
export const ALIAS_MAX_LENGTH = 12;
|
|
34
|
+
export const MIN_PARTS_FOR_DB = 3;
|
|
35
|
+
export const DB_PARTS_OFFSET = -2;
|
|
36
|
+
export const MIN_PARTS_FOR_TABLE = 2;
|
|
37
|
+
export const JOIN_OPERATOR_LABELS = {
|
|
38
|
+
EQUALS: {
|
|
39
|
+
key: "joinOperators.equals",
|
|
40
|
+
fallback: "Igual a (=)",
|
|
41
|
+
},
|
|
42
|
+
NOT_EQUALS: {
|
|
43
|
+
key: "joinOperators.notEquals",
|
|
44
|
+
fallback: "Diferente de (<>)",
|
|
45
|
+
},
|
|
46
|
+
GREATER_THAN: {
|
|
47
|
+
key: "joinOperators.greaterThan",
|
|
48
|
+
fallback: "Maior que (>)",
|
|
49
|
+
},
|
|
50
|
+
GREATER_THAN_OR_EQUAL: {
|
|
51
|
+
key: "joinOperators.greaterThanOrEqual",
|
|
52
|
+
fallback: "Maior ou igual a (>=)",
|
|
53
|
+
},
|
|
54
|
+
LESS_THAN: {
|
|
55
|
+
key: "joinOperators.lessThan",
|
|
56
|
+
fallback: "Menor que (<)",
|
|
57
|
+
},
|
|
58
|
+
LESS_THAN_OR_EQUAL: {
|
|
59
|
+
key: "joinOperators.lessThanOrEqual",
|
|
60
|
+
fallback: "Menor ou igual a (<=)",
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
export const DYNAMIC_MODAL_DIMENSIONS = {
|
|
64
|
+
source: {
|
|
65
|
+
width: "64rem",
|
|
66
|
+
height: "40rem",
|
|
67
|
+
},
|
|
68
|
+
selection: {
|
|
69
|
+
width: "64rem",
|
|
70
|
+
height: "40rem",
|
|
71
|
+
},
|
|
72
|
+
join: {
|
|
73
|
+
width: "70rem",
|
|
74
|
+
height: "40rem",
|
|
75
|
+
},
|
|
76
|
+
sort: {
|
|
77
|
+
width: "56rem",
|
|
78
|
+
height: "34rem",
|
|
79
|
+
},
|
|
80
|
+
filter: {
|
|
81
|
+
width: "68rem",
|
|
82
|
+
height: "55rem",
|
|
83
|
+
},
|
|
84
|
+
field: {
|
|
85
|
+
width: "68rem",
|
|
86
|
+
height: "42rem",
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsLXNxbC1lZGl0b3IuY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy92aXN1YWwtc3FsLWVkaXRvci91dGlscy92aXN1YWwtc3FsLWVkaXRvci5jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFPNUUsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUM5QixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxRQUFRLENBQUM7QUFDOUMsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsT0FBTyxDQUFDO0FBQzdDLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQztBQUM1QyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxVQUFVLENBQUM7QUFDOUMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUNyQyxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxHQUFHLENBQUM7QUFDaEQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsT0FBTyxDQUFDO0FBQy9DLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFzQyxLQUFLLENBQUM7QUFDakYsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQXNDLE9BQU8sQ0FBQztBQUNwRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUM7QUFDM0MsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDO0FBQzVDLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztBQUN2QyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxxQkFBcUIsR0FBRyxvQkFBb0IsQ0FBQztBQUNsRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLFNBQVMsQ0FBQztBQUNoRCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxTQUFTLENBQUM7QUFDaEQsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQWUsTUFBTSxDQUFDO0FBQ2pFLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFlLE1BQU0sQ0FBQztBQUNoRSxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxvQkFBb0IsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxvQkFBb0IsQ0FBQztBQUM3RCxNQUFNLDJCQUEyQixHQUFHLENBQUMsQ0FBQztBQUN0QyxNQUFNLDRCQUE0QixHQUFHLEVBQUUsQ0FBQztBQUN4QyxNQUFNLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztBQUN2QyxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRztJQUN6QywyQkFBMkI7SUFDM0IsNEJBQTRCO0lBQzVCLDJCQUEyQjtDQUM5QixDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUNsQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbEMsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBQ3JDLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFzRDtJQUNuRixNQUFNLEVBQUU7UUFDSixHQUFHLEVBQUUsc0JBQXNCO1FBQzNCLFFBQVEsRUFBRSxhQUFhO0tBQzFCO0lBQ0QsVUFBVSxFQUFFO1FBQ1IsR0FBRyxFQUFFLHlCQUF5QjtRQUM5QixRQUFRLEVBQUUsbUJBQW1CO0tBQ2hDO0lBQ0QsWUFBWSxFQUFFO1FBQ1YsR0FBRyxFQUFFLDJCQUEyQjtRQUNoQyxRQUFRLEVBQUUsZUFBZTtLQUM1QjtJQUNELHFCQUFxQixFQUFFO1FBQ25CLEdBQUcsRUFBRSxrQ0FBa0M7UUFDdkMsUUFBUSxFQUFFLHVCQUF1QjtLQUNwQztJQUNELFNBQVMsRUFBRTtRQUNQLEdBQUcsRUFBRSx3QkFBd0I7UUFDN0IsUUFBUSxFQUFFLGVBQWU7S0FDNUI7SUFDRCxrQkFBa0IsRUFBRTtRQUNoQixHQUFHLEVBQUUsK0JBQStCO1FBQ3BDLFFBQVEsRUFBRSx1QkFBdUI7S0FDcEM7Q0FDSixDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQThCO0lBQy9ELE1BQU0sRUFBRTtRQUNKLEtBQUssRUFBRSxPQUFPO1FBQ2QsTUFBTSxFQUFFLE9BQU87S0FDbEI7SUFDRCxTQUFTLEVBQUU7UUFDUCxLQUFLLEVBQUUsT0FBTztRQUNkLE1BQU0sRUFBRSxPQUFPO0tBQ2xCO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsS0FBSyxFQUFFLE9BQU87UUFDZCxNQUFNLEVBQUUsT0FBTztLQUNsQjtJQUNELElBQUksRUFBRTtRQUNGLEtBQUssRUFBRSxPQUFPO1FBQ2QsTUFBTSxFQUFFLE9BQU87S0FDbEI7SUFDRCxNQUFNLEVBQUU7UUFDSixLQUFLLEVBQUUsT0FBTztRQUNkLE1BQU0sRUFBRSxPQUFPO0tBQ2xCO0lBQ0QsS0FBSyxFQUFFO1FBQ0gsS0FBSyxFQUFFLE9BQU87UUFDZCxNQUFNLEVBQUUsT0FBTztLQUNsQjtDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJhZGdlQ29sb3IgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS90eXBlcy9iYWRnZS50eXBlXCI7XG5pbXBvcnQgeyBERUZBVUxUX01PREFMX1pfSU5ERVggfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9jb25zdGFudHMvbW9kYWwuY29uc3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgICBEeW5hbWljVmlld0J1aWxkZXJGaWx0ZXJDb25uZWN0b3IsXG4gICAgRHluYW1pY1ZpZXdCdWlsZGVyRmlsdGVyVmFsdWVUeXBlLFxufSBmcm9tIFwiLi4vLi4vLi4vY29yZS90eXBlcy9keW5hbWljLXZpZXctYnVpbGRlci50eXBlXCI7XG5pbXBvcnQgdHlwZSB7IER5bmFtaWNNb2RhbERpbWVuc2lvbnNNYXAgfSBmcm9tIFwiLi4vdHlwZXMvdmlzdWFsLXNxbC1lZGl0b3IudHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IEVNUFRZX1ZBTFVFID0gXCJcIjtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0pPSU5fT1BFUkFUT1IgPSBcIkVRVUFMU1wiO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRlVOQ1RJT05fTkFNRSA9IFwiY291bnRcIjtcbmV4cG9ydCBjb25zdCBERUZBVUxUX1NPUlRfRElSRUNUSU9OID0gXCJBU0NcIjtcbmV4cG9ydCBjb25zdCBFTVBUWV9TT1JUX0ZVTkNUSU9OID0gXCJfX2Jhc2VfX1wiO1xuZXhwb3J0IGNvbnN0IEZMT1dfQVJST1dfSU5TRVQgPSAzO1xuZXhwb3J0IGNvbnN0IEZMT1dfQVJST1dfTUlOX0dBUCA9IDEyO1xuZXhwb3J0IGNvbnN0IEZMT1dfQVJST1dTX1JFRlJFU0hfREVMQVlfTVMgPSAxMjA7XG5leHBvcnQgY29uc3QgREVGQVVMVF9GSUxURVJfT1BFUkFUT1IgPSBcIkVRVUFMXCI7XG5leHBvcnQgY29uc3QgREVGQVVMVF9GSUxURVJfQ09OTkVDVE9SOiBEeW5hbWljVmlld0J1aWxkZXJGaWx0ZXJDb25uZWN0b3IgPSBcIkFORFwiO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRklMVEVSX1ZBTFVFX1RZUEU6IER5bmFtaWNWaWV3QnVpbGRlckZpbHRlclZhbHVlVHlwZSA9IFwidmFsdWVcIjtcbmV4cG9ydCBjb25zdCBGSUxURVJfTU9ERV9ET01BSU4gPSBcImRvbWFpblwiO1xuZXhwb3J0IGNvbnN0IE9WRVJMQVlfQVBQRU5EX1RBUkdFVCA9IFwiYm9keVwiO1xuZXhwb3J0IGNvbnN0IE1PREFMX1pfSU5ERVhfT0ZGU0VUID0gMjA7XG5leHBvcnQgY29uc3QgTU9EQUxfT1ZFUkxBWV9aX0lOREVYID0gREVGQVVMVF9NT0RBTF9aX0lOREVYICsgTU9EQUxfWl9JTkRFWF9PRkZTRVQ7XG5leHBvcnQgY29uc3QgRklFTERfUElDS0xJU1RfUk9XUyA9IDg7XG5leHBvcnQgY29uc3QgRklMVEVSX1BJQ0tMSVNUX1JPV1MgPSA5O1xuZXhwb3J0IGNvbnN0IFZJU1VBTF9TUUxfVEFCTEVfQ09MT1IgPSBcIiM0MjU0NjZcIjtcbmV4cG9ydCBjb25zdCBWSVNVQUxfU1FMX0ZJRUxEX0NPTE9SID0gXCIjMWY4YTUyXCI7XG5leHBvcnQgY29uc3QgUElDS0xJU1RfREFUQV9UWVBFX0JBREdFX0NPTE9SOiBCYWRnZUNvbG9yID0gXCJncmF5XCI7XG5leHBvcnQgY29uc3QgUElDS0xJU1RfRlVOQ1RJT05fQkFER0VfQ09MT1I6IEJhZGdlQ29sb3IgPSBcImJsdWVcIjtcbmV4cG9ydCBjb25zdCBGQUxMQkFDS19TRUxFQ1RfVEFCTEVTID0gXCJTZWxlY2lvbmFyIHRhYmVsYXNcIjtcbmV4cG9ydCBjb25zdCBGQUxMQkFDS19FTVBUWV9TRUxFQ1RJT04gPSBcIk5lbmh1bSBzZWxlY2lvbmFkb1wiO1xuY29uc3QgUFJFVklFV19ST1dTX1BFUl9QQUdFX1NNQUxMID0gNTtcbmNvbnN0IFBSRVZJRVdfUk9XU19QRVJfUEFHRV9NRURJVU0gPSAxMDtcbmNvbnN0IFBSRVZJRVdfUk9XU19QRVJfUEFHRV9MQVJHRSA9IDIwO1xuZXhwb3J0IGNvbnN0IFBSRVZJRVdfUk9XU19QRVJfUEFHRV9PUFRJT05TID0gW1xuICAgIFBSRVZJRVdfUk9XU19QRVJfUEFHRV9TTUFMTCxcbiAgICBQUkVWSUVXX1JPV1NfUEVSX1BBR0VfTUVESVVNLFxuICAgIFBSRVZJRVdfUk9XU19QRVJfUEFHRV9MQVJHRSxcbl07XG5leHBvcnQgY29uc3QgQUxJQVNfTUFYX0xFTkdUSCA9IDEyO1xuZXhwb3J0IGNvbnN0IE1JTl9QQVJUU19GT1JfREIgPSAzO1xuZXhwb3J0IGNvbnN0IERCX1BBUlRTX09GRlNFVCA9IC0yO1xuZXhwb3J0IGNvbnN0IE1JTl9QQVJUU19GT1JfVEFCTEUgPSAyO1xuZXhwb3J0IGNvbnN0IEpPSU5fT1BFUkFUT1JfTEFCRUxTOiBSZWNvcmQ8c3RyaW5nLCB7IGtleTogc3RyaW5nOyBmYWxsYmFjazogc3RyaW5nIH0+ID0ge1xuICAgIEVRVUFMUzoge1xuICAgICAgICBrZXk6IFwiam9pbk9wZXJhdG9ycy5lcXVhbHNcIixcbiAgICAgICAgZmFsbGJhY2s6IFwiSWd1YWwgYSAoPSlcIixcbiAgICB9LFxuICAgIE5PVF9FUVVBTFM6IHtcbiAgICAgICAga2V5OiBcImpvaW5PcGVyYXRvcnMubm90RXF1YWxzXCIsXG4gICAgICAgIGZhbGxiYWNrOiBcIkRpZmVyZW50ZSBkZSAoPD4pXCIsXG4gICAgfSxcbiAgICBHUkVBVEVSX1RIQU46IHtcbiAgICAgICAga2V5OiBcImpvaW5PcGVyYXRvcnMuZ3JlYXRlclRoYW5cIixcbiAgICAgICAgZmFsbGJhY2s6IFwiTWFpb3IgcXVlICg+KVwiLFxuICAgIH0sXG4gICAgR1JFQVRFUl9USEFOX09SX0VRVUFMOiB7XG4gICAgICAgIGtleTogXCJqb2luT3BlcmF0b3JzLmdyZWF0ZXJUaGFuT3JFcXVhbFwiLFxuICAgICAgICBmYWxsYmFjazogXCJNYWlvciBvdSBpZ3VhbCBhICg+PSlcIixcbiAgICB9LFxuICAgIExFU1NfVEhBTjoge1xuICAgICAgICBrZXk6IFwiam9pbk9wZXJhdG9ycy5sZXNzVGhhblwiLFxuICAgICAgICBmYWxsYmFjazogXCJNZW5vciBxdWUgKDwpXCIsXG4gICAgfSxcbiAgICBMRVNTX1RIQU5fT1JfRVFVQUw6IHtcbiAgICAgICAga2V5OiBcImpvaW5PcGVyYXRvcnMubGVzc1RoYW5PckVxdWFsXCIsXG4gICAgICAgIGZhbGxiYWNrOiBcIk1lbm9yIG91IGlndWFsIGEgKDw9KVwiLFxuICAgIH0sXG59O1xuZXhwb3J0IGNvbnN0IERZTkFNSUNfTU9EQUxfRElNRU5TSU9OUzogRHluYW1pY01vZGFsRGltZW5zaW9uc01hcCA9IHtcbiAgICBzb3VyY2U6IHtcbiAgICAgICAgd2lkdGg6IFwiNjRyZW1cIixcbiAgICAgICAgaGVpZ2h0OiBcIjQwcmVtXCIsXG4gICAgfSxcbiAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgd2lkdGg6IFwiNjRyZW1cIixcbiAgICAgICAgaGVpZ2h0OiBcIjQwcmVtXCIsXG4gICAgfSxcbiAgICBqb2luOiB7XG4gICAgICAgIHdpZHRoOiBcIjcwcmVtXCIsXG4gICAgICAgIGhlaWdodDogXCI0MHJlbVwiLFxuICAgIH0sXG4gICAgc29ydDoge1xuICAgICAgICB3aWR0aDogXCI1NnJlbVwiLFxuICAgICAgICBoZWlnaHQ6IFwiMzRyZW1cIixcbiAgICB9LFxuICAgIGZpbHRlcjoge1xuICAgICAgICB3aWR0aDogXCI2OHJlbVwiLFxuICAgICAgICBoZWlnaHQ6IFwiNTVyZW1cIixcbiAgICB9LFxuICAgIGZpZWxkOiB7XG4gICAgICAgIHdpZHRoOiBcIjY4cmVtXCIsXG4gICAgICAgIGhlaWdodDogXCI0MnJlbVwiLFxuICAgIH0sXG59O1xuIl19
|