@mediusinc/mng-commons 3.6.0-rc.3 → 3.7.0-rc.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/README.md +6 -5
- package/esm2022/index.mjs +6 -3
- package/esm2022/lib/api/models/filter-param.model.mjs +1 -1
- package/esm2022/lib/api/models/index.mjs +1 -3
- package/esm2022/lib/api/models/query-param.model.mjs +1 -1
- package/esm2022/lib/api/models/query-result.model.mjs +12 -1
- package/esm2022/lib/api/services/api.abstract.service.mjs +2 -2
- package/esm2022/lib/api/services/get-all-api.abstract.service.mjs +1 -1
- package/esm2022/lib/api/utils/index.mjs +2 -2
- package/esm2022/lib/api/utils/object-serializer.util.mjs +53 -137
- package/esm2022/lib/components/action/action.component.mjs +17 -16
- package/esm2022/lib/components/action/editor/action-editor.component.mjs +12 -12
- package/esm2022/lib/components/action/localization/data-language-dropdown.component.mjs +7 -7
- package/esm2022/lib/components/action/models/action-component.model.mjs +1 -1
- package/esm2022/lib/components/action/models/action-confirmation-service.model.mjs +1 -1
- package/esm2022/lib/components/action/models/action-execution.model.mjs +5 -5
- package/esm2022/lib/components/action/route/action-route.component.mjs +6 -6
- package/esm2022/lib/components/form/autocomplete/autocomplete.component.mjs +74 -65
- package/esm2022/lib/components/form/date-range/date-range.component.mjs +6 -7
- package/esm2022/lib/components/form/dropdown/dropdown.component.mjs +39 -39
- package/esm2022/lib/components/form/editor/form-editor.component.mjs +14 -16
- package/esm2022/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.mjs +6 -6
- package/esm2022/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +5 -5
- package/esm2022/lib/components/form/formly/fields/formly-field-custom/formly-custom-field-base.model.mjs +3 -3
- package/esm2022/lib/components/form/formly/fields/formly-field-custom/formly-field-custom.component.mjs +3 -3
- package/esm2022/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +5 -5
- package/esm2022/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +5 -6
- package/esm2022/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +10 -13
- package/esm2022/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +3 -3
- package/esm2022/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +13 -13
- package/esm2022/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +26 -15
- package/esm2022/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +14 -14
- package/esm2022/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +5 -6
- package/esm2022/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +5 -6
- package/esm2022/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +39 -18
- package/esm2022/lib/components/layout/breadcrumb.component.mjs +4 -4
- package/esm2022/lib/components/layout/footer.component.mjs +4 -4
- package/esm2022/lib/components/layout/main-layout.component.mjs +8 -8
- package/esm2022/lib/components/layout/menu-item.component.mjs +8 -8
- package/esm2022/lib/components/layout/menu.component.mjs +7 -7
- package/esm2022/lib/components/layout/services/main-layout.component.service.mjs +4 -4
- package/esm2022/lib/components/layout/topbar-user.component.mjs +9 -9
- package/esm2022/lib/components/layout/topbar.component.mjs +8 -8
- package/esm2022/lib/components/layout/version.component.mjs +11 -11
- package/esm2022/lib/components/layoutV2/breadcrumb.component.mjs +6 -6
- package/esm2022/lib/components/layoutV2/footer.component.mjs +3 -3
- package/esm2022/lib/components/layoutV2/main-layout.component.mjs +14 -11
- package/esm2022/lib/components/layoutV2/menu-item.component.mjs +12 -9
- package/esm2022/lib/components/layoutV2/menu.component.mjs +5 -6
- package/esm2022/lib/components/layoutV2/model/layout-state.model.mjs +1 -1
- package/esm2022/lib/components/layoutV2/services/main-layout.component.service.mjs +30 -21
- package/esm2022/lib/components/layoutV2/services/menu.service.mjs +3 -3
- package/esm2022/lib/components/layoutV2/sidebar.component.mjs +18 -9
- package/esm2022/lib/components/layoutV2/topbar-user.component.mjs +6 -6
- package/esm2022/lib/components/layoutV2/topbar.component.mjs +6 -7
- package/esm2022/lib/components/layoutV2/version.component.mjs +11 -11
- package/esm2022/lib/components/pages/error/error.page.component.mjs +4 -4
- package/esm2022/lib/components/pages/not-found/not-found.page.component.mjs +4 -4
- package/esm2022/lib/components/tableview/index.mjs +1 -2
- package/esm2022/lib/components/tableview/models/table.event.mjs +1 -1
- package/esm2022/lib/components/tableview/route/tableview-route.abstract.component.mjs +18 -18
- package/esm2022/lib/components/tableview/route/tableview-route.component.mjs +5 -5
- package/esm2022/lib/components/tableview/table/column-filter-full/column-filter-full.component.mjs +8 -12
- package/esm2022/lib/components/tableview/table/column-value/column-value.component.mjs +9 -32
- package/esm2022/lib/components/tableview/table/table.component.mjs +20 -25
- package/esm2022/lib/components/tableview/tableview.component.mjs +8 -10
- package/esm2022/lib/data-providers/base.data-provider.mjs +43 -12
- package/esm2022/lib/data-providers/editor.data-provider.mjs +82 -14
- package/esm2022/lib/data-providers/lookup.data-provider.mjs +38 -9
- package/esm2022/lib/data-providers/table.data-provider.mjs +41 -14
- package/esm2022/lib/data-providers/tableview-crud.data-provider.mjs +14 -6
- package/esm2022/lib/data-providers/tableview.data-provider.mjs +89 -29
- package/esm2022/lib/descriptors/action/action-confirmation.descriptor.mjs +2 -2
- package/esm2022/lib/descriptors/action/action-editor.descriptor.mjs +262 -0
- package/esm2022/lib/descriptors/action/action-link.descriptor.mjs +90 -0
- package/esm2022/lib/descriptors/action/action.descriptor.mjs +91 -352
- package/esm2022/lib/descriptors/action/index.mjs +3 -1
- package/esm2022/lib/descriptors/editor/editor.descriptor.mjs +215 -102
- package/esm2022/lib/descriptors/editor/field-action.descriptor.mjs +50 -0
- package/esm2022/lib/descriptors/editor/field-base.descriptor.mjs +293 -0
- package/esm2022/lib/descriptors/editor/field-group.descriptor.mjs +97 -0
- package/esm2022/lib/descriptors/editor/field-lookup.descriptor.mjs +211 -0
- package/esm2022/lib/descriptors/editor/field-many.descriptor.mjs +153 -0
- package/esm2022/lib/descriptors/editor/field.descriptor.mjs +81 -852
- package/esm2022/lib/descriptors/editor/index.mjs +6 -1
- package/esm2022/lib/descriptors/editor/internal/editor-fields.model.mjs +2 -0
- package/esm2022/lib/descriptors/editor/internal/editor.model.mjs +2 -0
- package/esm2022/lib/descriptors/filter/filter-lookup.descriptor.mjs +210 -0
- package/esm2022/lib/descriptors/filter/filter.descriptor.mjs +2 -208
- package/esm2022/lib/descriptors/filter/index.mjs +2 -1
- package/esm2022/lib/descriptors/interfaces/lookup-descriptor.interface.mjs +1 -1
- package/esm2022/lib/descriptors/model/index.mjs +2 -0
- package/esm2022/lib/descriptors/model/model.descriptor.mjs +70 -0
- package/esm2022/lib/descriptors/table/column.descriptor.mjs +38 -49
- package/esm2022/lib/descriptors/table/internal/table-columns.model.mjs +2 -0
- package/esm2022/lib/descriptors/table/internal/table.model.mjs +2 -0
- package/esm2022/lib/descriptors/table/table.descriptor.mjs +143 -124
- package/esm2022/lib/descriptors/tableview/internal/tableview.model.mjs +2 -0
- package/esm2022/lib/descriptors/tableview/tableview.descriptor.mjs +240 -131
- package/esm2022/lib/directives/component.directive.mjs +11 -11
- package/esm2022/lib/directives/dialog-keydown-handler.directive.mjs +3 -3
- package/esm2022/lib/directives/template.directive.mjs +9 -9
- package/esm2022/lib/helpers/coercion.mjs +45 -0
- package/esm2022/lib/models/class.model.mjs +2 -0
- package/esm2022/lib/models/enum.model.mjs +1 -1
- package/esm2022/lib/models/index.mjs +4 -1
- package/esm2022/lib/models/radio.model.mjs +2 -0
- package/esm2022/lib/models/tableview-attr.model.mjs +1 -1
- package/esm2022/lib/models/type-registry.model.mjs +2 -0
- package/esm2022/lib/models/view-container.model.mjs +1 -1
- package/esm2022/lib/pipes/boolean.pipe.mjs +3 -3
- package/esm2022/lib/pipes/class-map.pipe.mjs +3 -3
- package/esm2022/lib/pipes/enum.pipe.mjs +6 -6
- package/esm2022/lib/pipes/enumerate-async.pipe.mjs +5 -5
- package/esm2022/lib/pipes/enumerate.pipe.mjs +5 -5
- package/esm2022/lib/pipes/getter.pipe.mjs +5 -5
- package/esm2022/lib/pipes/i18n-property.pipe.mjs +4 -4
- package/esm2022/lib/pipes/json-path.pipe.mjs +3 -3
- package/esm2022/lib/pipes/locale-default-row-class.pipe.mjs +5 -5
- package/esm2022/lib/pipes/parametrize.pipe.mjs +3 -3
- package/esm2022/lib/pipes/template.pipe.mjs +4 -4
- package/esm2022/lib/provide-commons.mjs +4 -4
- package/esm2022/lib/registry/type.registry.mjs +114 -0
- package/esm2022/lib/router/models/router.model.mjs +1 -1
- package/esm2022/lib/router/tableview-route-builder.mjs +5 -5
- package/esm2022/lib/security/authorization.service.mjs +9 -11
- package/esm2022/lib/services/action-executor.service.mjs +14 -12
- package/esm2022/lib/services/commons-init.service.mjs +3 -3
- package/esm2022/lib/services/commons.service.mjs +6 -5
- package/esm2022/lib/services/mng-localstorage-config.service.mjs +4 -4
- package/esm2022/lib/services/navigation.service.mjs +5 -5
- package/esm2022/lib/services/router.service.mjs +4 -4
- package/esm2022/lib/services/version.service.mjs +5 -5
- package/esm2022/lib/services/view-container.component.service.mjs +5 -5
- package/esm2022/lib/styles/styles.util.mjs +1 -1
- package/esm2022/lib/types/action-descriptor.types.mjs +2 -0
- package/esm2022/lib/types/data-provider.types.mjs +2 -0
- package/esm2022/lib/types/getter.type.mjs +2 -0
- package/esm2022/lib/types/index.mjs +5 -2
- package/esm2022/lib/types/localstorage-config-value.type.mjs +2 -0
- package/esm2022/lib/types/type.decorator.mjs +4 -14
- package/esm2022/lib/types/type.model.mjs +1 -1
- package/esm2022/lib/utils/action-data-provider.util.mjs +14 -8
- package/esm2022/lib/utils/decorator-metadata.util.mjs +61 -0
- package/esm2022/lib/utils/editor-formly.util.mjs +6 -5
- package/esm2022/lib/utils/enum.util.mjs +1 -1
- package/esm2022/lib/utils/export.util.mjs +5 -4
- package/esm2022/lib/utils/i18n.util.mjs +22 -22
- package/esm2022/lib/utils/index.mjs +2 -3
- package/esm2022/lib/utils/model.util.mjs +40 -36
- package/esm2022/lib/utils/notification.util.mjs +1 -1
- package/esm2022/lib/utils/tableview.util.mjs +17 -17
- package/fesm2022/mediusinc-mng-commons.mjs +11491 -11384
- package/fesm2022/mediusinc-mng-commons.mjs.map +1 -1
- package/index.d.ts +3 -2
- package/lib/api/models/filter-param.model.d.ts +3 -3
- package/lib/api/models/index.d.ts +0 -2
- package/lib/api/models/query-param.model.d.ts +3 -3
- package/lib/api/models/query-result.model.d.ts +3 -3
- package/lib/api/services/api.abstract.service.d.ts +1 -1
- package/lib/api/utils/index.d.ts +1 -1
- package/lib/api/utils/object-serializer.util.d.ts +3 -19
- package/lib/components/action/action.component.d.ts +5 -5
- package/lib/components/action/editor/action-editor.component.d.ts +7 -7
- package/lib/components/action/localization/data-language-dropdown.component.d.ts +6 -6
- package/lib/components/action/models/action-component.model.d.ts +4 -4
- package/lib/components/action/models/action-confirmation-service.model.d.ts +2 -2
- package/lib/components/action/models/action-execution.model.d.ts +14 -14
- package/lib/components/action/route/action-route.component.d.ts +2 -2
- package/lib/components/form/autocomplete/autocomplete.component.d.ts +15 -18
- package/lib/components/form/dropdown/dropdown.component.d.ts +9 -9
- package/lib/components/form/editor/form-editor.component.d.ts +8 -11
- package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +4 -0
- package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +4 -4
- package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +3 -2
- package/lib/components/layout/topbar-user.component.d.ts +2 -2
- package/lib/components/layout/version.component.d.ts +2 -2
- package/lib/components/layoutV2/model/layout-state.model.d.ts +8 -9
- package/lib/components/layoutV2/services/main-layout.component.service.d.ts +1 -1
- package/lib/components/layoutV2/version.component.d.ts +2 -2
- package/lib/components/tableview/index.d.ts +0 -1
- package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +20 -20
- package/lib/components/tableview/route/tableview-route.component.d.ts +7 -7
- package/lib/components/tableview/table/table.component.d.ts +9 -9
- package/lib/components/tableview/tableview.component.d.ts +8 -8
- package/lib/data-providers/base.data-provider.d.ts +30 -12
- package/lib/data-providers/editor.data-provider.d.ts +86 -23
- package/lib/data-providers/lookup.data-provider.d.ts +24 -11
- package/lib/data-providers/table.data-provider.d.ts +30 -17
- package/lib/data-providers/tableview-crud.data-provider.d.ts +8 -4
- package/lib/data-providers/tableview.data-provider.d.ts +41 -29
- package/lib/descriptors/action/action-confirmation.descriptor.d.ts +3 -3
- package/lib/descriptors/action/action-editor.descriptor.d.ts +115 -0
- package/lib/descriptors/action/action-link.descriptor.d.ts +34 -0
- package/lib/descriptors/action/action.descriptor.d.ts +74 -160
- package/lib/descriptors/action/index.d.ts +2 -0
- package/lib/descriptors/editor/editor.descriptor.d.ts +131 -79
- package/lib/descriptors/editor/field-action.descriptor.d.ts +23 -0
- package/lib/descriptors/editor/field-base.descriptor.d.ts +126 -0
- package/lib/descriptors/editor/field-group.descriptor.d.ts +42 -0
- package/lib/descriptors/editor/field-lookup.descriptor.d.ts +80 -0
- package/lib/descriptors/editor/field-many.descriptor.d.ts +63 -0
- package/lib/descriptors/editor/field.descriptor.d.ts +100 -326
- package/lib/descriptors/editor/index.d.ts +5 -0
- package/lib/descriptors/editor/internal/editor-fields.model.d.ts +32 -0
- package/lib/descriptors/editor/internal/editor.model.d.ts +15 -0
- package/lib/descriptors/filter/filter-lookup.descriptor.d.ts +69 -0
- package/lib/descriptors/filter/filter.descriptor.d.ts +9 -67
- package/lib/descriptors/filter/index.d.ts +1 -0
- package/lib/descriptors/interfaces/lookup-descriptor.interface.d.ts +11 -16
- package/lib/descriptors/model/model.descriptor.d.ts +22 -0
- package/lib/descriptors/table/column.descriptor.d.ts +45 -33
- package/lib/descriptors/table/internal/table-columns.model.d.ts +11 -0
- package/lib/descriptors/table/internal/table.model.d.ts +9 -0
- package/lib/descriptors/table/table.descriptor.d.ts +82 -71
- package/lib/descriptors/tableview/internal/tableview.model.d.ts +11 -0
- package/lib/descriptors/tableview/tableview.descriptor.d.ts +106 -74
- package/lib/directives/component.directive.d.ts +5 -6
- package/lib/directives/template.directive.d.ts +2 -3
- package/lib/helpers/coercion.d.ts +9 -0
- package/lib/models/class.model.d.ts +6 -0
- package/lib/models/enum.model.d.ts +3 -2
- package/lib/models/index.d.ts +3 -0
- package/lib/models/radio.model.d.ts +6 -0
- package/lib/models/tableview-attr.model.d.ts +2 -2
- package/lib/models/type-registry.model.d.ts +7 -0
- package/lib/models/view-container.model.d.ts +6 -6
- package/lib/pipes/getter.pipe.d.ts +2 -1
- package/lib/pipes/i18n-property.pipe.d.ts +1 -1
- package/lib/pipes/locale-default-row-class.pipe.d.ts +2 -2
- package/lib/registry/type.registry.d.ts +25 -0
- package/lib/router/models/router.model.d.ts +5 -5
- package/lib/router/tableview-route-builder.d.ts +6 -6
- package/lib/security/authorization.service.d.ts +4 -7
- package/lib/services/action-executor.service.d.ts +7 -7
- package/lib/services/mng-localstorage-config.service.d.ts +3 -3
- package/lib/services/view-container.component.service.d.ts +3 -3
- package/lib/styles/styles.util.d.ts +5 -5
- package/lib/types/action-descriptor.types.d.ts +4 -0
- package/lib/types/data-provider.types.d.ts +3 -0
- package/lib/types/getter.type.d.ts +2 -0
- package/lib/types/index.d.ts +4 -1
- package/lib/types/localstorage-config-value.type.d.ts +1 -0
- package/lib/types/type.decorator.d.ts +0 -2
- package/lib/types/type.model.d.ts +12 -2
- package/lib/utils/action-data-provider.util.d.ts +6 -5
- package/lib/utils/{type.util.d.ts → decorator-metadata.util.d.ts} +2 -26
- package/lib/utils/editor-formly.util.d.ts +2 -2
- package/lib/utils/enum.util.d.ts +2 -2
- package/lib/utils/export.util.d.ts +2 -2
- package/lib/utils/i18n.util.d.ts +10 -11
- package/lib/utils/index.d.ts +1 -2
- package/lib/utils/model.util.d.ts +5 -3
- package/lib/utils/notification.util.d.ts +4 -4
- package/lib/utils/tableview.util.d.ts +6 -6
- package/openapi/templates/model.mustache +15 -2
- package/openapi/templates/models.mustache +0 -44
- package/package.json +10 -10
- package/scss/mng-commons-dark-v2.scss +2 -2
- package/scss/mng-commons-light-v2.scss +1 -1
- package/scss/v2/theme/{theme-base/components/data → extensions}/_fullcalendar.scss +14 -15
- package/scss/v2/theme/theme-base/_colors.scss +11 -12
- package/scss/v2/theme/theme-base/_common.scss +8 -5
- package/scss/v2/theme/theme-base/_components.scss +93 -89
- package/scss/v2/theme/theme-base/_mixins.scss +205 -71
- package/scss/v2/theme/theme-base/components/button/_button.scss +80 -68
- package/scss/v2/theme/theme-base/components/button/_speeddial.scss +11 -1
- package/scss/v2/theme/theme-base/components/button/_splitbutton.scss +128 -161
- package/scss/v2/theme/theme-base/components/data/_carousel.scss +1 -1
- package/scss/v2/theme/theme-base/components/data/_datatable.scss +3 -3
- package/scss/v2/theme/theme-base/components/data/_dataview.scss +0 -9
- package/scss/v2/theme/theme-base/components/data/_filter.scss +5 -6
- package/scss/v2/theme/theme-base/components/data/_orderlist.scss +15 -4
- package/scss/v2/theme/theme-base/components/data/_organizationchart.scss +1 -1
- package/scss/v2/theme/theme-base/components/data/_picklist.scss +14 -3
- package/scss/v2/theme/theme-base/components/data/_timeline.scss +3 -6
- package/scss/v2/theme/theme-base/components/data/_tree.scss +7 -6
- package/scss/v2/theme/theme-base/components/data/_treetable.scss +3 -4
- package/scss/v2/theme/theme-base/components/file/_fileupload.scss +6 -0
- package/scss/v2/theme/theme-base/components/input/_autocomplete.scss +43 -24
- package/scss/v2/theme/theme-base/components/input/_calendar.scss +9 -5
- package/scss/v2/theme/theme-base/components/input/_cascadeselect.scss +25 -20
- package/scss/v2/theme/theme-base/components/input/_checkbox.scss +9 -5
- package/scss/v2/theme/theme-base/components/input/_chips.scss +24 -13
- package/scss/v2/theme/theme-base/components/input/_dropdown.scss +29 -13
- package/scss/v2/theme/theme-base/components/input/_editor.scss +7 -7
- package/scss/v2/theme/theme-base/components/input/_inputgroup.scss +1 -2
- package/scss/v2/theme/theme-base/components/input/_inputmask.scss +2 -2
- package/scss/v2/theme/theme-base/components/input/_inputnumber.scss +7 -7
- package/scss/v2/theme/theme-base/components/input/_inputswitch.scss +3 -3
- package/scss/v2/theme/theme-base/components/input/_inputtext.scss +4 -3
- package/scss/v2/theme/theme-base/components/input/_listbox.scss +23 -8
- package/scss/v2/theme/theme-base/components/input/_multiselect.scss +31 -27
- package/scss/v2/theme/theme-base/components/input/_radiobutton.scss +2 -2
- package/scss/v2/theme/theme-base/components/input/_rating.scss +33 -28
- package/scss/v2/theme/theme-base/components/input/_treeselect.scss +6 -6
- package/scss/v2/theme/theme-base/components/menu/_breadcrumb.scss +3 -3
- package/scss/v2/theme/theme-base/components/menu/_contextmenu.scss +8 -30
- package/scss/v2/theme/theme-base/components/menu/_dock.scss +11 -2
- package/scss/v2/theme/theme-base/components/menu/_megamenu.scss +14 -65
- package/scss/v2/theme/theme-base/components/menu/_menu.scss +5 -13
- package/scss/v2/theme/theme-base/components/menu/_menubar.scss +32 -80
- package/scss/v2/theme/theme-base/components/menu/_panelmenu.scss +52 -39
- package/scss/v2/theme/theme-base/components/menu/_slidemenu.scss +15 -20
- package/scss/v2/theme/theme-base/components/menu/_steps.scss +2 -2
- package/scss/v2/theme/theme-base/components/menu/_tabmenu.scss +1 -2
- package/scss/v2/theme/theme-base/components/menu/_tieredmenu.scss +10 -32
- package/scss/v2/theme/theme-base/components/messages/_message.scss +2 -2
- package/scss/v2/theme/theme-base/components/messages/_toast.scss +2 -3
- package/scss/v2/theme/theme-base/components/misc/_chip.scss +7 -3
- package/scss/v2/theme/theme-base/components/misc/_inplace.scss +0 -1
- package/scss/v2/theme/theme-base/components/misc/_terminal.scss +9 -8
- package/scss/v2/theme/theme-base/components/multimedia/_galleria.scss +6 -0
- package/scss/v2/theme/theme-base/components/overlay/_confirmpopup.scss +3 -5
- package/scss/v2/theme/theme-base/components/panel/_accordion.scss +4 -4
- package/scss/v2/theme/theme-base/components/panel/_fieldset.scss +1 -1
- package/scss/v2/theme/theme-base/components/panel/_panel.scss +10 -5
- package/scss/v2/theme/theme-base/components/panel/_tabview.scss +6 -2
- package/scss/v2/theme/theme-dark/_variables.scss +756 -765
- package/scss/v2/theme/theme-dark/blue/theme.scss +1 -0
- package/scss/v2/theme/theme-light/_variables.scss +81 -94
- package/scss/v2/theme/theme-light/blue/theme.scss +1 -0
- package/esm2022/lib/api/models/mappers.mjs +0 -13
- package/esm2022/lib/api/models/serialization.model.mjs +0 -2
- package/esm2022/lib/components/tableview/table/column-filter/column-filter.component.mjs +0 -121
- package/esm2022/lib/descriptors/index.mjs +0 -2
- package/esm2022/lib/descriptors/model.descriptor.mjs +0 -45
- package/esm2022/lib/mng-commons.module.mjs +0 -472
- package/esm2022/lib/types/mng-localstorage-config-value.type.mjs +0 -2
- package/esm2022/lib/utils/coercion.util.mjs +0 -6
- package/esm2022/lib/utils/type.util.mjs +0 -94
- package/lib/api/models/mappers.d.ts +0 -6
- package/lib/api/models/serialization.model.d.ts +0 -9
- package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +0 -37
- package/lib/descriptors/model.descriptor.d.ts +0 -18
- package/lib/mng-commons.module.d.ts +0 -105
- package/lib/types/mng-localstorage-config-value.type.d.ts +0 -1
- package/lib/utils/coercion.util.d.ts +0 -2
- package/openapi/templates/serializer-registration/model.mustache +0 -97
- package/openapi/templates/serializer-registration/models.mustache +0 -6
- /package/lib/descriptors/{index.d.ts → model/index.d.ts} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AsyncPipe
|
|
1
|
+
import { AsyncPipe } from '@angular/common';
|
|
2
2
|
import { ChangeDetectionStrategy, Component, EventEmitter, Injector, Input, Optional, Output, ViewChild, forwardRef, inject } from '@angular/core';
|
|
3
3
|
import { FormControl, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';
|
|
4
4
|
import { TranslateModule, TranslateService } from '@ngx-translate/core';
|
|
@@ -7,6 +7,7 @@ import { MultiSelectModule } from 'primeng/multiselect';
|
|
|
7
7
|
import { ReplaySubject, of, switchMap } from 'rxjs';
|
|
8
8
|
import { first, map } from 'rxjs/operators';
|
|
9
9
|
import { MediusQueryParamBuilder } from '../../../api/models';
|
|
10
|
+
import { toObservable } from '../../../helpers/coercion';
|
|
10
11
|
import { MngInternalError } from '../../../models';
|
|
11
12
|
import { MngLoggerService } from '../../../services';
|
|
12
13
|
import { ErrorUtil } from '../../../utils';
|
|
@@ -28,7 +29,7 @@ export class MngDropdownComponent {
|
|
|
28
29
|
this.translate = translate;
|
|
29
30
|
this.formlyWrapper = formlyWrapper;
|
|
30
31
|
this.logger = inject(MngLoggerService).create('MngDropdownComponent');
|
|
31
|
-
this.
|
|
32
|
+
this.optionsLabelTranslate = false;
|
|
32
33
|
this.multiselect = false;
|
|
33
34
|
this.showClear = true;
|
|
34
35
|
this.selectFirstItem = false;
|
|
@@ -36,17 +37,17 @@ export class MngDropdownComponent {
|
|
|
36
37
|
this.loadingSubject = new ReplaySubject(1);
|
|
37
38
|
this.$loading = this.loadingSubject.asObservable();
|
|
38
39
|
this.valueChangeEventEmitter = new EventEmitter();
|
|
39
|
-
this.
|
|
40
|
+
this.optionsSubject = new ReplaySubject(1);
|
|
40
41
|
this.dataProviderService = null;
|
|
41
42
|
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
42
43
|
this.onTouchedFn = () => { };
|
|
43
44
|
this.dropdownFormControl = new FormControl();
|
|
44
|
-
this.items$ = this.
|
|
45
|
+
this.items$ = this.optionsSubject.asObservable();
|
|
45
46
|
this.loadingSubject.next(false);
|
|
46
47
|
}
|
|
47
48
|
ngOnInit() {
|
|
48
|
-
this.
|
|
49
|
-
this.
|
|
49
|
+
this.optionsLabelProperty = this.optionsLabelPropertyInit;
|
|
50
|
+
this.optionsValueProperty = this.optionsValuePropertyInit;
|
|
50
51
|
this.dropdownFormControl.valueChanges.subscribe(v => {
|
|
51
52
|
if (!this.changeValueOnBlur) {
|
|
52
53
|
this.propagateValueChange(v);
|
|
@@ -56,43 +57,42 @@ export class MngDropdownComponent {
|
|
|
56
57
|
this.loadingSubject.next(true);
|
|
57
58
|
this.dataProviderService = this.dataProvider.serviceType ? this.injector.get(this.dataProvider.serviceType) : null;
|
|
58
59
|
const queryParamBuilder = MediusQueryParamBuilder.create();
|
|
59
|
-
if (this.
|
|
60
|
+
if (this.optionsLabelTranslate) {
|
|
60
61
|
// setup translation properties
|
|
61
|
-
if (this.
|
|
62
|
-
this.
|
|
62
|
+
if (this.optionsLabelPropertyInit) {
|
|
63
|
+
this.optionsLabelProperty = `${this.optionsLabelPropertyInit}_i18n`;
|
|
63
64
|
}
|
|
64
|
-
else if (!this.
|
|
65
|
-
this.
|
|
66
|
-
this.
|
|
65
|
+
else if (!this.optionsLabelProperty && !this.optionsValuePropertyInit) {
|
|
66
|
+
this.optionsLabelProperty = 'title_i18n';
|
|
67
|
+
this.optionsValueProperty = 'value';
|
|
67
68
|
}
|
|
68
69
|
else {
|
|
69
|
-
throw new MngInternalError(`Invalid use with value (${this.
|
|
70
|
+
throw new MngInternalError(`Invalid use with value (${this.optionsLabelPropertyInit}) and label (${this.optionsLabelPropertyInit}) property setup.`, {
|
|
70
71
|
name: 'MngDropdownComponentError'
|
|
71
72
|
});
|
|
72
73
|
}
|
|
73
74
|
}
|
|
74
|
-
this.itemsSubscription = this.dataProvider
|
|
75
|
-
.lookup(queryParamBuilder.build(), this.dataProviderService)
|
|
75
|
+
this.itemsSubscription = toObservable(this.dataProvider.lookup(queryParamBuilder.build(), this.dataProviderService))
|
|
76
76
|
.pipe(switchMap(items => {
|
|
77
|
-
if (this.
|
|
78
|
-
const translationKeys = items.map(item => (typeof item === 'object' && this.
|
|
77
|
+
if (this.optionsLabelTranslate) {
|
|
78
|
+
const translationKeys = items.map(item => (typeof item === 'object' && this.optionsLabelPropertyInit ? item[this.optionsLabelPropertyInit] : item));
|
|
79
79
|
if (translationKeys.length === 0) {
|
|
80
80
|
return of([]);
|
|
81
81
|
}
|
|
82
82
|
return this.translate.stream(translationKeys).pipe(map(translations => items.map(item => {
|
|
83
|
-
if (typeof item === 'object' && this.
|
|
84
|
-
const label = item[this.
|
|
83
|
+
if (typeof item === 'object' && this.optionsLabelPropertyInit) {
|
|
84
|
+
const label = item[this.optionsLabelPropertyInit];
|
|
85
85
|
const translation = translations[label];
|
|
86
86
|
if (translation) {
|
|
87
|
-
return { ...item, [this.
|
|
87
|
+
return { ...item, [this.optionsLabelProperty]: translation };
|
|
88
88
|
}
|
|
89
89
|
return { ...item };
|
|
90
90
|
}
|
|
91
91
|
else {
|
|
92
92
|
const translation = translations[item];
|
|
93
93
|
return {
|
|
94
|
-
[this.
|
|
95
|
-
[this.
|
|
94
|
+
[this.optionsLabelProperty]: translation ?? item,
|
|
95
|
+
[this.optionsValueProperty]: item
|
|
96
96
|
};
|
|
97
97
|
}
|
|
98
98
|
})));
|
|
@@ -103,7 +103,7 @@ export class MngDropdownComponent {
|
|
|
103
103
|
}))
|
|
104
104
|
.subscribe({
|
|
105
105
|
next: res => {
|
|
106
|
-
this.
|
|
106
|
+
this.optionsSubject.next(res);
|
|
107
107
|
this.loadingSubject.next(false);
|
|
108
108
|
},
|
|
109
109
|
error: err => {
|
|
@@ -115,7 +115,7 @@ export class MngDropdownComponent {
|
|
|
115
115
|
});
|
|
116
116
|
if (this.selectFirstItem && !this.dropdownFormControl?.value) {
|
|
117
117
|
this.items$.pipe(first()).subscribe(res => {
|
|
118
|
-
const value = this.
|
|
118
|
+
const value = this.optionsValueProperty ? res[0][this.optionsValueProperty] : res[0];
|
|
119
119
|
this.dropdownFormControl?.setValue(value);
|
|
120
120
|
});
|
|
121
121
|
}
|
|
@@ -145,7 +145,7 @@ export class MngDropdownComponent {
|
|
|
145
145
|
// this check is required because angular in some cases writes null value
|
|
146
146
|
// before value accessor is initialized
|
|
147
147
|
// if form control value is of primitive type (ex: enums) then write value is not called (we think)
|
|
148
|
-
if (!this.
|
|
148
|
+
if (!this.optionsValuePropertyInit && obj === null && !this.isValueAccessorInitialized()) {
|
|
149
149
|
return;
|
|
150
150
|
}
|
|
151
151
|
this.dropdownFormControl.setValue(obj, { emitEvent: false });
|
|
@@ -179,27 +179,27 @@ export class MngDropdownComponent {
|
|
|
179
179
|
isValueAccessorInitialized() {
|
|
180
180
|
return typeof this.onChangeFn !== 'undefined';
|
|
181
181
|
}
|
|
182
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
183
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
182
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: MngDropdownComponent, deps: [{ token: i0.Injector }, { token: i1.TranslateService }, { token: i2.MngFormlyFieldWrapperComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
183
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.8", type: MngDropdownComponent, isStandalone: true, selector: "mng-dropdown", inputs: { dataProvider: "dataProvider", optionsTrackProperty: "optionsTrackProperty", optionsLabelPropertyInit: ["optionsLabelProperty", "optionsLabelPropertyInit"], optionsLabelTranslate: "optionsLabelTranslate", optionsValuePropertyInit: ["optionsValueProperty", "optionsValuePropertyInit"], optionsDisabledProperty: "optionsDisabledProperty", multiselect: "multiselect", placeholder: "placeholder", showClear: "showClear", selectFirstItem: "selectFirstItem", className: "className", dropdownClassName: "dropdownClassName", changeValueOnBlur: "changeValueOnBlur" }, outputs: { valueChangeEventEmitter: "valueChange" }, providers: [MNG_DROPDOWN_VALUE_ACCESSOR], viewQueries: [{ propertyName: "primeDropdown", first: true, predicate: Dropdown, descendants: true }], ngImport: i0, template: "@if (!multiselect) {\n <p-dropdown\n [formControl]=\"dropdownFormControl\"\n [placeholder]=\"placeholder\"\n [dataKey]=\"optionsTrackProperty\"\n [optionLabel]=\"optionsLabelProperty\"\n [optionValue]=\"optionsValueProperty\"\n [optionDisabled]=\"optionsDisabledProperty\"\n [options]=\"(items$ | async) ?? undefined\"\n [showClear]=\"showClear\"\n [autoDisplayFirst]=\"false\"\n [styleClass]=\"className\"\n [panelStyleClass]=\"dropdownClassName\"\n (onBlur)=\"onDropdownBlur($event)\"\n [dropdownIcon]=\"($loading | async) ?? false ? 'pi pi-spinner pi-spin' : 'pi pi-chevron-down'\"\n appendTo=\"body\">\n </p-dropdown>\n} @else {\n <p-multiSelect\n [maxSelectedLabels]=\"1\"\n [selectedItemsLabel]=\"'mngDropdown.multiselectOverMaxDisplayLimit' | translate\"\n [formControl]=\"dropdownFormControl\"\n [placeholder]=\"placeholder\"\n [dataKey]=\"optionsTrackProperty\"\n [optionLabel]=\"optionsLabelProperty\"\n [optionValue]=\"optionsValueProperty\"\n [optionDisabled]=\"optionsDisabledProperty\"\n [options]=\"(items$ | async) ?? []\"\n [styleClass]=\"className\"\n [panelStyleClass]=\"dropdownClassName\"\n [filter]=\"true\"\n [showToggleAll]=\"false\"\n (onPanelHide)=\"onPanelHide($event)\"\n appendTo=\"body\">\n </p-multiSelect>\n}\n", dependencies: [{ kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i3.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: i4.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
184
184
|
}
|
|
185
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
185
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: MngDropdownComponent, decorators: [{
|
|
186
186
|
type: Component,
|
|
187
|
-
args: [{ standalone: true, selector: 'mng-dropdown', providers: [MNG_DROPDOWN_VALUE_ACCESSOR], imports: [DropdownModule, MultiSelectModule, TranslateModule, AsyncPipe,
|
|
188
|
-
}], ctorParameters:
|
|
187
|
+
args: [{ standalone: true, selector: 'mng-dropdown', providers: [MNG_DROPDOWN_VALUE_ACCESSOR], imports: [DropdownModule, MultiSelectModule, TranslateModule, AsyncPipe, ReactiveFormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!multiselect) {\n <p-dropdown\n [formControl]=\"dropdownFormControl\"\n [placeholder]=\"placeholder\"\n [dataKey]=\"optionsTrackProperty\"\n [optionLabel]=\"optionsLabelProperty\"\n [optionValue]=\"optionsValueProperty\"\n [optionDisabled]=\"optionsDisabledProperty\"\n [options]=\"(items$ | async) ?? undefined\"\n [showClear]=\"showClear\"\n [autoDisplayFirst]=\"false\"\n [styleClass]=\"className\"\n [panelStyleClass]=\"dropdownClassName\"\n (onBlur)=\"onDropdownBlur($event)\"\n [dropdownIcon]=\"($loading | async) ?? false ? 'pi pi-spinner pi-spin' : 'pi pi-chevron-down'\"\n appendTo=\"body\">\n </p-dropdown>\n} @else {\n <p-multiSelect\n [maxSelectedLabels]=\"1\"\n [selectedItemsLabel]=\"'mngDropdown.multiselectOverMaxDisplayLimit' | translate\"\n [formControl]=\"dropdownFormControl\"\n [placeholder]=\"placeholder\"\n [dataKey]=\"optionsTrackProperty\"\n [optionLabel]=\"optionsLabelProperty\"\n [optionValue]=\"optionsValueProperty\"\n [optionDisabled]=\"optionsDisabledProperty\"\n [options]=\"(items$ | async) ?? []\"\n [styleClass]=\"className\"\n [panelStyleClass]=\"dropdownClassName\"\n [filter]=\"true\"\n [showToggleAll]=\"false\"\n (onPanelHide)=\"onPanelHide($event)\"\n appendTo=\"body\">\n </p-multiSelect>\n}\n" }]
|
|
188
|
+
}], ctorParameters: () => [{ type: i0.Injector }, { type: i1.TranslateService }, { type: i2.MngFormlyFieldWrapperComponent, decorators: [{
|
|
189
189
|
type: Optional
|
|
190
|
-
}] }]
|
|
190
|
+
}] }], propDecorators: { dataProvider: [{
|
|
191
191
|
type: Input
|
|
192
|
-
}],
|
|
192
|
+
}], optionsTrackProperty: [{
|
|
193
193
|
type: Input
|
|
194
|
-
}],
|
|
194
|
+
}], optionsLabelPropertyInit: [{
|
|
195
195
|
type: Input,
|
|
196
|
-
args: ['
|
|
197
|
-
}],
|
|
196
|
+
args: ['optionsLabelProperty']
|
|
197
|
+
}], optionsLabelTranslate: [{
|
|
198
198
|
type: Input
|
|
199
|
-
}],
|
|
199
|
+
}], optionsValuePropertyInit: [{
|
|
200
200
|
type: Input,
|
|
201
|
-
args: ['
|
|
202
|
-
}],
|
|
201
|
+
args: ['optionsValueProperty']
|
|
202
|
+
}], optionsDisabledProperty: [{
|
|
203
203
|
type: Input
|
|
204
204
|
}], multiselect: [{
|
|
205
205
|
type: Input
|
|
@@ -222,4 +222,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImpor
|
|
|
222
222
|
type: ViewChild,
|
|
223
223
|
args: [Dropdown]
|
|
224
224
|
}] } });
|
|
225
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBRVosUUFBUSxFQUNSLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBdUIsV0FBVyxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFekcsT0FBTyxFQUFDLGVBQWUsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxRQUFRLEVBQUUsY0FBYyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDMUQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFhLGFBQWEsRUFBeUIsRUFBRSxFQUFFLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNyRixPQUFPLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTFDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRTVELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG1CQUFtQixD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Q0RNYyxjQUFjLHluQ0FBRSxpQkFBaUIsa3lDQUFFLGVBQWUsdUZBQUUsU0FBUyw4Q0FBRSxJQUFJLDRGQUFFLG1CQUFtQjs7MkZBR3pGLG9CQUFvQjtrQkFSaEMsU0FBUztpQ0FDTSxJQUFJLFlBQ04sY0FBYyxhQUViLENBQUMsMkJBQTJCLENBQUMsV0FDL0IsQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsbUJBQ2xGLHVCQUF1QixDQUFDLE1BQU07OzBCQXVDK0IsUUFBUTs0Q0FsQ3RFLFlBQVk7c0JBQTNCLEtBQUs7Z0JBQ1UsZUFBZTtzQkFBOUIsS0FBSztnQkFDOEIsc0JBQXNCO3NCQUF6RCxLQUFLO3VCQUFDLG9CQUFvQjtnQkFDWCxtQkFBbUI7c0JBQWxDLEtBQUs7Z0JBQzhCLHNCQUFzQjtzQkFBekQsS0FBSzt1QkFBQyxvQkFBb0I7Z0JBQ1gscUJBQXFCO3NCQUFwQyxLQUFLO2dCQUNVLFdBQVc7c0JBQTFCLEtBQUs7Z0JBQ1UsV0FBVztzQkFBMUIsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLGVBQWU7c0JBQTlCLEtBQUs7Z0JBQ1UsU0FBUztzQkFBeEIsS0FBSztnQkFDVSxpQkFBaUI7c0JBQWhDLEtBQUs7Z0JBQ1UsaUJBQWlCO3NCQUFoQyxLQUFLO2dCQUt3Qix1QkFBdUI7c0JBQXBELE1BQU07dUJBQUMsYUFBYTtnQkFFTyxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FzeW5jUGlwZSwgTmdJZn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBFeGlzdGluZ1Byb3ZpZGVyLFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFZpZXdDaGlsZCxcbiAgICBmb3J3YXJkUmVmLFxuICAgIGluamVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBOR19WQUxVRV9BQ0NFU1NPUiwgUmVhY3RpdmVGb3Jtc01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0Ryb3Bkb3duLCBEcm9wZG93bk1vZHVsZX0gZnJvbSAncHJpbWVuZy9kcm9wZG93bic7XG5pbXBvcnQge011bHRpU2VsZWN0TW9kdWxlfSBmcm9tICdwcmltZW5nL211bHRpc2VsZWN0JztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBvZiwgc3dpdGNoTWFwfSBmcm9tICdyeGpzJztcbmltcG9ydCB7Zmlyc3QsIG1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge01lZGl1c1F1ZXJ5UGFyYW1CdWlsZGVyfSBmcm9tICcuLi8uLi8uLi9hcGkvbW9kZWxzJztcbmltcG9ydCB7SUxvb2t1cERhdGFQcm92aWRlcn0gZnJvbSAnLi4vLi4vLi4vZGF0YS1wcm92aWRlcnMnO1xuaW1wb3J0IHtNbmdJbnRlcm5hbEVycm9yfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtNbmdMb2dnZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQge0Vycm9yVXRpbH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHtNbmdGb3JtbHlGaWVsZFdyYXBwZXJDb21wb25lbnR9IGZyb20gJy4uL2Zvcm1seS93cmFwcGVycyc7XG5cbmV4cG9ydCBjb25zdCBNTkdfRFJPUERPV05fVkFMVUVfQUNDRVNTT1I6IEV4aXN0aW5nUHJvdmlkZXIgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTW5nRHJvcGRvd25Db21wb25lbnQpLFxuICAgIG11bHRpOiB0cnVlXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnbW5nLWRyb3Bkb3duJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW01OR19EUk9QRE9XTl9WQUxVRV9BQ0NFU1NPUl0sXG4gICAgaW1wb3J0czogW0Ryb3Bkb3duTW9kdWxlLCBNdWx0aVNlbGVjdE1vZHVsZSwgVHJhbnNsYXRlTW9kdWxlLCBBc3luY1BpcGUsIE5nSWYsIFJlYWN0aXZlRm9ybXNNb2R1bGVdLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE1uZ0Ryb3Bkb3duQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IGluamVjdChNbmdMb2dnZXJTZXJ2aWNlKS5jcmVhdGUoJ01uZ0Ryb3Bkb3duQ29tcG9uZW50Jyk7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgZGF0YVByb3ZpZGVyPzogSUxvb2t1cERhdGFQcm92aWRlcjxhbnksIGFueT47XG4gICAgQElucHV0KCkgcHVibGljIGRhdGFLZXlQcm9wZXJ0eT86IHN0cmluZztcbiAgICBASW5wdXQoJ2l0ZW1zTGFiZWxQcm9wZXJ0eScpIHB1YmxpYyBpdGVtc0xhYmVsUHJvcGVydHlJbml0Pzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpdGVtc0xhYmVsVHJhbnNsYXRlID0gZmFsc2U7XG4gICAgQElucHV0KCdpdGVtc1ZhbHVlUHJvcGVydHknKSBwdWJsaWMgaXRlbXNWYWx1ZVByb3BlcnR5SW5pdD86IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgaXRlbXNEaXNhYmxlZFByb3BlcnR5Pzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtdWx0aXNlbGVjdCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd0NsZWFyID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0Rmlyc3RJdGVtID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGNsYXNzTmFtZT86IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgZHJvcGRvd25DbGFzc05hbWU/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGNoYW5nZVZhbHVlT25CbHVyID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIGxvYWRpbmdTdWJqZWN0ID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oMSk7XG4gICAgcHVibGljICRsb2FkaW5nOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5sb2FkaW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAgIEBPdXRwdXQoJ3ZhbHVlQ2hhbmdlJykgcHVibGljIHZhbHVlQ2hhbmdlRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQFZpZXdDaGlsZChEcm9wZG93bikgcHVibGljIHByaW1lRHJvcGRvd24/OiBEcm9wZG93bjtcblxuICAgIHB1YmxpYyBpdGVtc0xhYmVsUHJvcGVydHk/OiBzdHJpbmc7XG4gICAgcHVibGljIGl0ZW1zVmFsdWVQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcml2YXRlIGl0ZW1zU3ViamVjdDogU3ViamVjdDxBcnJheTxhbnk+PiA9IG5ldyBSZXBsYXlTdWJqZWN0PEFycmF5PGFueT4+KDEpO1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyU2VydmljZTogYW55ID0gbnVsbDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgcHJpdmF0ZSBvbkNoYW5nZUZuOiBhbnk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIHByaXZhdGUgb25Ub3VjaGVkRm46IGFueSA9ICgpID0+IHt9O1xuXG4gICAgcHVibGljIGRyb3Bkb3duRm9ybUNvbnRyb2w6IEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XG4gICAgcHVibGljIGl0ZW1zJDogT2JzZXJ2YWJsZTxBcnJheTxhbnk+PiA9IHRoaXMuaXRlbXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHByaXZhdGUgaXRlbXNTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGluamVjdG9yOiBJbmplY3RvciwgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsIEBPcHRpb25hbCgpIHByaXZhdGUgZm9ybWx5V3JhcHBlcjogTW5nRm9ybWx5RmllbGRXcmFwcGVyQ29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXRlbXNMYWJlbFByb3BlcnR5ID0gdGhpcy5pdGVtc0xhYmVsUHJvcGVydHlJbml0O1xuICAgICAgICB0aGlzLml0ZW1zVmFsdWVQcm9wZXJ0eSA9IHRoaXMuaXRlbXNWYWx1ZVByb3BlcnR5SW5pdDtcblxuICAgICAgICB0aGlzLmRyb3Bkb3duRm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2ID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jaGFuZ2VWYWx1ZU9uQmx1cikge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvcGFnYXRlVmFsdWVDaGFuZ2Uodik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmRhdGFQcm92aWRlcikge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJTZXJ2aWNlID0gdGhpcy5kYXRhUHJvdmlkZXIuc2VydmljZVR5cGUgPyB0aGlzLmluamVjdG9yLmdldDxhbnk+KHRoaXMuZGF0YVByb3ZpZGVyLnNlcnZpY2VUeXBlKSA6IG51bGw7XG5cbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1CdWlsZGVyID0gTWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXIuY3JlYXRlKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zTGFiZWxUcmFuc2xhdGUpIHtcbiAgICAgICAgICAgICAgICAvLyBzZXR1cCB0cmFuc2xhdGlvbiBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXNMYWJlbFByb3BlcnR5SW5pdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eSA9IGAke3RoaXMuaXRlbXNMYWJlbFByb3BlcnR5SW5pdH1faTE4bmA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pdGVtc0xhYmVsUHJvcGVydHkgJiYgIXRoaXMuaXRlbXNWYWx1ZVByb3BlcnR5SW5pdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eSA9ICd0aXRsZV9pMThuJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtc1ZhbHVlUHJvcGVydHkgPSAndmFsdWUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNbmdJbnRlcm5hbEVycm9yKGBJbnZhbGlkIHVzZSB3aXRoIHZhbHVlICgke3RoaXMuaXRlbXNMYWJlbFByb3BlcnR5SW5pdH0pIGFuZCBsYWJlbCAoJHt0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eUluaXR9KSBwcm9wZXJ0eSBzZXR1cC5gLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnTW5nRHJvcGRvd25Db21wb25lbnRFcnJvcidcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLml0ZW1zU3Vic2NyaXB0aW9uID0gdGhpcy5kYXRhUHJvdmlkZXJcbiAgICAgICAgICAgICAgICAubG9va3VwKHF1ZXJ5UGFyYW1CdWlsZGVyLmJ1aWxkKCksIHRoaXMuZGF0YVByb3ZpZGVyU2VydmljZSlcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKGl0ZW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zTGFiZWxUcmFuc2xhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbktleXM6IHN0cmluZ1tdID0gaXRlbXMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0+ICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgdGhpcy5pdGVtc0xhYmVsUHJvcGVydHlJbml0ID8gKGl0ZW1bdGhpcy5pdGVtc0xhYmVsUHJvcGVydHlJbml0IGFzIGtleW9mIG9iamVjdF0gYXMgc3RyaW5nKSA6IGl0ZW0pIGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNsYXRpb25LZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZS5zdHJlYW0odHJhbnNsYXRpb25LZXlzKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAodHJhbnNsYXRpb25zID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiB0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eUluaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBpdGVtW3RoaXMuaXRlbXNMYWJlbFByb3BlcnR5SW5pdCBhcyBrZXlvZiBvYmplY3RdIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb246IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRyYW5zbGF0aW9uc1tsYWJlbF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2xhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsuLi5pdGVtLCBbdGhpcy5pdGVtc0xhYmVsUHJvcGVydHkhXTogdHJhbnNsYXRpb259O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7Li4uaXRlbX07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbnNbaXRlbV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhpcy5pdGVtc0xhYmVsUHJvcGVydHkhXTogdHJhbnNsYXRpb24gPz8gaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzLml0ZW1zVmFsdWVQcm9wZXJ0eSFdOiBpdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihpdGVtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtc1N1YmplY3QubmV4dChyZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtbmdFcnJvciA9IEVycm9yVXRpbC5mcm9tU3Vic2NyaWJlRXJyb3IoZXJyLCAnTW5nRHJvcGRvd25Db21wb25lbnRFcnJvcicsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtOiBxdWVyeVBhcmFtQnVpbGRlci5idWlsZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhtbmdFcnJvciwgRXJyb3JVdGlsLmdldEVycm9yTG9nTGV2ZWwobW5nRXJyb3IpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RGaXJzdEl0ZW0gJiYgIXRoaXMuZHJvcGRvd25Gb3JtQ29udHJvbD8udmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zJC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaXRlbXNWYWx1ZVByb3BlcnR5ID8gcmVzWzBdW3RoaXMuaXRlbXNWYWx1ZVByb3BlcnR5XSA6IHJlc1swXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93bkZvcm1Db250cm9sPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgV0FSTklORzogRGF0YSBwcm92aWRlciBzaG91bGQgYmUgcHJvdmlkZWQgZm9yIE1uZ0Ryb3Bkb3duQ29tcG9uZW50LmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuaXRlbXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2VGbiA9IGZuO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWRGbiA9IGZuO1xuICAgIH1cblxuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5kcm9wZG93bkZvcm1Db250cm9sLmRpc2FibGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd25Gb3JtQ29udHJvbC5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gdGhpcyBjaGVjayBpcyByZXF1aXJlZCBiZWNhdXNlIGFuZ3VsYXIgaW4gc29tZSBjYXNlcyB3cml0ZXMgbnVsbCB2YWx1ZVxuICAgICAgICAvLyBiZWZvcmUgdmFsdWUgYWNjZXNzb3IgaXMgaW5pdGlhbGl6ZWRcbiAgICAgICAgLy8gaWYgZm9ybSBjb250cm9sIHZhbHVlIGlzIG9mIHByaW1pdGl2ZSB0eXBlIChleDogZW51bXMpIHRoZW4gd3JpdGUgdmFsdWUgaXMgbm90IGNhbGxlZCAod2UgdGhpbmspXG4gICAgICAgIGlmICghdGhpcy5pdGVtc1ZhbHVlUHJvcGVydHlJbml0ICYmIG9iaiA9PT0gbnVsbCAmJiAhdGhpcy5pc1ZhbHVlQWNjZXNzb3JJbml0aWFsaXplZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kcm9wZG93bkZvcm1Db250cm9sLnNldFZhbHVlKG9iaiwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgb25Ecm9wZG93bkJsdXIoZXZlbnQ6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5jaGFuZ2VWYWx1ZU9uQmx1cikge1xuICAgICAgICAgICAgdGhpcy5wcm9wYWdhdGVWYWx1ZUNoYW5nZSh0aGlzLmRyb3Bkb3duRm9ybUNvbnRyb2wudmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uUGFuZWxIaWRlKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hhbmdlVmFsdWVPbkJsdXIpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcGFnYXRlVmFsdWVDaGFuZ2UodGhpcy5kcm9wZG93bkZvcm1Db250cm9sLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcHJvcGFnYXRlVmFsdWVDaGFuZ2UodmFsdWU6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWx1ZUFjY2Vzc29ySW5pdGlhbGl6ZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb3JtbHlXcmFwcGVyPy5mb3JtQ29udHJvbD8ubWFya0FzVG91Y2hlZCgpO1xuXG4gICAgICAgIHRoaXMub25DaGFuZ2VGbih2YWx1ZSk7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2VFdmVudEVtaXR0ZXIubmV4dCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJldmVudHMgZXhlY3V0aW9ucyBmb3Igd3JpdGluZyBhbmQgb3V0cHV0dGluZyB2YWx1ZSB3aGljaCBpcyBzb21ldGltZXMgY29tbWl0dGVkIGFzIG51bGwgaW4gY21wIGluaXRpYWxpemF0aW9uIHN0YWdlLlxuICAgICAqIEluIGRyb3Bkb3duIChmcm9tIGFuZy4gMTUgYW5kIHN3aXRjaCB0byBzdGFuZGFsb25lIGNtcCkgbnVsbCB2YWx1ZSB3YXMgYWx3YXlzIGNvbW1pdHRlZCB0byBkcm9wZG93biBldmVuIGlmIGRlZmF1bHQgdmFsdWUgd2FzIHNldCAodXNpbmcgbmdNb2RlbCBvciBmb3JtQ29udHJvbCkgd2hpY2ggaXMgaW5jb3JyZWN0LlxuICAgICAqIEdpdGh1YiBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTQ5ODhcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgaXNWYWx1ZUFjY2Vzc29ySW5pdGlhbGl6ZWQoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5vbkNoYW5nZUZuICE9PSAndW5kZWZpbmVkJztcbiAgICB9XG59XG4iLCI8cC1kcm9wZG93blxuICAgICpuZ0lmPVwiIW11bHRpc2VsZWN0OyBlbHNlIHBNdWx0aXNlbGVjdFwiXG4gICAgW2Zvcm1Db250cm9sXT1cImRyb3Bkb3duRm9ybUNvbnRyb2xcIlxuICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgW2RhdGFLZXldPVwiZGF0YUtleVByb3BlcnR5XCJcbiAgICBbb3B0aW9uTGFiZWxdPVwiaXRlbXNMYWJlbFByb3BlcnR5XCJcbiAgICBbb3B0aW9uVmFsdWVdPVwiaXRlbXNWYWx1ZVByb3BlcnR5XCJcbiAgICBbb3B0aW9uRGlzYWJsZWRdPVwiaXRlbXNEaXNhYmxlZFByb3BlcnR5XCJcbiAgICBbb3B0aW9uc109XCIoaXRlbXMkIHwgYXN5bmMpID8/IHVuZGVmaW5lZFwiXG4gICAgW3Nob3dDbGVhcl09XCJzaG93Q2xlYXJcIlxuICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCJcbiAgICBbc3R5bGVDbGFzc109XCJjbGFzc05hbWVcIlxuICAgIFtwYW5lbFN0eWxlQ2xhc3NdPVwiZHJvcGRvd25DbGFzc05hbWVcIlxuICAgIChvbkJsdXIpPVwib25Ecm9wZG93bkJsdXIoJGV2ZW50KVwiXG4gICAgW2Ryb3Bkb3duSWNvbl09XCIoJGxvYWRpbmcgfCBhc3luYykgPz8gZmFsc2UgPyAncGkgcGktc3Bpbm5lciBwaS1zcGluJyA6ICdwaSBwaS1jaGV2cm9uLWRvd24nXCJcbiAgICBhcHBlbmRUbz1cImJvZHlcIj5cbjwvcC1kcm9wZG93bj5cbjxuZy10ZW1wbGF0ZSAjcE11bHRpc2VsZWN0PlxuICAgIDxwLW11bHRpU2VsZWN0XG4gICAgICAgIFttYXhTZWxlY3RlZExhYmVsc109XCIxXCJcbiAgICAgICAgW3NlbGVjdGVkSXRlbXNMYWJlbF09XCInbW5nRHJvcGRvd24ubXVsdGlzZWxlY3RPdmVyTWF4RGlzcGxheUxpbWl0JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJkcm9wZG93bkZvcm1Db250cm9sXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgW2RhdGFLZXldPVwiZGF0YUtleVByb3BlcnR5XCJcbiAgICAgICAgW29wdGlvbkxhYmVsXT1cIml0ZW1zTGFiZWxQcm9wZXJ0eVwiXG4gICAgICAgIFtvcHRpb25WYWx1ZV09XCJpdGVtc1ZhbHVlUHJvcGVydHlcIlxuICAgICAgICBbb3B0aW9uRGlzYWJsZWRdPVwiaXRlbXNEaXNhYmxlZFByb3BlcnR5XCJcbiAgICAgICAgW29wdGlvbnNdPVwiKGl0ZW1zJCB8IGFzeW5jKSA/PyBbXVwiXG4gICAgICAgIFtzdHlsZUNsYXNzXT1cImNsYXNzTmFtZVwiXG4gICAgICAgIFtwYW5lbFN0eWxlQ2xhc3NdPVwiZHJvcGRvd25DbGFzc05hbWVcIlxuICAgICAgICBbZmlsdGVyXT1cInRydWVcIlxuICAgICAgICBbc2hvd1RvZ2dsZUFsbF09XCJmYWxzZVwiXG4gICAgICAgIChvblBhbmVsSGlkZSk9XCJvblBhbmVsSGlkZSgkZXZlbnQpXCJcbiAgICAgICAgYXBwZW5kVG89XCJib2R5XCI+XG4gICAgPC9wLW11bHRpU2VsZWN0PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
225
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFFWixRQUFRLEVBQ1IsS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF1QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RyxPQUFPLEVBQUMsZUFBZSxFQUFFLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDdEUsT0FBTyxFQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQWEsYUFBYSxFQUF5QixFQUFFLEVBQUUsU0FBUyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3JGLE9BQU8sRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUMsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFNUQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9B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QUMsMkJBQTJCLENBQUMseUVBMEI3QixRQUFRLGdEQ3BFdkIsbTdDQW9DQSwyQ0RPYyxjQUFjLHluQ0FBRSxpQkFBaUIsa3lDQUFFLGVBQWUsdUZBQUUsU0FBUyw2Q0FBRSxtQkFBbUI7OzJGQUduRixvQkFBb0I7a0JBUmhDLFNBQVM7aUNBQ00sSUFBSSxZQUNOLGNBQWMsYUFFYixDQUFDLDJCQUEyQixDQUFDLFdBQy9CLENBQUMsY0FBYyxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLENBQUMsbUJBQzVFLHVCQUF1QixDQUFDLE1BQU07OzBCQTBDMUMsUUFBUTt5Q0FyQ0csWUFBWTtzQkFBM0IsS0FBSztnQkFDVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBQ2dDLHdCQUF3QjtzQkFBN0QsS0FBSzt1QkFBQyxzQkFBc0I7Z0JBQ2IscUJBQXFCO3NCQUFwQyxLQUFLO2dCQUNnQyx3QkFBd0I7c0JBQTdELEtBQUs7dUJBQUMsc0JBQXNCO2dCQUNiLHVCQUF1QjtzQkFBdEMsS0FBSztnQkFDVSxXQUFXO3NCQUExQixLQUFLO2dCQUNVLFdBQVc7c0JBQTFCLEtBQUs7Z0JBQ1UsU0FBUztzQkFBeEIsS0FBSztnQkFDVSxlQUFlO3NCQUE5QixLQUFLO2dCQUNVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBQ1UsaUJBQWlCO3NCQUFoQyxLQUFLO2dCQUNVLGlCQUFpQjtzQkFBaEMsS0FBSztnQkFLd0IsdUJBQXVCO3NCQUFwRCxNQUFNO3VCQUFDLGFBQWE7Z0JBRU8sYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBc3luY1BpcGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgRXhpc3RpbmdQcm92aWRlcixcbiAgICBJbmplY3RvcixcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxuICAgIE91dHB1dCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgZm9yd2FyZFJlZixcbiAgICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbCwgTkdfVkFMVUVfQUNDRVNTT1IsIFJlYWN0aXZlRm9ybXNNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtEcm9wZG93biwgRHJvcGRvd25Nb2R1bGV9IGZyb20gJ3ByaW1lbmcvZHJvcGRvd24nO1xuaW1wb3J0IHtNdWx0aVNlbGVjdE1vZHVsZX0gZnJvbSAncHJpbWVuZy9tdWx0aXNlbGVjdCc7XG5pbXBvcnQge09ic2VydmFibGUsIFJlcGxheVN1YmplY3QsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgb2YsIHN3aXRjaE1hcH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZpcnN0LCBtYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtNZWRpdXNRdWVyeVBhcmFtQnVpbGRlcn0gZnJvbSAnLi4vLi4vLi4vYXBpL21vZGVscyc7XG5pbXBvcnQge0lMb29rdXBEYXRhUHJvdmlkZXJ9IGZyb20gJy4uLy4uLy4uL2RhdGEtcHJvdmlkZXJzJztcbmltcG9ydCB7dG9PYnNlcnZhYmxlfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZXJjaW9uJztcbmltcG9ydCB7TW5nSW50ZXJuYWxFcnJvcn0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7TW5nTG9nZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHtFcnJvclV0aWx9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCB7TW5nRm9ybWx5RmllbGRXcmFwcGVyQ29tcG9uZW50fSBmcm9tICcuLi9mb3JtbHkvd3JhcHBlcnMnO1xuXG5leHBvcnQgY29uc3QgTU5HX0RST1BET1dOX1ZBTFVFX0FDQ0VTU09SOiBFeGlzdGluZ1Byb3ZpZGVyID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1uZ0Ryb3Bkb3duQ29tcG9uZW50KSxcbiAgICBtdWx0aTogdHJ1ZVxufTtcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ21uZy1kcm9wZG93bicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Ryb3Bkb3duLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtNTkdfRFJPUERPV05fVkFMVUVfQUNDRVNTT1JdLFxuICAgIGltcG9ydHM6IFtEcm9wZG93bk1vZHVsZSwgTXVsdGlTZWxlY3RNb2R1bGUsIFRyYW5zbGF0ZU1vZHVsZSwgQXN5bmNQaXBlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBNbmdEcm9wZG93bkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBpbmplY3QoTW5nTG9nZ2VyU2VydmljZSkuY3JlYXRlKCdNbmdEcm9wZG93bkNvbXBvbmVudCcpO1xuXG4gICAgQElucHV0KCkgcHVibGljIGRhdGFQcm92aWRlcj86IElMb29rdXBEYXRhUHJvdmlkZXI8YW55LCBhbnk+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBvcHRpb25zVHJhY2tQcm9wZXJ0eT86IHN0cmluZztcbiAgICBASW5wdXQoJ29wdGlvbnNMYWJlbFByb3BlcnR5JykgcHVibGljIG9wdGlvbnNMYWJlbFByb3BlcnR5SW5pdD86IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgb3B0aW9uc0xhYmVsVHJhbnNsYXRlID0gZmFsc2U7XG4gICAgQElucHV0KCdvcHRpb25zVmFsdWVQcm9wZXJ0eScpIHB1YmxpYyBvcHRpb25zVmFsdWVQcm9wZXJ0eUluaXQ/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIG9wdGlvbnNEaXNhYmxlZFByb3BlcnR5Pzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtdWx0aXNlbGVjdCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd0NsZWFyID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0Rmlyc3RJdGVtID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGNsYXNzTmFtZT86IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgZHJvcGRvd25DbGFzc05hbWU/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGNoYW5nZVZhbHVlT25CbHVyID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIGxvYWRpbmdTdWJqZWN0ID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oMSk7XG4gICAgcHVibGljICRsb2FkaW5nOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5sb2FkaW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAgIEBPdXRwdXQoJ3ZhbHVlQ2hhbmdlJykgcHVibGljIHZhbHVlQ2hhbmdlRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQFZpZXdDaGlsZChEcm9wZG93bikgcHVibGljIHByaW1lRHJvcGRvd24/OiBEcm9wZG93bjtcblxuICAgIHB1YmxpYyBvcHRpb25zTGFiZWxQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwdWJsaWMgb3B0aW9uc1ZhbHVlUHJvcGVydHk/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25zU3ViamVjdDogU3ViamVjdDxBcnJheTxhbnk+PiA9IG5ldyBSZXBsYXlTdWJqZWN0PEFycmF5PGFueT4+KDEpO1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyU2VydmljZTogYW55ID0gbnVsbDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgcHJpdmF0ZSBvbkNoYW5nZUZuOiBhbnk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIHByaXZhdGUgb25Ub3VjaGVkRm46IGFueSA9ICgpID0+IHt9O1xuXG4gICAgcHVibGljIGRyb3Bkb3duRm9ybUNvbnRyb2w6IEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XG4gICAgcHVibGljIGl0ZW1zJDogT2JzZXJ2YWJsZTxBcnJheTxhbnk+PiA9IHRoaXMub3B0aW9uc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHJpdmF0ZSBpdGVtc1N1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZm9ybWx5V3JhcHBlcjogTW5nRm9ybWx5RmllbGRXcmFwcGVyQ29tcG9uZW50XG4gICAgKSB7XG4gICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3B0aW9uc0xhYmVsUHJvcGVydHkgPSB0aGlzLm9wdGlvbnNMYWJlbFByb3BlcnR5SW5pdDtcbiAgICAgICAgdGhpcy5vcHRpb25zVmFsdWVQcm9wZXJ0eSA9IHRoaXMub3B0aW9uc1ZhbHVlUHJvcGVydHlJbml0O1xuXG4gICAgICAgIHRoaXMuZHJvcGRvd25Gb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHYgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNoYW5nZVZhbHVlT25CbHVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wYWdhdGVWYWx1ZUNoYW5nZSh2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlclNlcnZpY2UgPSB0aGlzLmRhdGFQcm92aWRlci5zZXJ2aWNlVHlwZSA/IHRoaXMuaW5qZWN0b3IuZ2V0PGFueT4odGhpcy5kYXRhUHJvdmlkZXIuc2VydmljZVR5cGUpIDogbnVsbDtcblxuICAgICAgICAgICAgY29uc3QgcXVlcnlQYXJhbUJ1aWxkZXIgPSBNZWRpdXNRdWVyeVBhcmFtQnVpbGRlci5jcmVhdGUoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uc0xhYmVsVHJhbnNsYXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gc2V0dXAgdHJhbnNsYXRpb24gcHJvcGVydGllc1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnNMYWJlbFByb3BlcnR5SW5pdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNMYWJlbFByb3BlcnR5ID0gYCR7dGhpcy5vcHRpb25zTGFiZWxQcm9wZXJ0eUluaXR9X2kxOG5gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMub3B0aW9uc0xhYmVsUHJvcGVydHkgJiYgIXRoaXMub3B0aW9uc1ZhbHVlUHJvcGVydHlJbml0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc0xhYmVsUHJvcGVydHkgPSAndGl0bGVfaTE4bic7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc1ZhbHVlUHJvcGVydHkgPSAndmFsdWUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNbmdJbnRlcm5hbEVycm9yKGBJbnZhbGlkIHVzZSB3aXRoIHZhbHVlICgke3RoaXMub3B0aW9uc0xhYmVsUHJvcGVydHlJbml0fSkgYW5kIGxhYmVsICgke3RoaXMub3B0aW9uc0xhYmVsUHJvcGVydHlJbml0fSkgcHJvcGVydHkgc2V0dXAuYCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ01uZ0Ryb3Bkb3duQ29tcG9uZW50RXJyb3InXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5pdGVtc1N1YnNjcmlwdGlvbiA9IHRvT2JzZXJ2YWJsZSh0aGlzLmRhdGFQcm92aWRlci5sb29rdXAocXVlcnlQYXJhbUJ1aWxkZXIuYnVpbGQoKSwgdGhpcy5kYXRhUHJvdmlkZXJTZXJ2aWNlKSlcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKGl0ZW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnNMYWJlbFRyYW5zbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uS2V5czogc3RyaW5nW10gPSBpdGVtcy5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgdGhpcy5vcHRpb25zTGFiZWxQcm9wZXJ0eUluaXQgPyAoaXRlbVt0aGlzLm9wdGlvbnNMYWJlbFByb3BlcnR5SW5pdCBhcyBrZXlvZiBvYmplY3RdIGFzIHN0cmluZykgOiBpdGVtKSBhcyBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zbGF0aW9uS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUuc3RyZWFtKHRyYW5zbGF0aW9uS2V5cykucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKHRyYW5zbGF0aW9ucyA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgdGhpcy5vcHRpb25zTGFiZWxQcm9wZXJ0eUluaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBpdGVtW3RoaXMub3B0aW9uc0xhYmVsUHJvcGVydHlJbml0IGFzIGtleW9mIG9iamVjdF0gYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdHJhbnNsYXRpb25zW2xhYmVsXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gey4uLml0ZW0sIFt0aGlzLm9wdGlvbnNMYWJlbFByb3BlcnR5IV06IHRyYW5zbGF0aW9ufTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gey4uLml0ZW19O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb25zW2l0ZW1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXMub3B0aW9uc0xhYmVsUHJvcGVydHkhXTogdHJhbnNsYXRpb24gPz8gaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzLm9wdGlvbnNWYWx1ZVByb3BlcnR5IV06IGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKGl0ZW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgICAgIG5leHQ6IHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNTdWJqZWN0Lm5leHQocmVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW5nRXJyb3IgPSBFcnJvclV0aWwuZnJvbVN1YnNjcmliZUVycm9yKGVyciwgJ01uZ0Ryb3Bkb3duQ29tcG9uZW50RXJyb3InLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbTogcXVlcnlQYXJhbUJ1aWxkZXIuYnVpbGQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2cobW5nRXJyb3IsIEVycm9yVXRpbC5nZXRFcnJvckxvZ0xldmVsKG1uZ0Vycm9yKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0Rmlyc3RJdGVtICYmICF0aGlzLmRyb3Bkb3duRm9ybUNvbnRyb2w/LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtcyQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLm9wdGlvbnNWYWx1ZVByb3BlcnR5ID8gcmVzWzBdW3RoaXMub3B0aW9uc1ZhbHVlUHJvcGVydHldIDogcmVzWzBdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duRm9ybUNvbnRyb2w/LnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBXQVJOSU5HOiBEYXRhIHByb3ZpZGVyIHNob3VsZCBiZSBwcm92aWRlZCBmb3IgTW5nRHJvcGRvd25Db21wb25lbnQuYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5pdGVtc1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZUZuID0gZm47XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZEZuID0gZm47XG4gICAgfVxuXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmIChpc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duRm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kcm9wZG93bkZvcm1Db250cm9sLmVuYWJsZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xuICAgICAgICAvLyB0aGlzIGNoZWNrIGlzIHJlcXVpcmVkIGJlY2F1c2UgYW5ndWxhciBpbiBzb21lIGNhc2VzIHdyaXRlcyBudWxsIHZhbHVlXG4gICAgICAgIC8vIGJlZm9yZSB2YWx1ZSBhY2Nlc3NvciBpcyBpbml0aWFsaXplZFxuICAgICAgICAvLyBpZiBmb3JtIGNvbnRyb2wgdmFsdWUgaXMgb2YgcHJpbWl0aXZlIHR5cGUgKGV4OiBlbnVtcykgdGhlbiB3cml0ZSB2YWx1ZSBpcyBub3QgY2FsbGVkICh3ZSB0aGluaylcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnNWYWx1ZVByb3BlcnR5SW5pdCAmJiBvYmogPT09IG51bGwgJiYgIXRoaXMuaXNWYWx1ZUFjY2Vzc29ySW5pdGlhbGl6ZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZHJvcGRvd25Gb3JtQ29udHJvbC5zZXRWYWx1ZShvYmosIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uRHJvcGRvd25CbHVyKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hhbmdlVmFsdWVPbkJsdXIpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcGFnYXRlVmFsdWVDaGFuZ2UodGhpcy5kcm9wZG93bkZvcm1Db250cm9sLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBvblBhbmVsSGlkZShldmVudDogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLmNoYW5nZVZhbHVlT25CbHVyKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZVZhbHVlQ2hhbmdlKHRoaXMuZHJvcGRvd25Gb3JtQ29udHJvbC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHByb3BhZ2F0ZVZhbHVlQ2hhbmdlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsdWVBY2Nlc3NvckluaXRpYWxpemVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9ybWx5V3JhcHBlcj8uZm9ybUNvbnRyb2w/Lm1hcmtBc1RvdWNoZWQoKTtcblxuICAgICAgICB0aGlzLm9uQ2hhbmdlRm4odmFsdWUpO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlRXZlbnRFbWl0dGVyLm5leHQodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZXZlbnRzIGV4ZWN1dGlvbnMgZm9yIHdyaXRpbmcgYW5kIG91dHB1dHRpbmcgdmFsdWUgd2hpY2ggaXMgc29tZXRpbWVzIGNvbW1pdHRlZCBhcyBudWxsIGluIGNtcCBpbml0aWFsaXphdGlvbiBzdGFnZS5cbiAgICAgKiBJbiBkcm9wZG93biAoZnJvbSBhbmcuIDE1IGFuZCBzd2l0Y2ggdG8gc3RhbmRhbG9uZSBjbXApIG51bGwgdmFsdWUgd2FzIGFsd2F5cyBjb21taXR0ZWQgdG8gZHJvcGRvd24gZXZlbiBpZiBkZWZhdWx0IHZhbHVlIHdhcyBzZXQgKHVzaW5nIG5nTW9kZWwgb3IgZm9ybUNvbnRyb2wpIHdoaWNoIGlzIGluY29ycmVjdC5cbiAgICAgKiBHaXRodWIgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE0OTg4XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGlzVmFsdWVBY2Nlc3NvckluaXRpYWxpemVkKCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMub25DaGFuZ2VGbiAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgfVxufVxuIiwiQGlmICghbXVsdGlzZWxlY3QpIHtcbiAgICA8cC1kcm9wZG93blxuICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZHJvcGRvd25Gb3JtQ29udHJvbFwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgIFtkYXRhS2V5XT1cIm9wdGlvbnNUcmFja1Byb3BlcnR5XCJcbiAgICAgICAgW29wdGlvbkxhYmVsXT1cIm9wdGlvbnNMYWJlbFByb3BlcnR5XCJcbiAgICAgICAgW29wdGlvblZhbHVlXT1cIm9wdGlvbnNWYWx1ZVByb3BlcnR5XCJcbiAgICAgICAgW29wdGlvbkRpc2FibGVkXT1cIm9wdGlvbnNEaXNhYmxlZFByb3BlcnR5XCJcbiAgICAgICAgW29wdGlvbnNdPVwiKGl0ZW1zJCB8IGFzeW5jKSA/PyB1bmRlZmluZWRcIlxuICAgICAgICBbc2hvd0NsZWFyXT1cInNob3dDbGVhclwiXG4gICAgICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCJcbiAgICAgICAgW3N0eWxlQ2xhc3NdPVwiY2xhc3NOYW1lXCJcbiAgICAgICAgW3BhbmVsU3R5bGVDbGFzc109XCJkcm9wZG93bkNsYXNzTmFtZVwiXG4gICAgICAgIChvbkJsdXIpPVwib25Ecm9wZG93bkJsdXIoJGV2ZW50KVwiXG4gICAgICAgIFtkcm9wZG93bkljb25dPVwiKCRsb2FkaW5nIHwgYXN5bmMpID8/IGZhbHNlID8gJ3BpIHBpLXNwaW5uZXIgcGktc3BpbicgOiAncGkgcGktY2hldnJvbi1kb3duJ1wiXG4gICAgICAgIGFwcGVuZFRvPVwiYm9keVwiPlxuICAgIDwvcC1kcm9wZG93bj5cbn0gQGVsc2Uge1xuICAgIDxwLW11bHRpU2VsZWN0XG4gICAgICAgIFttYXhTZWxlY3RlZExhYmVsc109XCIxXCJcbiAgICAgICAgW3NlbGVjdGVkSXRlbXNMYWJlbF09XCInbW5nRHJvcGRvd24ubXVsdGlzZWxlY3RPdmVyTWF4RGlzcGxheUxpbWl0JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJkcm9wZG93bkZvcm1Db250cm9sXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgW2RhdGFLZXldPVwib3B0aW9uc1RyYWNrUHJvcGVydHlcIlxuICAgICAgICBbb3B0aW9uTGFiZWxdPVwib3B0aW9uc0xhYmVsUHJvcGVydHlcIlxuICAgICAgICBbb3B0aW9uVmFsdWVdPVwib3B0aW9uc1ZhbHVlUHJvcGVydHlcIlxuICAgICAgICBbb3B0aW9uRGlzYWJsZWRdPVwib3B0aW9uc0Rpc2FibGVkUHJvcGVydHlcIlxuICAgICAgICBbb3B0aW9uc109XCIoaXRlbXMkIHwgYXN5bmMpID8/IFtdXCJcbiAgICAgICAgW3N0eWxlQ2xhc3NdPVwiY2xhc3NOYW1lXCJcbiAgICAgICAgW3BhbmVsU3R5bGVDbGFzc109XCJkcm9wZG93bkNsYXNzTmFtZVwiXG4gICAgICAgIFtmaWx0ZXJdPVwidHJ1ZVwiXG4gICAgICAgIFtzaG93VG9nZ2xlQWxsXT1cImZhbHNlXCJcbiAgICAgICAgKG9uUGFuZWxIaWRlKT1cIm9uUGFuZWxIaWRlKCRldmVudClcIlxuICAgICAgICBhcHBlbmRUbz1cImJvZHlcIj5cbiAgICA8L3AtbXVsdGlTZWxlY3Q+XG59XG4iXX0=
|
|
@@ -6,23 +6,21 @@ import { TranslateService } from '@ngx-translate/core';
|
|
|
6
6
|
import { ButtonModule } from 'primeng/button';
|
|
7
7
|
import { MessagesModule } from 'primeng/messages';
|
|
8
8
|
import { Observable, ReplaySubject, debounceTime, distinctUntilChanged, of } from 'rxjs';
|
|
9
|
-
import {
|
|
9
|
+
import { EditorDescriptorInst } from '../../../descriptors/editor';
|
|
10
10
|
import { TableviewEditorTypeEnum } from '../../../descriptors/types';
|
|
11
11
|
import { MngTemplateDirective } from '../../../directives';
|
|
12
12
|
import { MngCommonsService, MngLoggerService } from '../../../services';
|
|
13
13
|
import { EditorFormlyUtil, NotificationUtil, ObjectUtil } from '../../../utils';
|
|
14
14
|
import { MngFormEditorSubmitEvent, MngFormEventTypeEnum, MngFormFieldEventComponentSubtype } from '../models';
|
|
15
15
|
import * as i0 from "@angular/core";
|
|
16
|
-
import * as i1 from "
|
|
17
|
-
import * as i2 from "@
|
|
18
|
-
import * as i3 from "
|
|
19
|
-
import * as i4 from "
|
|
20
|
-
import * as i5 from "primeng/messages";
|
|
21
|
-
import * as i6 from "primeng/button";
|
|
16
|
+
import * as i1 from "@ngx-formly/core";
|
|
17
|
+
import * as i2 from "@angular/forms";
|
|
18
|
+
import * as i3 from "primeng/messages";
|
|
19
|
+
import * as i4 from "primeng/button";
|
|
22
20
|
export class MngFormEditorComponent {
|
|
23
|
-
constructor(
|
|
24
|
-
this.
|
|
25
|
-
this.
|
|
21
|
+
constructor() {
|
|
22
|
+
this.translateService = inject(TranslateService);
|
|
23
|
+
this.mngCommonsService = inject(MngCommonsService);
|
|
26
24
|
this.logger = inject(MngLoggerService).create('MngFormEditorComponent');
|
|
27
25
|
this.submitLoading = false;
|
|
28
26
|
this.viewContainerSubject = new ReplaySubject(1);
|
|
@@ -152,7 +150,7 @@ export class MngFormEditorComponent {
|
|
|
152
150
|
for (let i = 0; i < splitPath.length; i++) {
|
|
153
151
|
const currentSubPath = splitPath[i];
|
|
154
152
|
if (i === splitPath.length - 1) {
|
|
155
|
-
currentObject[currentSubPath] = field.getter(item);
|
|
153
|
+
currentObject[currentSubPath] = field.getter(item?.[field.property], item);
|
|
156
154
|
}
|
|
157
155
|
else {
|
|
158
156
|
if (typeof currentObject[currentSubPath] !== 'object') {
|
|
@@ -259,13 +257,13 @@ export class MngFormEditorComponent {
|
|
|
259
257
|
}
|
|
260
258
|
this.updateFormState();
|
|
261
259
|
}
|
|
262
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
263
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
260
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: MngFormEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
261
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.8", type: MngFormEditorComponent, isStandalone: true, selector: "mng-form-editor", inputs: { descriptor: "descriptor", submitLoading: "submitLoading", item: "item", viewContainerInit: ["viewContainer", "viewContainerInit"], isFormDisabled: "isFormDisabled" }, outputs: { formSubmitEventEmitter: "formSubmit" }, queries: [{ propertyName: "templates", predicate: MngTemplateDirective }], viewQueries: [{ propertyName: "submitButtonElementRef", first: true, predicate: ["submitButton"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<form [formGroup]=\"form\" (ngSubmit)=\"onSubmit($event)\">\n <formly-form [form]=\"form\" [fields]=\"formFields\" [options]=\"formOptions\" [model]=\"formModel\"></formly-form>\n <button\n #submitButton\n pButton\n type=\"submit\"\n class=\"hidden\"\n [disabled]=\"form.disabled\"\n [loading]=\"(submitLoading$ | async) ?? false\"\n loadingIcon=\"pi pi-spin pi-spinner\"></button>\n</form>\n<p-messages [value]=\"formMessages\" [enableService]=\"false\"></p-messages>\n", dependencies: [{ kind: "ngmodule", type: FormlyModule }, { kind: "component", type: i1.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MessagesModule }, { kind: "component", type: i3.Messages, selector: "p-messages", inputs: ["value", "closable", "style", "styleClass", "enableService", "key", "escape", "severity", "showTransitionOptions", "hideTransitionOptions"], outputs: ["valueChange"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
264
262
|
}
|
|
265
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
263
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: MngFormEditorComponent, decorators: [{
|
|
266
264
|
type: Component,
|
|
267
265
|
args: [{ standalone: true, selector: 'mng-form-editor', imports: [FormlyModule, ReactiveFormsModule, MessagesModule, AsyncPipe, ButtonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<form [formGroup]=\"form\" (ngSubmit)=\"onSubmit($event)\">\n <formly-form [form]=\"form\" [fields]=\"formFields\" [options]=\"formOptions\" [model]=\"formModel\"></formly-form>\n <button\n #submitButton\n pButton\n type=\"submit\"\n class=\"hidden\"\n [disabled]=\"form.disabled\"\n [loading]=\"(submitLoading$ | async) ?? false\"\n loadingIcon=\"pi pi-spin pi-spinner\"></button>\n</form>\n<p-messages [value]=\"formMessages\" [enableService]=\"false\"></p-messages>\n" }]
|
|
268
|
-
}],
|
|
266
|
+
}], propDecorators: { descriptor: [{
|
|
269
267
|
type: Input
|
|
270
268
|
}], submitLoading: [{
|
|
271
269
|
type: Input
|
|
@@ -286,4 +284,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImpor
|
|
|
286
284
|
type: ViewChild,
|
|
287
285
|
args: ['submitButton']
|
|
288
286
|
}] } });
|
|
289
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vZWRpdG9yL2Zvcm0tZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9mb3JtL2VkaXRvci9mb3JtLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFDTixTQUFTLEVBR1QsU0FBUyxFQUNULE1BQU0sRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWtCLFNBQVMsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxRixPQUFPLEVBQXVDLFlBQVksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3BGLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRXJELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFDLFVBQVUsRUFBRSxhQUFhLEVBQWdCLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFckcsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDN0QsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFekQsT0FBTyxF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O3NCQUE3QixLQUFLO2dCQUd1QixzQkFBc0I7c0JBQWxELE1BQU07dUJBQUMsWUFBWTtnQkFHMEIsU0FBUztzQkFBdEQsZUFBZTt1QkFBQyxvQkFBb0I7Z0JBQ0gsc0JBQXNCO3NCQUF2RCxTQUFTO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FzeW5jUGlwZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVHlwZSxcbiAgICBWaWV3Q2hpbGQsXG4gICAgaW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7Rm9ybWx5RmllbGRDb25maWcsIEZvcm1seUZvcm1PcHRpb25zLCBGb3JtbHlNb2R1bGV9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7TWVzc2FnZX0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHtCdXR0b25Nb2R1bGV9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcbmltcG9ydCB7TWVzc2FnZXNNb2R1bGV9IGZyb20gJ3ByaW1lbmcvbWVzc2FnZXMnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG9mfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtFZGl0b3JEZXNjcmlwdG9yfSBmcm9tICcuLi8uLi8uLi9kZXNjcmlwdG9ycy9lZGl0b3InO1xuaW1wb3J0IHtUYWJsZXZpZXdFZGl0b3JUeXBlRW51bX0gZnJvbSAnLi4vLi4vLi4vZGVzY3JpcHRvcnMvdHlwZXMnO1xuaW1wb3J0IHtNbmdUZW1wbGF0ZURpcmVjdGl2ZX0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcyc7XG5pbXBvcnQge0lWaWV3Q29udGFpbmVyfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtNbmdDb21tb25zU2VydmljZSwgTW5nTG9nZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHtFZGl0b3JGb3JtbHlVdGlsLCBOb3RpZmljYXRpb25VdGlsLCBPYmplY3RVdGlsfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5pbXBvcnQge01uZ0Zvcm1seUZpZWxkQ29uZmlnfSBmcm9tICcuLi9mb3JtbHkvbW9kZWxzJztcbmltcG9ydCB7SUZvcm1FZGl0b3JDb21wb25lbnQsIE1uZ0Zvcm1FZGl0b3JTdWJtaXRFdmVudCwgTW5nRm9ybUV2ZW50VHlwZUVudW0sIE1uZ0Zvcm1GaWVsZEV2ZW50Q29tcG9uZW50U3VidHlwZX0gZnJvbSAnLi4vbW9kZWxzJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ21uZy1mb3JtLWVkaXRvcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgICBpbXBvcnRzOiBbRm9ybWx5TW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBNZXNzYWdlc01vZHVsZSwgQXN5bmNQaXBlLCBCdXR0b25Nb2R1bGVdLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE1uZ0Zvcm1FZGl0b3JDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBJRm9ybUVkaXRvckNvbXBvbmVudDxUPiwgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBpbmplY3QoTW5nTG9nZ2VyU2VydmljZSkuY3JlYXRlKCdNbmdGb3JtRWRpdG9yQ29tcG9uZW50Jyk7XG5cbiAgICAvLyBtZXRhZGF0YSBhbmQgZWRpdG9yIG1vZGUgaW5wdXRcbiAgICBASW5wdXQoKSBwdWJsaWMgZGVzY3JpcHRvcj86IEVkaXRvckRlc2NyaXB0b3I8VD47XG4gICAgQElucHV0KCkgcHVibGljIHN1Ym1pdExvYWRpbmc6IE9ic2VydmFibGU8Ym9vbGVhbj4gfCBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvLyBkYXRhIHNvdXJjZSBpbnB1dHM7XG4gICAgQElucHV0KCkgcHVibGljIGl0ZW0/OiBUO1xuICAgIEBJbnB1dCgndmlld0NvbnRhaW5lcicpIHB1YmxpYyB2aWV3Q29udGFpbmVySW5pdD86IElWaWV3Q29udGFpbmVyPFQsIHVua25vd24+O1xuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclN1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxJVmlld0NvbnRhaW5lcjxULCB1bmtub3duPj4oMSk7XG4gICAgcHVibGljIHZpZXdDb250YWluZXIkID0gdGhpcy52aWV3Q29udGFpbmVyU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAgIC8vIGV4dHJhIGZlYXR1cmVzIGlucHV0XG4gICAgQElucHV0KCkgcHVibGljIGlzRm9ybURpc2FibGVkID0gZmFsc2U7XG5cbiAgICAvLyBldmVudCBvdXRwdXRzXG4gICAgQE91dHB1dCgnZm9ybVN1Ym1pdCcpIHB1YmxpYyBmb3JtU3VibWl0RXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxNbmdGb3JtRWRpdG9yU3VibWl0RXZlbnQ8VD4+KCk7XG5cbiAgICAvLyBjb250ZW50IGFuZCB2aWV3IHF1ZXJpZXNcbiAgICBAQ29udGVudENoaWxkcmVuKE1uZ1RlbXBsYXRlRGlyZWN0aXZlKSBwdWJsaWMgdGVtcGxhdGVzITogUXVlcnlMaXN0PE1uZ1RlbXBsYXRlRGlyZWN0aXZlPjtcbiAgICBAVmlld0NoaWxkKCdzdWJtaXRCdXR0b24nKSBwdWJsaWMgc3VibWl0QnV0dG9uRWxlbWVudFJlZj86IEVsZW1lbnRSZWY7XG5cbiAgICBwdWJsaWMgZm9ybTogRm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gICAgcHVibGljIGZvcm1PcHRpb25zOiBGb3JtbHlGb3JtT3B0aW9ucyA9IHtcbiAgICAgICAgZm9ybVN0YXRlOiB7XG4gICAgICAgICAgICBhZGQ6IGZhbHNlLFxuICAgICAgICAgICAgZWRpdDogZmFsc2UsXG4gICAgICAgICAgICBkaXNhYmxlZDogZmFsc2VcbiAgICAgICAgfVxuICAgIH07XG4gICAgcHVibGljIGZvcm1GaWVsZHMhOiBGb3JtbHlGaWVsZENvbmZpZ1tdO1xuICAgIHB1YmxpYyBmb3JtTW9kZWw6IGFueSA9IHt9O1xuICAgIHB1YmxpYyBmb3JtTWVzc2FnZXM6IE1lc3NhZ2VbXSA9IFtdO1xuICAgIHB1YmxpYyBzdWJtaXRMb2FkaW5nJCE6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgcHJpdmF0ZSBvcmlnaW5hbEl0ZW1Qcm90b3R5cGU/OiBUeXBlPFQ+O1xuXG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBtbmdDb21tb25zU2VydmljZTogTW5nQ29tbW9uc1NlcnZpY2UsIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSkge31cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsRm9ybVN0YXRlKCk7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtTW9kZWwodGhpcy5pdGVtKTtcbiAgICAgICAgdGhpcy5zdWJtaXRMb2FkaW5nJCA9IHRoaXMuc3VibWl0TG9hZGluZyBpbnN0YW5jZW9mIE9ic2VydmFibGUgPyB0aGlzLnN1Ym1pdExvYWRpbmcgOiBvZih0aGlzLnN1Ym1pdExvYWRpbmcpO1xuXG4gICAgICAgIGlmICh0aGlzLmRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgIC8vIGluaXQgZmllbGRzIGZvciBmb3JtbHlcbiAgICAgICAgICAgIHRoaXMuZm9ybUZpZWxkcyA9IEVkaXRvckZvcm1seVV0aWwuY3JlYXRlRm9ybWx5Q29uZmlnRnJvbURlc2NyaXB0b3IodGhpcy5kZXNjcmlwdG9yLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybVN0YXRlKCk7XG5cbiAgICAgICAgICAgIC8vIGxldCB0aGUgdXNlciBrbm93LCB0aGF0IGFkZGluZyBuZXcgdmFsdWUgaW4gdGFibGUgdmlldyB3aXRoIGxvY2FsaXphdGlvbnMgaXMgb25seSBzdXBwb3J0ZWQgaW4gdGhlIGRlZmF1bHQgbGFuZ3VhZ2VcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IuaXNMb2NhbGl6ZWQgJiZcbiAgICAgICAgICAgICAgICAodGhpcy5kZXNjcmlwdG9yLnRhYmxldmlld0VkaXRvclR5cGUgPT09IFRhYmxldmlld0VkaXRvclR5cGVFbnVtLkFkZCB8fCB0aGlzLmRlc2NyaXB0b3IudGFibGV2aWV3RWRpdG9yVHlwZSA9PT0gVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uRWRpdClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybU1lc3NhZ2VzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblV0aWwuZ2V0Rm9ybUVkaXRvckluZm9NZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ21uZ0VkaXRvci5sb2NhbGl6YXRpb25zLmFkZEluRGVmYXVsdExhbmd1YWdlVGl0bGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ21uZ0VkaXRvci5sb2NhbGl6YXRpb25zLmFkZEluRGVmYXVsdExhbmd1YWdlRGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAge2RlZmF1bHRMYW5ndWFnZTogdGhpcy5tbmdDb21tb25zU2VydmljZS5kZWZhdWx0RGF0YUxhbmd1YWdlfVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVtaXQgbGlmZWN5Y2xlIGV2ZW50XG4gICAgICAgIHRoaXMuZGVzY3JpcHRvcj8ubmV4dEV2ZW50KE1uZ0Zvcm1FdmVudFR5cGVFbnVtLkNvbXBvbmVudExpZmVjeWNsZSwgTW5nRm9ybUVkaXRvckNvbXBvbmVudCwgdGhpcywge1xuICAgICAgICAgICAgZXZlbnRTdWJ0eXBlOiBNbmdGb3JtRmllbGRFdmVudENvbXBvbmVudFN1YnR5cGUuT05fSU5JVFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgIHRoaXMuZm9ybS52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoMjUwKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSkuc3Vic2NyaWJlKHYgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvcj8ubmV4dEV2ZW50KE1uZ0Zvcm1FdmVudFR5cGVFbnVtLlZhbHVlQ2hhbmdlLCBNbmdGb3JtRWRpdG9yQ29tcG9uZW50LCB0aGlzLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2LFxuICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWU6ICgpID0+IHRoaXMuZ2V0Rm9ybVZhbHVlKClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlc1sndmlld0NvbnRhaW5lckluaXQnXSAmJiAhY2hhbmdlc1sndmlld0NvbnRhaW5lckluaXQnXS5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyU3ViamVjdC5uZXh0KGNoYW5nZXNbJ3ZpZXdDb250YWluZXJJbml0J10gYXMgYW55KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlc1snaXNGb3JtRGlzYWJsZWQnXSAmJiAhY2hhbmdlc1snaXNGb3JtRGlzYWJsZWQnXS5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtU3RhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlc1snaXRlbSddICYmICFjaGFuZ2VzWydpdGVtJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRGb3JtTW9kZWwodGhpcy5pdGVtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuXG4gICAgICAgIC8vIGVtaXQgbGlmZWN5Y2xlIGV2ZW50XG4gICAgICAgIHRoaXMuZGVzY3JpcHRvcj8ubmV4dEV2ZW50KE1uZ0Zvcm1FdmVudFR5cGVFbnVtLkNvbXBvbmVudExpZmVjeWNsZSwgTW5nRm9ybUVkaXRvckNvbXBvbmVudCwgdGhpcywge1xuICAgICAgICAgICAgZXZlbnRTdWJ0eXBlOiBNbmdGb3JtRmllbGRFdmVudENvbXBvbmVudFN1YnR5cGUuT05fREVTVFJPWVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gY29tcGxldGUgZW1pdHRpbmcgZXZlbnRzXG4gICAgICAgIHRoaXMuZGVzY3JpcHRvcj8uY29tcGxldGVFdmVudHMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3VibWl0KCkge1xuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbkVsZW1lbnRSZWY/Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIG9uU3VibWl0KGV2ZW50OiBFdmVudCkge1xuICAgICAgICB0aGlzLmZvcm1PcHRpb25zLmZvcm1TdGF0ZS5zdWJtaXR0ZWRPbiA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuZm9ybU1lc3NhZ2VzID0gW107XG5cbiAgICAgICAgY29uc3QgZm9ybVN1Ym1pdEl0ZW0gPSB0aGlzLmdldEZvcm1WYWx1ZSgpO1xuICAgICAgICBpZiAodGhpcy5mb3JtLnZhbGlkKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1TdWJtaXRFdmVudEVtaXR0ZXIubmV4dChuZXcgTW5nRm9ybUVkaXRvclN1Ym1pdEV2ZW50KGZvcm1TdWJtaXRJdGVtKSk7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3I/Lm5leHRFdmVudChNbmdGb3JtRXZlbnRUeXBlRW51bS5TdWJtaXQsIE1uZ0Zvcm1FZGl0b3JDb21wb25lbnQsIHRoaXMsIHtcbiAgICAgICAgICAgICAgICBzdWJtaXRWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzdWJtaXRWYWx1ZTogZm9ybVN1Ym1pdEl0ZW1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZmluZCBhbmQgbWFyayBpbnZhbGlkIHRhYnNcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1GaWVsZHNbMF0udHlwZSA9PT0gJ3RhYnMnICYmIHRoaXMuZm9ybUZpZWxkc1swXS5maWVsZEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0YWIgb2YgdGhpcy5mb3JtRmllbGRzWzBdLmZpZWxkR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNJbnZhbGlkID0gdGhpcy5pc0FueUZpZWxkSW52YWxpZCh0YWIuZmllbGRHcm91cCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybU9wdGlvbnMuZm9ybVN0YXRlWyd0YWJfJyArICh0YWIuaWQgPyB0YWIuaWQgOiAodGFiLnByb3BzIGFzIE1uZ0Zvcm1seUZpZWxkQ29uZmlnKS5wcm9wcy5sYWJlbCkgKyAnX2ludmFsaWQnXSA9IGlzSW52YWxpZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBNbmdGb3JtRWRpdG9yU3VibWl0RXZlbnQoZm9ybVN1Ym1pdEl0ZW0pO1xuICAgICAgICAgICAgZXZlbnQuc3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5mb3JtTWVzc2FnZXMucHVzaChOb3RpZmljYXRpb25VdGlsLmdldEZvcm1FZGl0b3JXYXJuaW5nTWVzc2FnZSh0aGlzLnRyYW5zbGF0ZVNlcnZpY2UsICdtbmdFZGl0b3IuaW52YWxpZEZvcm1Ub2FzdFRpdGxlJywgJ21uZ0VkaXRvci5pbnZhbGlkRm9ybVRvYXN0TWVzc2FnZScpKTtcblxuICAgICAgICAgICAgdGhpcy5mb3JtU3VibWl0RXZlbnRFbWl0dGVyLm5leHQoZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy5kZXNjcmlwdG9yPy5uZXh0RXZlbnQoTW5nRm9ybUV2ZW50VHlwZUVudW0uU3VibWl0LCBNbmdGb3JtRWRpdG9yQ29tcG9uZW50LCB0aGlzLCB7XG4gICAgICAgICAgICAgICAgc3VibWl0VmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHN1Ym1pdFZhbHVlOiBmb3JtU3VibWl0SXRlbVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Rm9ybVZhbHVlKCk6IFQge1xuICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSBPYmplY3RVdGlsLmRlZXBDb3B5KHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpLCB7bWFwR2V0dGVyc1RvUHJvcGVydGllczogdHJ1ZX0pO1xuXG4gICAgICAgIHRoaXMuZGVzY3JpcHRvcj8uZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLnNldHRlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwbGl0UGF0aCA9IGZpZWxkLnByb3BlcnR5LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgbGV0IGZpZWxkVmFsdWUgPSBmb3JtVmFsdWU7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdFBhdGgubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTdWJQYXRoID0gc3BsaXRQYXRoW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWVbY3VycmVudFN1YlBhdGhdICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRWYWx1ZVtjdXJyZW50U3ViUGF0aF0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPSBmaWVsZFZhbHVlW2N1cnJlbnRTdWJQYXRoXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gZmllbGRWYWx1ZVtzcGxpdFBhdGhbc3BsaXRQYXRoLmxlbmd0aCAtIDFdXTtcbiAgICAgICAgICAgICAgICBmaWVsZC5zZXR0ZXIoZm9ybVZhbHVlLCBmaWVsZFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmb3JtVmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0Rm9ybU1vZGVsKGl0ZW0/OiBUKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxJdGVtUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybU1vZGVsID0gKE9iamVjdFV0aWwuZGVlcENvcHkoaXRlbSwge21hcEdldHRlcnNUb1Byb3BlcnRpZXM6IHRydWV9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA/PyB7fTtcblxuICAgICAgICB0aGlzLmRlc2NyaXB0b3I/LmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGlmIChmaWVsZC5nZXR0ZXIgJiYgaXRlbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwbGl0UGF0aCA9IGZpZWxkLnByb3BlcnR5LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRPYmplY3QgPSBmb3JtTW9kZWw7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0UGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U3ViUGF0aCA9IHNwbGl0UGF0aFtpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IHNwbGl0UGF0aC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T2JqZWN0W2N1cnJlbnRTdWJQYXRoXSA9IGZpZWxkLmdldHRlcihpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudE9iamVjdFtjdXJyZW50U3ViUGF0aF0gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9iamVjdFtjdXJyZW50U3ViUGF0aF0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9iamVjdCA9IGN1cnJlbnRPYmplY3RbY3VycmVudFN1YlBhdGhdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZvcm1PcHRpb25zLnJlc2V0TW9kZWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIGNvdWxkIG5vdCBiZSBpbml0aWF0ZWQgeWV0XG4gICAgICAgICAgICB0aGlzLmZvcm1PcHRpb25zLnJlc2V0TW9kZWwodGhpcy5mb3JtTW9kZWwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9ybU1vZGVsID0gZm9ybU1vZGVsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JtRmllbGQoa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZEZvcm1GaWVsZCh0aGlzLmZvcm0sIGtleS5zcGxpdCgnLicpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Rm9ybUZpZWxkVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZ2V0Rm9ybUZpZWxkKGtleSk7XG4gICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgICBjb250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgVmFsdWUgd2FzIG5vdCBzZXQsIGJlY2F1c2UgZmllbGQgJHtrZXl9IHdhcyBub3QgZm91bmQuYCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcGF0Y2hGb3JtRmllbGRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5nZXRGb3JtRmllbGQoa2V5KTtcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICAgIGNvbnRyb2wucGF0Y2hWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFZhbHVlIHdhcyBub3Qgc2V0LCBiZWNhdXNlIGZpZWxkICR7a2V5fSB3YXMgbm90IGZvdW5kLmApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0Rm9ybUZpZWxkVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlPzogYW55KSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmdldEZvcm1GaWVsZChrZXkpO1xuICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgICAgY29udHJvbC5yZXNldCh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFZhbHVlIHdhcyBub3Qgc2V0LCBiZWNhdXNlIGZpZWxkICR7a2V5fSB3YXMgbm90IGZvdW5kLmApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kRm9ybUZpZWxkKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwga2V5UGF0aDogc3RyaW5nW10pOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsIHtcbiAgICAgICAgaWYgKGtleVBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udHJvbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5UGF0aC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250cm9sLmdldChrZXlQYXRoWzBdKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dENvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IG51bGwgPSBudWxsO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICAgICAgbmV4dENvbnRyb2wgPSBjb250cm9sLmdldChrZXlQYXRoWzBdKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgICAgICBjb25zdCBpZHggPSAra2V5UGF0aFswXTtcbiAgICAgICAgICAgIGlmICghaXNOYU4oaWR4KSkge1xuICAgICAgICAgICAgICAgIG5leHRDb250cm9sID0gY29udHJvbC5hdChpZHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb250cm9sKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5maW5kRm9ybUZpZWxkKG5leHRDb250cm9sISwga2V5UGF0aC5zbGljZSgxKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0FueUZpZWxkSW52YWxpZChmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXSk6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgICAgICAgbGV0IGZpZWxkSW52YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQuZmllbGRHcm91cCkpIHtcbiAgICAgICAgICAgICAgICBmaWVsZEludmFsaWQgPSB0aGlzLmlzQW55RmllbGRJbnZhbGlkKGZpZWxkLmZpZWxkR3JvdXApO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZmllbGQudHlwZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBmaWVsZEludmFsaWQgPSAhZmllbGQuZm9ybUNvbnRyb2w/LnZhbGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpZWxkSW52YWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUZvcm1TdGF0ZSgpIHtcbiAgICAgICAgY29uc3QgaXNEaXNhYmxlZCA9IHRoaXMuaXNGb3JtRGlzYWJsZWQgfHwgdGhpcy5kZXNjcmlwdG9yPy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fCB0aGlzLmRlc2NyaXB0b3I/LnRhYmxldmlld0VkaXRvclR5cGUgPT09IFRhYmxldmlld0VkaXRvclR5cGVFbnVtLkRldGFpbHM7XG4gICAgICAgIHRoaXMuZm9ybU9wdGlvbnMuZm9ybVN0YXRlLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZSBTZXRzIGZvcm0gc3RhdGUgYmFzZWQgb24gZWRpdG9yIGRlc2NyaXB0b3IgdHlwZS5cbiAgICAgKiBQb3NzaWJsZSBvcHRpb25zIGFyZTogZGlzYWJsZWQsIGFkZCBvciBlZGl0LlxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0SW5pdGlhbEZvcm1TdGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGVzY3JpcHRvcj8udGFibGV2aWV3RWRpdG9yVHlwZSA9PT0gVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uQWRkKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1PcHRpb25zLmZvcm1TdGF0ZS5hZGQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGVzY3JpcHRvcj8udGFibGV2aWV3RWRpdG9yVHlwZSA9PT0gVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uRWRpdCkge1xuICAgICAgICAgICAgdGhpcy5mb3JtT3B0aW9ucy5mb3JtU3RhdGUuZWRpdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVGb3JtU3RhdGUoKTtcbiAgICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAobmdTdWJtaXQpPVwib25TdWJtaXQoJGV2ZW50KVwiPlxuICAgIDxmb3JtbHktZm9ybSBbZm9ybV09XCJmb3JtXCIgW2ZpZWxkc109XCJmb3JtRmllbGRzXCIgW29wdGlvbnNdPVwiZm9ybU9wdGlvbnNcIiBbbW9kZWxdPVwiZm9ybU1vZGVsXCI+PC9mb3JtbHktZm9ybT5cbiAgICA8YnV0dG9uXG4gICAgICAgICNzdWJtaXRCdXR0b25cbiAgICAgICAgcEJ1dHRvblxuICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgY2xhc3M9XCJoaWRkZW5cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybS5kaXNhYmxlZFwiXG4gICAgICAgIFtsb2FkaW5nXT1cIihzdWJtaXRMb2FkaW5nJCB8IGFzeW5jKSA/PyBmYWxzZVwiXG4gICAgICAgIGxvYWRpbmdJY29uPVwicGkgcGktc3BpbiBwaS1zcGlubmVyXCI+PC9idXR0b24+XG48L2Zvcm0+XG48cC1tZXNzYWdlcyBbdmFsdWVdPVwiZm9ybU1lc3NhZ2VzXCIgW2VuYWJsZVNlcnZpY2VdPVwiZmFsc2VcIj48L3AtbWVzc2FnZXM+XG4iXX0=
|
|
287
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vZWRpdG9yL2Zvcm0tZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9mb3JtL2VkaXRvci9mb3JtLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFDTixTQUFTLEVBR1QsU0FBUyxFQUNULE1BQU0sRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWtCLFNBQVMsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxRixPQUFPLEVBQXVDLFlBQVksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3BGLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRXJELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFDLFVBQVUsRUFBRSxhQUFhLEVBQWdCLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFckcsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFekQsT0FBTyxF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QjtzQkFBL0MsS0FBSzt1QkFBQyxlQUFlO2dCQUtOLGNBQWM7c0JBQTdCLEtBQUs7Z0JBR3VCLHNCQUFzQjtzQkFBbEQsTUFBTTt1QkFBQyxZQUFZO2dCQUcwQixTQUFTO3NCQUF0RCxlQUFlO3VCQUFDLG9CQUFvQjtnQkFDSCxzQkFBc0I7c0JBQXZELFNBQVM7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXN5bmNQaXBlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBUeXBlLFxuICAgIFZpZXdDaGlsZCxcbiAgICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtGb3JtbHlGaWVsZENvbmZpZywgRm9ybWx5Rm9ybU9wdGlvbnMsIEZvcm1seU1vZHVsZX0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtNZXNzYWdlfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQge0J1dHRvbk1vZHVsZX0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xuaW1wb3J0IHtNZXNzYWdlc01vZHVsZX0gZnJvbSAncHJpbWVuZy9tZXNzYWdlcyc7XG5pbXBvcnQge09ic2VydmFibGUsIFJlcGxheVN1YmplY3QsIFN1YnNjcmlwdGlvbiwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgb2Z9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge0VkaXRvckRlc2NyaXB0b3JJbnN0fSBmcm9tICcuLi8uLi8uLi9kZXNjcmlwdG9ycy9lZGl0b3InO1xuaW1wb3J0IHtUYWJsZXZpZXdFZGl0b3JUeXBlRW51bX0gZnJvbSAnLi4vLi4vLi4vZGVzY3JpcHRvcnMvdHlwZXMnO1xuaW1wb3J0IHtNbmdUZW1wbGF0ZURpcmVjdGl2ZX0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcyc7XG5pbXBvcnQge0lWaWV3Q29udGFpbmVyfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtNbmdDb21tb25zU2VydmljZSwgTW5nTG9nZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHtFZGl0b3JGb3JtbHlVdGlsLCBOb3RpZmljYXRpb25VdGlsLCBPYmplY3RVdGlsfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5pbXBvcnQge01uZ0Zvcm1seUZpZWxkQ29uZmlnfSBmcm9tICcuLi9mb3JtbHkvbW9kZWxzJztcbmltcG9ydCB7SUZvcm1FZGl0b3JDb21wb25lbnQsIE1uZ0Zvcm1FZGl0b3JTdWJtaXRFdmVudCwgTW5nRm9ybUV2ZW50VHlwZUVudW0sIE1uZ0Zvcm1GaWVsZEV2ZW50Q29tcG9uZW50U3VidHlwZX0gZnJvbSAnLi4vbW9kZWxzJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ21uZy1mb3JtLWVkaXRvcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgICBpbXBvcnRzOiBbRm9ybWx5TW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBNZXNzYWdlc01vZHVsZSwgQXN5bmNQaXBlLCBCdXR0b25Nb2R1bGVdLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE1uZ0Zvcm1FZGl0b3JDb21wb25lbnQ8VCA9IGFueSwgUyA9IGFueT4gaW1wbGVtZW50cyBJRm9ybUVkaXRvckNvbXBvbmVudDxUPiwgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbW5nQ29tbW9uc1NlcnZpY2UgPSBpbmplY3QoTW5nQ29tbW9uc1NlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gaW5qZWN0KE1uZ0xvZ2dlclNlcnZpY2UpLmNyZWF0ZSgnTW5nRm9ybUVkaXRvckNvbXBvbmVudCcpO1xuXG4gICAgLy8gbWV0YWRhdGEgYW5kIGVkaXRvciBtb2RlIGlucHV0XG4gICAgQElucHV0KCkgcHVibGljIGRlc2NyaXB0b3I/OiBFZGl0b3JEZXNjcmlwdG9ySW5zdDxUPjtcbiAgICBASW5wdXQoKSBwdWJsaWMgc3VibWl0TG9hZGluZzogT2JzZXJ2YWJsZTxib29sZWFuPiB8IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8vIGRhdGEgc291cmNlIGlucHV0cztcbiAgICBASW5wdXQoKSBwdWJsaWMgaXRlbT86IFQ7XG4gICAgQElucHV0KCd2aWV3Q29udGFpbmVyJykgcHVibGljIHZpZXdDb250YWluZXJJbml0PzogSVZpZXdDb250YWluZXI8VCwgUz47XG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyU3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PElWaWV3Q29udGFpbmVyPFQsIHVua25vd24+PigxKTtcbiAgICBwdWJsaWMgdmlld0NvbnRhaW5lciQgPSB0aGlzLnZpZXdDb250YWluZXJTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgLy8gZXh0cmEgZmVhdHVyZXMgaW5wdXRcbiAgICBASW5wdXQoKSBwdWJsaWMgaXNGb3JtRGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIC8vIGV2ZW50IG91dHB1dHNcbiAgICBAT3V0cHV0KCdmb3JtU3VibWl0JykgcHVibGljIGZvcm1TdWJtaXRFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPE1uZ0Zvcm1FZGl0b3JTdWJtaXRFdmVudDxUPj4oKTtcblxuICAgIC8vIGNvbnRlbnQgYW5kIHZpZXcgcXVlcmllc1xuICAgIEBDb250ZW50Q2hpbGRyZW4oTW5nVGVtcGxhdGVEaXJlY3RpdmUpIHB1YmxpYyB0ZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8TW5nVGVtcGxhdGVEaXJlY3RpdmU+O1xuICAgIEBWaWV3Q2hpbGQoJ3N1Ym1pdEJ1dHRvbicpIHB1YmxpYyBzdWJtaXRCdXR0b25FbGVtZW50UmVmPzogRWxlbWVudFJlZjtcblxuICAgIHB1YmxpYyBmb3JtOiBGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcbiAgICBwdWJsaWMgZm9ybU9wdGlvbnM6IEZvcm1seUZvcm1PcHRpb25zID0ge1xuICAgICAgICBmb3JtU3RhdGU6IHtcbiAgICAgICAgICAgIGFkZDogZmFsc2UsXG4gICAgICAgICAgICBlZGl0OiBmYWxzZSxcbiAgICAgICAgICAgIGRpc2FibGVkOiBmYWxzZVxuICAgICAgICB9XG4gICAgfTtcbiAgICBwdWJsaWMgZm9ybUZpZWxkcyE6IEZvcm1seUZpZWxkQ29uZmlnW107XG4gICAgcHVibGljIGZvcm1Nb2RlbDogYW55ID0ge307XG4gICAgcHVibGljIGZvcm1NZXNzYWdlczogTWVzc2FnZVtdID0gW107XG4gICAgcHVibGljIHN1Ym1pdExvYWRpbmckITogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICBwcml2YXRlIG9yaWdpbmFsSXRlbVByb3RvdHlwZT86IFR5cGU8VD47XG5cbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbEZvcm1TdGF0ZSgpO1xuICAgICAgICB0aGlzLnJlc2V0Rm9ybU1vZGVsKHRoaXMuaXRlbSk7XG4gICAgICAgIHRoaXMuc3VibWl0TG9hZGluZyQgPSB0aGlzLnN1Ym1pdExvYWRpbmcgaW5zdGFuY2VvZiBPYnNlcnZhYmxlID8gdGhpcy5zdWJtaXRMb2FkaW5nIDogb2YodGhpcy5zdWJtaXRMb2FkaW5nKTtcblxuICAgICAgICBpZiAodGhpcy5kZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICAvLyBpbml0IGZpZWxkcyBmb3IgZm9ybWx5XG4gICAgICAgICAgICB0aGlzLmZvcm1GaWVsZHMgPSBFZGl0b3JGb3JtbHlVdGlsLmNyZWF0ZUZvcm1seUNvbmZpZ0Zyb21EZXNjcmlwdG9yKHRoaXMuZGVzY3JpcHRvciwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm1TdGF0ZSgpO1xuXG4gICAgICAgICAgICAvLyBsZXQgdGhlIHVzZXIga25vdywgdGhhdCBhZGRpbmcgbmV3IHZhbHVlIGluIHRhYmxlIHZpZXcgd2l0aCBsb2NhbGl6YXRpb25zIGlzIG9ubHkgc3VwcG9ydGVkIGluIHRoZSBkZWZhdWx0IGxhbmd1YWdlXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5kZXNjcmlwdG9yLmlzTG9jYWxpemVkICYmXG4gICAgICAgICAgICAgICAgKHRoaXMuZGVzY3JpcHRvci50YWJsZXZpZXdFZGl0b3JUeXBlID09PSBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5BZGQgfHwgdGhpcy5kZXNjcmlwdG9yLnRhYmxldmlld0VkaXRvclR5cGUgPT09IFRhYmxldmlld0VkaXRvclR5cGVFbnVtLkVkaXQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1NZXNzYWdlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25VdGlsLmdldEZvcm1FZGl0b3JJbmZvTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICdtbmdFZGl0b3IubG9jYWxpemF0aW9ucy5hZGRJbkRlZmF1bHRMYW5ndWFnZVRpdGxlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdtbmdFZGl0b3IubG9jYWxpemF0aW9ucy5hZGRJbkRlZmF1bHRMYW5ndWFnZURlc2NyaXB0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtkZWZhdWx0TGFuZ3VhZ2U6IHRoaXMubW5nQ29tbW9uc1NlcnZpY2UuZGVmYXVsdERhdGFMYW5ndWFnZX1cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbWl0IGxpZmVjeWNsZSBldmVudFxuICAgICAgICB0aGlzLmRlc2NyaXB0b3I/Lm5leHRFdmVudChNbmdGb3JtRXZlbnRUeXBlRW51bS5Db21wb25lbnRMaWZlY3ljbGUsIE1uZ0Zvcm1FZGl0b3JDb21wb25lbnQsIHRoaXMsIHtcbiAgICAgICAgICAgIGV2ZW50U3VidHlwZTogTW5nRm9ybUZpZWxkRXZlbnRDb21wb25lbnRTdWJ0eXBlLk9OX0lOSVRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDI1MCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLnN1YnNjcmliZSh2ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3I/Lm5leHRFdmVudChNbmdGb3JtRXZlbnRUeXBlRW51bS5WYWx1ZUNoYW5nZSwgTW5nRm9ybUVkaXRvckNvbXBvbmVudCwgdGhpcywge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdixcbiAgICAgICAgICAgICAgICAgICAgZm9ybVZhbHVlOiAoKSA9PiB0aGlzLmdldEZvcm1WYWx1ZSgpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3ZpZXdDb250YWluZXJJbml0J10gJiYgIWNoYW5nZXNbJ3ZpZXdDb250YWluZXJJbml0J10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMudmlld0NvbnRhaW5lclN1YmplY3QubmV4dChjaGFuZ2VzWyd2aWV3Q29udGFpbmVySW5pdCddIGFzIGFueSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXNbJ2lzRm9ybURpc2FibGVkJ10gJiYgIWNoYW5nZXNbJ2lzRm9ybURpc2FibGVkJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybVN0YXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXNbJ2l0ZW0nXSAmJiAhY2hhbmdlc1snaXRlbSddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybU1vZGVsKHRoaXMuaXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcblxuICAgICAgICAvLyBlbWl0IGxpZmVjeWNsZSBldmVudFxuICAgICAgICB0aGlzLmRlc2NyaXB0b3I/Lm5leHRFdmVudChNbmdGb3JtRXZlbnRUeXBlRW51bS5Db21wb25lbnRMaWZlY3ljbGUsIE1uZ0Zvcm1FZGl0b3JDb21wb25lbnQsIHRoaXMsIHtcbiAgICAgICAgICAgIGV2ZW50U3VidHlwZTogTW5nRm9ybUZpZWxkRXZlbnRDb21wb25lbnRTdWJ0eXBlLk9OX0RFU1RST1lcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGNvbXBsZXRlIGVtaXR0aW5nIGV2ZW50c1xuICAgICAgICB0aGlzLmRlc2NyaXB0b3I/LmNvbXBsZXRlRXZlbnRzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN1Ym1pdCgpIHtcbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b25FbGVtZW50UmVmPy5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHB1YmxpYyBvblN1Ym1pdChldmVudDogRXZlbnQpIHtcbiAgICAgICAgdGhpcy5mb3JtT3B0aW9ucy5mb3JtU3RhdGUuc3VibWl0dGVkT24gPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLmZvcm1NZXNzYWdlcyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGZvcm1TdWJtaXRJdGVtID0gdGhpcy5nZXRGb3JtVmFsdWUoKTtcbiAgICAgICAgaWYgKHRoaXMuZm9ybS52YWxpZCkge1xuICAgICAgICAgICAgdGhpcy5mb3JtU3VibWl0RXZlbnRFbWl0dGVyLm5leHQobmV3IE1uZ0Zvcm1FZGl0b3JTdWJtaXRFdmVudChmb3JtU3VibWl0SXRlbSkpO1xuICAgICAgICAgICAgdGhpcy5kZXNjcmlwdG9yPy5uZXh0RXZlbnQoTW5nRm9ybUV2ZW50VHlwZUVudW0uU3VibWl0LCBNbmdGb3JtRWRpdG9yQ29tcG9uZW50LCB0aGlzLCB7XG4gICAgICAgICAgICAgICAgc3VibWl0VmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgc3VibWl0VmFsdWU6IGZvcm1TdWJtaXRJdGVtXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGZpbmQgYW5kIG1hcmsgaW52YWxpZCB0YWJzXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtRmllbGRzWzBdLnR5cGUgPT09ICd0YWJzJyAmJiB0aGlzLmZvcm1GaWVsZHNbMF0uZmllbGRHcm91cCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFiIG9mIHRoaXMuZm9ybUZpZWxkc1swXS5maWVsZEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzSW52YWxpZCA9IHRoaXMuaXNBbnlGaWVsZEludmFsaWQodGFiLmZpZWxkR3JvdXApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1PcHRpb25zLmZvcm1TdGF0ZVsndGFiXycgKyAodGFiLmlkID8gdGFiLmlkIDogKHRhYi5wcm9wcyBhcyBNbmdGb3JtbHlGaWVsZENvbmZpZykucHJvcHMubGFiZWwpICsgJ19pbnZhbGlkJ10gPSBpc0ludmFsaWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgTW5nRm9ybUVkaXRvclN1Ym1pdEV2ZW50KGZvcm1TdWJtaXRJdGVtKTtcbiAgICAgICAgICAgIGV2ZW50LnN1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZm9ybU1lc3NhZ2VzLnB1c2goTm90aWZpY2F0aW9uVXRpbC5nZXRGb3JtRWRpdG9yV2FybmluZ01lc3NhZ2UodGhpcy50cmFuc2xhdGVTZXJ2aWNlLCAnbW5nRWRpdG9yLmludmFsaWRGb3JtVG9hc3RUaXRsZScsICdtbmdFZGl0b3IuaW52YWxpZEZvcm1Ub2FzdE1lc3NhZ2UnKSk7XG5cbiAgICAgICAgICAgIHRoaXMuZm9ybVN1Ym1pdEV2ZW50RW1pdHRlci5uZXh0KGV2ZW50KTtcbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvcj8ubmV4dEV2ZW50KE1uZ0Zvcm1FdmVudFR5cGVFbnVtLlN1Ym1pdCwgTW5nRm9ybUVkaXRvckNvbXBvbmVudCwgdGhpcywge1xuICAgICAgICAgICAgICAgIHN1Ym1pdFZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzdWJtaXRWYWx1ZTogZm9ybVN1Ym1pdEl0ZW1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1WYWx1ZSgpOiBUIHtcbiAgICAgICAgY29uc3QgZm9ybVZhbHVlID0gT2JqZWN0VXRpbC5kZWVwQ29weSh0aGlzLmZvcm0uZ2V0UmF3VmFsdWUoKSwge21hcEdldHRlcnNUb1Byb3BlcnRpZXM6IHRydWV9KTtcblxuICAgICAgICB0aGlzLmRlc2NyaXB0b3I/LmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5zZXR0ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzcGxpdFBhdGggPSBmaWVsZC5wcm9wZXJ0eS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgIGxldCBmaWVsZFZhbHVlID0gZm9ybVZhbHVlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXRQYXRoLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U3ViUGF0aCA9IHNwbGl0UGF0aFtpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlW2N1cnJlbnRTdWJQYXRoXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkVmFsdWVbY3VycmVudFN1YlBhdGhdID0ge307XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gZmllbGRWYWx1ZVtjdXJyZW50U3ViUGF0aF07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZmllbGRWYWx1ZSA9IGZpZWxkVmFsdWVbc3BsaXRQYXRoW3NwbGl0UGF0aC5sZW5ndGggLSAxXV07XG4gICAgICAgICAgICAgICAgZmllbGQuc2V0dGVyKGZvcm1WYWx1ZSwgZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZm9ybVZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXNldEZvcm1Nb2RlbChpdGVtPzogVCkge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLm9yaWdpbmFsSXRlbVByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihpdGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvcm1Nb2RlbCA9IChPYmplY3RVdGlsLmRlZXBDb3B5KGl0ZW0sIHttYXBHZXR0ZXJzVG9Qcm9wZXJ0aWVzOiB0cnVlfSkgYXMgUmVjb3JkPHN0cmluZywgYW55PikgPz8ge307XG5cbiAgICAgICAgdGhpcy5kZXNjcmlwdG9yPy5maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICBpZiAoZmllbGQuZ2V0dGVyICYmIGl0ZW0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzcGxpdFBhdGggPSBmaWVsZC5wcm9wZXJ0eS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50T2JqZWN0ID0gZm9ybU1vZGVsO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdFBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFN1YlBhdGggPSBzcGxpdFBhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBzcGxpdFBhdGgubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9iamVjdFtjdXJyZW50U3ViUGF0aF0gPSBmaWVsZC5nZXR0ZXIoaXRlbT8uW2ZpZWxkLnByb3BlcnR5IGFzIGtleW9mIG9iamVjdF0sIGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50T2JqZWN0W2N1cnJlbnRTdWJQYXRoXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T2JqZWN0W2N1cnJlbnRTdWJQYXRoXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T2JqZWN0ID0gY3VycmVudE9iamVjdFtjdXJyZW50U3ViUGF0aF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZm9ybU9wdGlvbnMucmVzZXRNb2RlbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gY291bGQgbm90IGJlIGluaXRpYXRlZCB5ZXRcbiAgICAgICAgICAgIHRoaXMuZm9ybU9wdGlvbnMucmVzZXRNb2RlbCh0aGlzLmZvcm1Nb2RlbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb3JtTW9kZWwgPSBmb3JtTW9kZWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1GaWVsZChrZXk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5maW5kRm9ybUZpZWxkKHRoaXMuZm9ybSwga2V5LnNwbGl0KCcuJykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRGb3JtRmllbGRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5nZXRGb3JtRmllbGQoa2V5KTtcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBWYWx1ZSB3YXMgbm90IHNldCwgYmVjYXVzZSBmaWVsZCAke2tleX0gd2FzIG5vdCBmb3VuZC5gKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBwYXRjaEZvcm1GaWVsZFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmdldEZvcm1GaWVsZChrZXkpO1xuICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgICAgY29udHJvbC5wYXRjaFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgVmFsdWUgd2FzIG5vdCBzZXQsIGJlY2F1c2UgZmllbGQgJHtrZXl9IHdhcyBub3QgZm91bmQuYCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRGb3JtRmllbGRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZ2V0Rm9ybUZpZWxkKGtleSk7XG4gICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgICBjb250cm9sLnJlc2V0KHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgVmFsdWUgd2FzIG5vdCBzZXQsIGJlY2F1c2UgZmllbGQgJHtrZXl9IHdhcyBub3QgZm91bmQuYCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRGb3JtRmllbGQoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBrZXlQYXRoOiBzdHJpbmdbXSk6IEFic3RyYWN0Q29udHJvbCB8IG51bGwge1xuICAgICAgICBpZiAoa2V5UGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb250cm9sO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXlQYXRoLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2wuZ2V0KGtleVBhdGhbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBuZXh0Q29udHJvbDogQWJzdHJhY3RDb250cm9sIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICAgICAgICBuZXh0Q29udHJvbCA9IGNvbnRyb2wuZ2V0KGtleVBhdGhbMF0pO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9ICtrZXlQYXRoWzBdO1xuICAgICAgICAgICAgaWYgKCFpc05hTihpZHgpKSB7XG4gICAgICAgICAgICAgICAgbmV4dENvbnRyb2wgPSBjb250cm9sLmF0KGlkeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvbnRyb2wpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRGb3JtRmllbGQobmV4dENvbnRyb2whLCBrZXlQYXRoLnNsaWNlKDEpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQW55RmllbGRJbnZhbGlkKGZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdKTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICAgICAgICBsZXQgZmllbGRJbnZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZC5maWVsZEdyb3VwKSkge1xuICAgICAgICAgICAgICAgIGZpZWxkSW52YWxpZCA9IHRoaXMuaXNBbnlGaWVsZEludmFsaWQoZmllbGQuZmllbGRHcm91cCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZC50eXBlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGZpZWxkSW52YWxpZCA9ICFmaWVsZC5mb3JtQ29udHJvbD8udmFsaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmllbGRJbnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlRm9ybVN0YXRlKCkge1xuICAgICAgICBjb25zdCBpc0Rpc2FibGVkID0gdGhpcy5pc0Zvcm1EaXNhYmxlZCB8fCB0aGlzLmRlc2NyaXB0b3I/LmRpc2FibGVkID09PSB0cnVlIHx8IHRoaXMuZGVzY3JpcHRvcj8udGFibGV2aWV3RWRpdG9yVHlwZSA9PT0gVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uRGV0YWlscztcbiAgICAgICAgdGhpcy5mb3JtT3B0aW9ucy5mb3JtU3RhdGUuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlIFNldHMgZm9ybSBzdGF0ZSBiYXNlZCBvbiBlZGl0b3IgZGVzY3JpcHRvciB0eXBlLlxuICAgICAqIFBvc3NpYmxlIG9wdGlvbnMgYXJlOiBkaXNhYmxlZCwgYWRkIG9yIGVkaXQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRJbml0aWFsRm9ybVN0YXRlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kZXNjcmlwdG9yPy50YWJsZXZpZXdFZGl0b3JUeXBlID09PSBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5BZGQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybU9wdGlvbnMuZm9ybVN0YXRlLmFkZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kZXNjcmlwdG9yPy50YWJsZXZpZXdFZGl0b3JUeXBlID09PSBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5FZGl0KSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1PcHRpb25zLmZvcm1TdGF0ZS5lZGl0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1TdGF0ZSgpO1xuICAgIH1cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgkZXZlbnQpXCI+XG4gICAgPGZvcm1seS1mb3JtIFtmb3JtXT1cImZvcm1cIiBbZmllbGRzXT1cImZvcm1GaWVsZHNcIiBbb3B0aW9uc109XCJmb3JtT3B0aW9uc1wiIFttb2RlbF09XCJmb3JtTW9kZWxcIj48L2Zvcm1seS1mb3JtPlxuICAgIDxidXR0b25cbiAgICAgICAgI3N1Ym1pdEJ1dHRvblxuICAgICAgICBwQnV0dG9uXG4gICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICBjbGFzcz1cImhpZGRlblwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJmb3JtLmRpc2FibGVkXCJcbiAgICAgICAgW2xvYWRpbmddPVwiKHN1Ym1pdExvYWRpbmckIHwgYXN5bmMpID8/IGZhbHNlXCJcbiAgICAgICAgbG9hZGluZ0ljb249XCJwaSBwaS1zcGluIHBpLXNwaW5uZXJcIj48L2J1dHRvbj5cbjwvZm9ybT5cbjxwLW1lc3NhZ2VzIFt2YWx1ZV09XCJmb3JtTWVzc2FnZXNcIiBbZW5hYmxlU2VydmljZV09XCJmYWxzZVwiPjwvcC1tZXNzYWdlcz5cbiJdfQ==
|