@sumaris-net/ngx-components 2.0.0-rc9 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/esm2020/public_api.mjs +35 -22
- package/esm2020/src/app/admin/admin-routing.module.mjs +6 -6
- package/esm2020/src/app/admin/admin.module.mjs +6 -6
- package/esm2020/src/app/admin/services/person.service.mjs +3 -3
- package/esm2020/src/app/admin/services/validator/person.validator.mjs +3 -3
- package/esm2020/src/app/admin/users/users.mjs +233 -0
- package/esm2020/src/app/admin/users/users.module.mjs +54 -0
- package/esm2020/src/app/core/about/about.modal.mjs +71 -0
- package/esm2020/src/app/core/about/about.module.mjs +34 -0
- package/esm2020/src/app/core/account/account.module.mjs +43 -0
- package/esm2020/src/app/core/account/account.page.mjs +239 -0
- package/esm2020/src/app/core/auth/auth.form.mjs +131 -0
- package/esm2020/src/app/core/auth/auth.modal.mjs +72 -0
- package/esm2020/src/app/core/auth/auth.module.mjs +47 -0
- package/esm2020/src/app/core/core.module.mjs +86 -125
- package/esm2020/src/app/core/core.testing.module.mjs +7 -7
- package/esm2020/src/app/core/form/{form-buttons-bar.component.mjs → buttons/form-buttons-bar.component.mjs} +7 -7
- package/esm2020/src/app/core/form/buttons/form-buttons-bar.module.mjs +35 -0
- package/esm2020/src/app/core/form/entity/editor.class.mjs +675 -0
- package/esm2020/src/app/core/form/entity/entity-editor-modal.class.mjs +421 -0
- package/esm2020/src/app/core/form/entity/entity-editor.class.mjs +646 -0
- package/esm2020/src/app/core/form/{entity-metadata.component.mjs → entity/entity-metadata.component.mjs} +6 -6
- package/esm2020/src/app/core/form/entity/entity.module.mjs +38 -0
- package/esm2020/src/app/core/form/form.class.mjs +4 -4
- package/esm2020/src/app/core/form/form.module.mjs +66 -0
- package/esm2020/src/app/core/form/list/list.form.mjs +222 -0
- package/esm2020/src/app/core/form/list/list.module.mjs +35 -0
- package/esm2020/src/app/core/form/properties/properties.form.mjs +3 -3
- package/esm2020/src/app/core/form/properties/properties.module.mjs +35 -0
- package/esm2020/src/app/core/form/properties/property.validator.mjs +4 -4
- package/esm2020/src/app/core/form/properties/testing/properties-form.test.mjs +3 -3
- package/esm2020/src/app/core/form/properties/testing/properties-form.testing.module.mjs +4 -4
- package/esm2020/src/app/core/{text-popover → form/text-popover}/testing/text-popover.testing.mjs +4 -4
- package/esm2020/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +45 -0
- package/esm2020/src/app/core/form/text-popover/text-form.component.mjs +89 -0
- package/esm2020/src/app/core/form/text-popover/text-popover.component.mjs +105 -0
- package/esm2020/src/app/core/form/text-popover/text-popover.module.mjs +40 -0
- package/esm2020/src/app/core/graphql/graphql.module.mjs +4 -4
- package/esm2020/src/app/core/graphql/graphql.service.mjs +12 -7
- package/esm2020/src/app/core/graphql/graphql.utils.mjs +2 -2
- package/esm2020/src/app/core/home/home.mjs +8 -8
- package/esm2020/src/app/core/home/home.module.mjs +48 -0
- package/esm2020/src/app/core/icon/icon.component.mjs +3 -3
- package/esm2020/src/app/core/icon/icon.module.mjs +4 -4
- package/esm2020/src/app/core/install/install-upgrade-card.component.mjs +3 -3
- package/esm2020/src/app/core/install/install-upgrade-card.module.mjs +17 -15
- package/esm2020/src/app/core/menu/menu.component.mjs +5 -5
- package/esm2020/src/app/core/menu/menu.module.mjs +9 -10
- package/esm2020/src/app/core/menu/menu.service.mjs +3 -3
- package/esm2020/src/app/core/offline/update-offline-mode-card.component.mjs +3 -3
- package/esm2020/src/app/core/offline/update-offline-mode-card.module.mjs +35 -0
- package/esm2020/src/app/core/peer/select-peer.modal.mjs +55 -11
- package/esm2020/src/app/core/peer/select-peer.module.mjs +17 -10
- package/esm2020/src/app/core/register/register-confirm.page.mjs +81 -0
- package/esm2020/src/app/core/register/register.form.mjs +181 -0
- package/esm2020/src/app/core/register/register.modal.mjs +52 -0
- package/esm2020/src/app/core/register/register.module.mjs +17 -15
- package/esm2020/src/app/core/services/account.service.mjs +22 -23
- package/esm2020/src/app/core/services/auth-guard.service.mjs +6 -6
- package/esm2020/src/app/core/services/base-entity-service.class.mjs +3 -3
- package/esm2020/src/app/core/services/base-graphql-service.class.mjs +8 -8
- package/esm2020/src/app/core/services/base58.mjs +2 -2
- package/esm2020/src/app/core/services/config.service.mjs +4 -4
- package/esm2020/src/app/core/services/crypto.service.mjs +82 -97
- package/esm2020/src/app/core/services/local-settings.service.mjs +8 -10
- package/esm2020/src/app/core/services/model/entity.decorators.mjs +44 -54
- package/esm2020/src/app/core/services/model/peer.model.mjs +3 -3
- package/esm2020/src/app/core/services/network.service.mjs +7 -7
- package/esm2020/src/app/core/services/pipes/account.pipes.mjs +8 -8
- package/esm2020/src/app/core/services/pipes/department-to-string.pipe.mjs +4 -4
- package/esm2020/src/app/core/services/pipes/person-to-string.pipe.mjs +4 -4
- package/esm2020/src/app/core/services/pipes/usage-mode.pipes.mjs +8 -8
- package/esm2020/src/app/core/services/platform.service.mjs +9 -10
- package/esm2020/src/app/core/services/storage/entities-storage.service.mjs +3 -3
- package/esm2020/src/app/core/services/storage/entity-store.class.mjs +4 -4
- package/esm2020/src/app/core/services/testing/referential.validator.mjs +3 -3
- package/esm2020/src/app/core/services/validator/account.validator.mjs +3 -3
- package/esm2020/src/app/core/services/validator/base.validator.class.mjs +3 -3
- package/esm2020/src/app/core/services/validator/local-settings.validator.mjs +3 -3
- package/esm2020/src/app/core/services/validator/user-settings.validator.mjs +3 -3
- package/esm2020/src/app/core/settings/settings.module.mjs +34 -0
- package/esm2020/src/app/core/settings/settings.page.mjs +12 -9
- package/esm2020/src/app/core/table/actions-column.component.mjs +3 -3
- package/esm2020/src/app/core/table/entities-table-datasource.class.mjs +13 -8
- package/esm2020/src/app/core/table/memory-table.class.mjs +3 -3
- package/esm2020/src/app/core/table/table-select-columns.component.mjs +3 -3
- package/esm2020/src/app/core/table/table.class.mjs +11 -16
- package/esm2020/src/app/core/table/table.module.mjs +40 -0
- package/esm2020/src/app/core/table/testing/table.testing.mjs +8 -8
- package/esm2020/src/app/core/table/testing/table.testing.module.mjs +4 -4
- package/esm2020/src/app/shared/audio/audio.mjs +3 -3
- package/esm2020/src/app/shared/audio/audio.testing.mjs +3 -3
- package/esm2020/src/app/shared/audio/audio.testing.module.mjs +4 -4
- package/esm2020/src/app/shared/capacitor/keyboard.mjs +3 -3
- package/esm2020/src/app/shared/constants.mjs +4 -2
- package/esm2020/src/app/shared/dates.mjs +20 -14
- package/esm2020/src/app/shared/debug/debug.component.mjs +3 -3
- package/esm2020/src/app/shared/debug/debug.module.mjs +4 -4
- package/esm2020/src/app/shared/directives/autofocus.directive.mjs +3 -3
- package/esm2020/src/app/shared/directives/autotitle.directive.mjs +3 -3
- package/esm2020/src/app/shared/directives/directives.module.mjs +4 -4
- package/esm2020/src/app/shared/directives/drag-and-drop.directive.mjs +3 -3
- package/esm2020/src/app/shared/directives/ng-var.directive.mjs +3 -3
- package/esm2020/src/app/shared/directives/resizable/resizable.component.mjs +3 -3
- package/esm2020/src/app/shared/directives/resizable/resizable.directive.mjs +3 -3
- package/esm2020/src/app/shared/directives/resizable/resizable.module.mjs +4 -4
- package/esm2020/src/app/shared/file/file.service.mjs +5 -5
- package/esm2020/src/app/shared/form/field.component.mjs +3 -3
- package/esm2020/src/app/shared/form/loading-spinner.mjs +3 -3
- package/esm2020/src/app/shared/gesture/gesture-config.mjs +3 -3
- package/esm2020/src/app/shared/guard/component-dirty.guard.mjs +3 -3
- package/esm2020/src/app/shared/help/help.modal.mjs +3 -3
- package/esm2020/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +3 -3
- package/esm2020/src/app/shared/hotkeys/hotkeys.service.mjs +3 -3
- package/esm2020/src/app/shared/hotkeys/shared-hotkeys.module.mjs +4 -4
- package/esm2020/src/app/shared/image/gallery/image-gallery.component.mjs +134 -60
- package/esm2020/src/app/shared/image/gallery/image-gallery.module.mjs +19 -7
- package/esm2020/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +3 -3
- package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.mjs +13 -7
- package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +4 -4
- package/esm2020/src/app/shared/image/image.module.mjs +5 -5
- package/esm2020/src/app/shared/image/image.service.mjs +3 -3
- package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.mjs +7 -6
- package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +4 -4
- package/esm2020/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +3 -3
- package/esm2020/src/app/shared/material/badge/badge.directive.mjs +3 -3
- package/esm2020/src/app/shared/material/badge/badge.module.mjs +4 -4
- package/esm2020/src/app/shared/material/badge/badge.test.mjs +3 -3
- package/esm2020/src/app/shared/material/boolean/boolean.module.mjs +4 -4
- package/esm2020/src/app/shared/material/boolean/material.boolean.mjs +5 -5
- package/esm2020/src/app/shared/material/chips/chips.module.mjs +4 -4
- package/esm2020/src/app/shared/material/chips/material.chips.mjs +5 -5
- package/esm2020/src/app/shared/material/chips/testing/chips.test.mjs +3 -3
- package/esm2020/src/app/shared/material/datetime/datetime.module.mjs +4 -4
- package/esm2020/src/app/shared/material/datetime/material.date.mjs +7 -8
- package/esm2020/src/app/shared/material/datetime/material.dateshort.mjs +6 -6
- package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +7 -8
- package/esm2020/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +5 -7
- package/esm2020/src/app/shared/material/datetime/testing/mat-date.test.mjs +7 -8
- package/esm2020/src/app/shared/material/duration/duration.module.mjs +4 -4
- package/esm2020/src/app/shared/material/duration/material.duration.mjs +3 -3
- package/esm2020/src/app/shared/material/latlong/material.latlong.mjs +3 -3
- package/esm2020/src/app/shared/material/latlong/material.latlong.module.mjs +4 -4
- package/esm2020/src/app/shared/material/latlong/testing/latlong.test.mjs +3 -3
- package/esm2020/src/app/shared/material/material.module.mjs +4 -4
- package/esm2020/src/app/shared/material/material.testing.module.mjs +4 -4
- package/esm2020/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +3 -3
- package/esm2020/src/app/shared/material/numpad/numpad.component.mjs +3 -3
- package/esm2020/src/app/shared/material/numpad/numpad.container.mjs +3 -3
- package/esm2020/src/app/shared/material/numpad/numpad.content.mjs +3 -3
- package/esm2020/src/app/shared/material/numpad/numpad.directive.mjs +3 -3
- package/esm2020/src/app/shared/material/numpad/numpad.dom-service.mjs +3 -3
- package/esm2020/src/app/shared/material/numpad/numpad.module.mjs +4 -4
- package/esm2020/src/app/shared/material/numpad/testing/numpad.test.mjs +3 -3
- package/esm2020/src/app/shared/material/paginator/material.paginator-i18n.mjs +3 -3
- package/esm2020/src/app/shared/material/stepper/material.stepper-i18n.mjs +3 -3
- package/esm2020/src/app/shared/material/swipe/material.swipe.mjs +3 -3
- package/esm2020/src/app/shared/material/swipe/swipe.module.mjs +4 -4
- package/esm2020/src/app/shared/material/swipe/testing/swipe.test.mjs +11 -12
- package/esm2020/src/app/shared/modules.mjs +11 -0
- package/esm2020/src/app/shared/pipes/arrays.pipe.mjs +24 -24
- package/esm2020/src/app/shared/pipes/colors.pipe.mjs +4 -4
- package/esm2020/src/app/shared/pipes/date-diff-duration.pipe.mjs +8 -9
- package/esm2020/src/app/shared/pipes/date-format.pipe.mjs +38 -14
- package/esm2020/src/app/shared/pipes/date-from-now.pipe.mjs +4 -4
- package/esm2020/src/app/shared/pipes/duration.pipe.mjs +4 -4
- package/esm2020/src/app/shared/pipes/file-size.pipe.mjs +3 -3
- package/esm2020/src/app/shared/pipes/form.pipes.mjs +18 -18
- package/esm2020/src/app/shared/pipes/highlight.pipe.mjs +4 -4
- package/esm2020/src/app/shared/pipes/latlong-format.pipe.mjs +9 -9
- package/esm2020/src/app/shared/pipes/maps.pipe.mjs +12 -12
- package/esm2020/src/app/shared/pipes/math.pipes.mjs +12 -12
- package/esm2020/src/app/shared/pipes/ng-init.pipe.mjs +3 -3
- package/esm2020/src/app/shared/pipes/number-format.pipe.mjs +4 -4
- package/esm2020/src/app/shared/pipes/pipes.module.mjs +14 -6
- package/esm2020/src/app/shared/pipes/property.pipes.mjs +9 -12
- package/esm2020/src/app/shared/pipes/string.pipes.mjs +43 -17
- package/esm2020/src/app/shared/pipes/translate-context.pipe.mjs +8 -8
- package/esm2020/src/app/shared/services/memory-entity-service.class.mjs +3 -3
- package/esm2020/src/app/shared/services/progress-bar.service.mjs +3 -3
- package/esm2020/src/app/shared/services/storage/storage.service.mjs +3 -3
- package/esm2020/src/app/shared/services/translate-context.service.mjs +3 -3
- package/esm2020/src/app/shared/shared-routing.module.mjs +7 -7
- package/esm2020/src/app/shared/shared.module.mjs +11 -7
- package/esm2020/src/app/shared/shared.testing.module.mjs +4 -4
- package/esm2020/src/app/shared/testing/observable.test.mjs +6 -7
- package/esm2020/src/app/shared/testing/tests.page.mjs +3 -3
- package/esm2020/src/app/shared/toast/toast.testing.mjs +3 -3
- package/esm2020/src/app/shared/toast/toast.testing.module.mjs +4 -4
- package/esm2020/src/app/shared/toast/toasts.mjs +1 -1
- package/esm2020/src/app/shared/toolbar/modal-toolbar.mjs +3 -3
- package/esm2020/src/app/shared/toolbar/toolbar.mjs +3 -3
- package/esm2020/src/app/shared/toolbar/toolbar.module.mjs +4 -4
- package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.mjs +3 -3
- package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +4 -4
- package/esm2020/src/app/shared/upload-file/upload-file-popover.component.mjs +5 -5
- package/esm2020/src/app/shared/upload-file/upload-file.component.mjs +3 -3
- package/esm2020/src/app/shared/validator/form-error-adapter.class.mjs +3 -3
- package/esm2020/src/app/shared/validator/validators.mjs +4 -5
- package/esm2020/src/app/social/job/job.module.mjs +4 -4
- package/esm2020/src/app/social/job/job.service.mjs +3 -3
- package/esm2020/src/app/social/job/progression/job-progression.icon.mjs +3 -3
- package/esm2020/src/app/social/job/progression/job-progression.list.mjs +4 -4
- package/esm2020/src/app/social/job/testing/job-progression.testing.mjs +3 -3
- package/esm2020/src/app/social/job/testing/job-progression.testing.service.mjs +3 -3
- package/esm2020/src/app/social/job/testing/job.testing.module.mjs +4 -4
- package/esm2020/src/app/social/message/message.form.mjs +3 -3
- package/esm2020/src/app/social/message/message.modal.mjs +3 -3
- package/esm2020/src/app/social/message/message.module.mjs +4 -4
- package/esm2020/src/app/social/message/message.service.mjs +3 -3
- package/esm2020/src/app/social/social.module.mjs +4 -4
- package/esm2020/src/app/social/social.testing.module.mjs +4 -4
- package/esm2020/src/app/social/user-event/notification/user-event-notification.icon.mjs +3 -3
- package/esm2020/src/app/social/user-event/notification/user-event-notification.list.mjs +7 -7
- package/esm2020/src/app/social/user-event/testing/user-event.testing.mjs +13 -12
- package/esm2020/src/app/social/user-event/testing/user-event.testing.module.mjs +4 -4
- package/esm2020/src/app/social/user-event/testing/user-event.testing.service.mjs +3 -3
- package/esm2020/src/app/social/user-event/user-event.module.mjs +4 -4
- package/esm2020/src/app/social/user-event/user-event.service.mjs +6 -8
- package/fesm2015/sumaris-net.ngx-components.mjs +10176 -9570
- package/fesm2015/sumaris-net.ngx-components.mjs.map +1 -1
- package/fesm2020/sumaris-net.ngx-components.mjs +10390 -9791
- package/fesm2020/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +2 -1
- package/plugins/clovelced-plugin-audiomanagement/README.md +66 -0
- package/plugins/cordova-plugin-camera/README.md +703 -0
- package/plugins/cordova-plugin-device/README.md +309 -0
- package/plugins/cordova-plugin-file/README.md +848 -0
- package/plugins/cordova-plugin-file-transfer/README.md +598 -0
- package/plugins/cordova-plugin-file-transfer/doc/de/README.md +311 -0
- package/plugins/cordova-plugin-file-transfer/doc/es/README.md +311 -0
- package/plugins/cordova-plugin-file-transfer/doc/fr/README.md +270 -0
- package/plugins/cordova-plugin-file-transfer/doc/it/README.md +311 -0
- package/plugins/cordova-plugin-file-transfer/doc/ja/README.md +311 -0
- package/plugins/cordova-plugin-file-transfer/doc/ko/README.md +311 -0
- package/plugins/cordova-plugin-file-transfer/doc/pl/README.md +311 -0
- package/plugins/cordova-plugin-file-transfer/doc/zh/README.md +311 -0
- package/plugins/cordova-plugin-ionic-keyboard/README.md +220 -0
- package/plugins/cordova-plugin-ionic-webview/README.md +181 -0
- package/plugins/cordova-plugin-media-capture/README.md +626 -0
- package/plugins/cordova-plugin-splashscreen/README.md +387 -0
- package/plugins/cordova-plugin-statusbar/README.md +341 -0
- package/plugins/cordova-plugin-telerik-imagepicker/README.md +155 -0
- package/plugins/cordova-plugin-whitelist/README.md +185 -0
- package/plugins/cordova-sqlite-storage/README.md +1848 -0
- package/plugins/integrator-cordova-plugin-downloader/README.md +49 -0
- package/public_api.d.ts +34 -21
- package/src/app/admin/admin.module.d.ts +1 -1
- package/src/app/admin/users/{list/users.d.ts → users.d.ts} +11 -11
- package/src/app/admin/users/users.module.d.ts +13 -0
- package/src/app/core/about/{modal-about.d.ts → about.modal.d.ts} +1 -1
- package/src/app/core/about/about.module.d.ts +10 -0
- package/src/app/core/account/account.module.d.ts +11 -0
- package/src/app/core/account/{account.d.ts → account.page.d.ts} +5 -1
- package/src/app/core/auth/{form/form-auth.d.ts → auth.form.d.ts} +9 -9
- package/src/app/core/auth/{modal/modal-auth.d.ts → auth.modal.d.ts} +4 -4
- package/src/app/core/auth/auth.module.d.ts +11 -0
- package/src/app/core/core.module.d.ts +20 -29
- package/src/app/core/core.testing.module.d.ts +1 -1
- package/src/app/core/form/{form-buttons-bar.component.d.ts → buttons/form-buttons-bar.component.d.ts} +2 -2
- package/src/app/core/form/buttons/form-buttons-bar.module.d.ts +9 -0
- package/src/app/core/form/{editor.class.d.ts → entity/editor.class.d.ts} +9 -9
- package/src/app/core/form/{entity-editor-modal.class.d.ts → entity/entity-editor-modal.class.d.ts} +8 -8
- package/src/app/core/form/{entity-editor.class.d.ts → entity/entity-editor.class.d.ts} +11 -11
- package/src/app/core/form/{entity-metadata.component.d.ts → entity/entity-metadata.component.d.ts} +1 -1
- package/src/app/core/form/entity/entity.module.d.ts +10 -0
- package/src/app/core/form/form.module.d.ts +13 -0
- package/src/app/core/form/{list.form.d.ts → list/list.form.d.ts} +3 -3
- package/src/app/core/form/list/list.module.d.ts +9 -0
- package/src/app/core/form/properties/properties.module.d.ts +9 -0
- package/src/app/core/{text-popover → form/text-popover}/testing/text-popover.testing.d.ts +0 -0
- package/src/app/core/{text-popover → form/text-popover}/testing/text-popover.testing.module.d.ts +0 -0
- package/src/app/core/{text-popover → form/text-popover}/text-form.component.d.ts +4 -3
- package/src/app/core/{text-popover → form/text-popover}/text-popover.component.d.ts +7 -2
- package/src/app/core/form/text-popover/text-popover.module.d.ts +10 -0
- package/src/app/core/home/home.module.d.ts +12 -0
- package/src/app/core/install/install-upgrade-card.module.d.ts +6 -7
- package/src/app/core/menu/menu.component.d.ts +1 -1
- package/src/app/core/offline/update-offline-mode-card.module.d.ts +9 -0
- package/src/app/core/peer/select-peer.modal.d.ts +19 -5
- package/src/app/core/peer/select-peer.module.d.ts +6 -4
- package/src/app/core/register/{confirm/confirm.d.ts → register-confirm.page.d.ts} +4 -4
- package/src/app/core/register/{form/form-register.d.ts → register.form.d.ts} +7 -7
- package/src/app/core/register/{modal/modal-register.d.ts → register.modal.d.ts} +2 -2
- package/src/app/core/register/register.module.d.ts +6 -6
- package/src/app/core/services/account.service.d.ts +8 -9
- package/src/app/core/services/base-graphql-service.class.d.ts +9 -8
- package/src/app/core/services/crypto.service.d.ts +23 -18
- package/src/app/core/services/model/entity.decorators.d.ts +1 -9
- package/src/app/core/services/network.service.d.ts +3 -4
- package/src/app/core/settings/settings.module.d.ts +10 -0
- package/src/app/core/settings/settings.page.d.ts +2 -4
- package/src/app/core/table/entities-table-datasource.class.d.ts +1 -0
- package/src/app/core/table/table.class.d.ts +2 -6
- package/src/app/core/table/table.module.d.ts +10 -0
- package/src/app/shared/constants.d.ts +1 -1
- package/src/app/shared/dates.d.ts +5 -3
- package/src/app/shared/image/gallery/image-gallery.component.d.ts +39 -17
- package/src/app/shared/image/gallery/image-gallery.module.d.ts +6 -4
- package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +1 -0
- package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +1 -0
- package/src/app/shared/material/swipe/testing/swipe.test.d.ts +5 -6
- package/src/app/shared/modules.d.ts +8 -0
- package/src/app/shared/pipes/date-format.pipe.d.ts +22 -11
- package/src/app/shared/pipes/pipes.module.d.ts +1 -1
- package/src/app/shared/pipes/property.pipes.d.ts +4 -6
- package/src/app/shared/pipes/string.pipes.d.ts +10 -0
- package/src/app/shared/shared.module.d.ts +2 -1
- package/src/assets/i18n/en-US.json +20 -5
- package/src/assets/i18n/en.json +18 -4
- package/src/assets/i18n/fr.json +17 -6
- package/src/theme/_ngx-components.scss +22 -4
- package/esm2020/src/app/admin/users/list/users.mjs +0 -233
- package/esm2020/src/app/admin/users/list/users.module.mjs +0 -58
- package/esm2020/src/app/core/about/modal-about.mjs +0 -71
- package/esm2020/src/app/core/account/account.mjs +0 -230
- package/esm2020/src/app/core/auth/form/form-auth.mjs +0 -131
- package/esm2020/src/app/core/auth/modal/modal-auth.mjs +0 -72
- package/esm2020/src/app/core/form/editor.class.mjs +0 -675
- package/esm2020/src/app/core/form/entity-editor-modal.class.mjs +0 -421
- package/esm2020/src/app/core/form/entity-editor.class.mjs +0 -646
- package/esm2020/src/app/core/form/list.form.mjs +0 -222
- package/esm2020/src/app/core/register/confirm/confirm.mjs +0 -81
- package/esm2020/src/app/core/register/form/form-register.mjs +0 -181
- package/esm2020/src/app/core/register/modal/modal-register.mjs +0 -52
- package/esm2020/src/app/core/text-popover/testing/text-popover.testing.module.mjs +0 -45
- package/esm2020/src/app/core/text-popover/text-form.component.mjs +0 -84
- package/esm2020/src/app/core/text-popover/text-popover.component.mjs +0 -92
- package/esm2020/src/app/vendor.mjs +0 -16
- package/src/app/admin/users/list/users.module.d.ts +0 -14
- package/src/app/vendor.d.ts +0 -11
|
@@ -1,421 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectorRef, Directive, Input, Optional } from '@angular/core';
|
|
2
|
-
import { Router } from '@angular/router';
|
|
3
|
-
import { AlertController, ModalController } from '@ionic/angular';
|
|
4
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
5
|
-
import { BehaviorSubject, Subject } from 'rxjs';
|
|
6
|
-
import { LocalSettingsService } from '../services/local-settings.service';
|
|
7
|
-
import { AppTabEditor, AppTabEditorOptions } from './editor.class';
|
|
8
|
-
import { AppFormUtils } from './form.utils';
|
|
9
|
-
import { Alerts } from '../../shared/alerts';
|
|
10
|
-
import { ErrorCodes } from '../services/errors';
|
|
11
|
-
import { isNil, isNotNil, isNotNilOrBlank } from '../../shared/functions';
|
|
12
|
-
import { DateFormatPipe } from '../../shared/pipes/date-format.pipe';
|
|
13
|
-
import { ENVIRONMENT } from '../../../environments/environment.class';
|
|
14
|
-
import { waitForFalse } from '../../shared/observables';
|
|
15
|
-
import { FormErrorTranslator } from '../../shared/validator/form-error-adapter.class';
|
|
16
|
-
import { debounceTime } from 'rxjs/operators';
|
|
17
|
-
import * as i0 from "@angular/core";
|
|
18
|
-
export class AppEntityEditorModalOptions extends AppTabEditorOptions {
|
|
19
|
-
}
|
|
20
|
-
// @dynamic
|
|
21
|
-
// eslint-disable-next-line @angular-eslint/directive-class-suffix
|
|
22
|
-
export class AppEntityEditorModal extends AppTabEditor {
|
|
23
|
-
constructor(injector, dataType, options) {
|
|
24
|
-
super(null, injector.get(Router), injector.get(AlertController), injector.get(TranslateService), options);
|
|
25
|
-
this.dataType = dataType;
|
|
26
|
-
this.savingSubject = new BehaviorSubject(false);
|
|
27
|
-
this.$title = new Subject();
|
|
28
|
-
this.i18nSuffix = null;
|
|
29
|
-
this.environement = injector.get(ENVIRONMENT);
|
|
30
|
-
options = {
|
|
31
|
-
// Default options
|
|
32
|
-
i18nPrefix: '',
|
|
33
|
-
// Override defaults
|
|
34
|
-
...options
|
|
35
|
-
};
|
|
36
|
-
this.queryTabIndexParamName = undefined; // Important: avoid query parameter changed
|
|
37
|
-
this.settings = injector.get(LocalSettingsService);
|
|
38
|
-
this.errorTranslator = injector.get(FormErrorTranslator);
|
|
39
|
-
this.cd = injector.get(ChangeDetectorRef);
|
|
40
|
-
this.dateFormat = injector.get(DateFormatPipe);
|
|
41
|
-
this.modalCtrl = injector.get(ModalController);
|
|
42
|
-
this.i18nContext = {
|
|
43
|
-
prefix: options.i18nPrefix,
|
|
44
|
-
suffix: this.i18nSuffix || ''
|
|
45
|
-
};
|
|
46
|
-
// FOR DEV ONLY ----
|
|
47
|
-
//this.debug = !environment.production;
|
|
48
|
-
}
|
|
49
|
-
set isNew(value) {
|
|
50
|
-
this._isNew = value;
|
|
51
|
-
}
|
|
52
|
-
get isNew() {
|
|
53
|
-
return isNotNil(this._isNew) ? this._isNew : isNil(this.data?.id);
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* @deprecated use isNew instead
|
|
57
|
-
*/
|
|
58
|
-
get isNewData() {
|
|
59
|
-
return this.isNew;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* @deprecated use isNew instead
|
|
63
|
-
*/
|
|
64
|
-
set isNewData(value) {
|
|
65
|
-
this.isNew = value;
|
|
66
|
-
}
|
|
67
|
-
set disabled(value) {
|
|
68
|
-
this._enabled = !value;
|
|
69
|
-
}
|
|
70
|
-
get disabled() {
|
|
71
|
-
return !this._enabled;
|
|
72
|
-
}
|
|
73
|
-
get isOnFieldMode() {
|
|
74
|
-
return this.settings.isOnFieldMode(this._usageMode);
|
|
75
|
-
}
|
|
76
|
-
get saving() {
|
|
77
|
-
return this.savingSubject.value;
|
|
78
|
-
}
|
|
79
|
-
markAsSaving(opts) {
|
|
80
|
-
if (this.savingSubject.value !== true) {
|
|
81
|
-
this.savingSubject.next(true);
|
|
82
|
-
if (!opts || opts.emitEvent !== false)
|
|
83
|
-
this.markForCheck();
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
markAsSaved(opts) {
|
|
87
|
-
if (this.savingSubject.value !== false) {
|
|
88
|
-
this.savingSubject.next(false);
|
|
89
|
-
if (!opts || opts.emitEvent !== false)
|
|
90
|
-
this.markForCheck();
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
ngOnInit() {
|
|
94
|
-
// Default values
|
|
95
|
-
this.mobile = isNotNil(this.mobile) ? this.mobile : this.settings.mobile;
|
|
96
|
-
super.ngOnInit();
|
|
97
|
-
// Register forms
|
|
98
|
-
this.registerForms();
|
|
99
|
-
// Disable
|
|
100
|
-
if (this.disabled)
|
|
101
|
-
this.disable();
|
|
102
|
-
if (this.isNewData) {
|
|
103
|
-
// Update the title.
|
|
104
|
-
this.updateTitle();
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
// Update title each time value changes
|
|
108
|
-
this.registerSubscription(this.form.valueChanges
|
|
109
|
-
.pipe(debounceTime(250))
|
|
110
|
-
.subscribe(json => this.updateTitle(json)));
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
ngAfterViewInit() {
|
|
114
|
-
super.ngAfterViewInit();
|
|
115
|
-
if (this.onAfterModalInit) {
|
|
116
|
-
Promise.resolve(this.onAfterModalInit(this))
|
|
117
|
-
.then(() => this.load());
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
// Use a timeout to avoid error 'NG0100: ExpressionChangedAfterItHasBeenCheckedError'
|
|
121
|
-
setTimeout(() => this.load());
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
ngOnDestroy() {
|
|
125
|
-
super.ngOnDestroy();
|
|
126
|
-
this.$title.complete();
|
|
127
|
-
this.$title.unsubscribe();
|
|
128
|
-
this.savingSubject.unsubscribe();
|
|
129
|
-
}
|
|
130
|
-
waitIdle(opts) {
|
|
131
|
-
// Wait end of saving
|
|
132
|
-
if (this.saving)
|
|
133
|
-
return waitForFalse(this.savingSubject);
|
|
134
|
-
return super.waitIdle(opts);
|
|
135
|
-
}
|
|
136
|
-
async load() {
|
|
137
|
-
this.markAsReady();
|
|
138
|
-
this.markAsLoading();
|
|
139
|
-
try {
|
|
140
|
-
await this.updateView(this.data);
|
|
141
|
-
}
|
|
142
|
-
catch (err) {
|
|
143
|
-
if (err === 'CANCELLED')
|
|
144
|
-
return;
|
|
145
|
-
this.setError(err);
|
|
146
|
-
this.selectedTabIndex = 0;
|
|
147
|
-
}
|
|
148
|
-
finally {
|
|
149
|
-
this.markAsLoaded();
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
reload() {
|
|
153
|
-
if (this.dirty) {
|
|
154
|
-
return this.load();
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
unload(opts) {
|
|
158
|
-
throw new Error("No implemented on modal");
|
|
159
|
-
}
|
|
160
|
-
async updateView(data, opts) {
|
|
161
|
-
this.resetError();
|
|
162
|
-
if (!this.data)
|
|
163
|
-
throw { code: ErrorCodes.DATA_NOT_FOUND_ERROR, message: 'ERROR.DATA_NO_FOUND' };
|
|
164
|
-
await this.setValue(data);
|
|
165
|
-
if (!opts || opts.emitEvent !== false) {
|
|
166
|
-
this.markAsPristine();
|
|
167
|
-
this.markAsUntouched();
|
|
168
|
-
this.updateViewState(data);
|
|
169
|
-
// Update the title.
|
|
170
|
-
this.updateTitle(data);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Enable or disable state
|
|
175
|
-
*/
|
|
176
|
-
updateViewState(data, opts) {
|
|
177
|
-
if (this.isNewData || this.enabled) {
|
|
178
|
-
this.enable(opts);
|
|
179
|
-
}
|
|
180
|
-
else {
|
|
181
|
-
this.disable(opts);
|
|
182
|
-
// Allow to sort table
|
|
183
|
-
this.tables?.forEach(t => t.enableSort());
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
async saveAndClose(event) {
|
|
187
|
-
const data = await this.saveAndGetDataIfValid();
|
|
188
|
-
if (data) {
|
|
189
|
-
this.modalCtrl.dismiss(data);
|
|
190
|
-
return true;
|
|
191
|
-
}
|
|
192
|
-
return false;
|
|
193
|
-
}
|
|
194
|
-
async close(event) {
|
|
195
|
-
if (this.dirty) {
|
|
196
|
-
const saveBeforeLeave = await Alerts.askSaveBeforeLeave(this.alertCtrl, this.translate, event);
|
|
197
|
-
// User cancelled
|
|
198
|
-
if (isNil(saveBeforeLeave) || event && event.defaultPrevented) {
|
|
199
|
-
return;
|
|
200
|
-
}
|
|
201
|
-
// Is user confirm: close normally
|
|
202
|
-
if (saveBeforeLeave === true) {
|
|
203
|
-
await this.saveAndClose(event);
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
await this.modalCtrl.dismiss();
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Save the editor, by calling the dataService.save().
|
|
211
|
-
* Ensure that editor if valid. If not, display an error
|
|
212
|
-
* @param event
|
|
213
|
-
* @param opts
|
|
214
|
-
*/
|
|
215
|
-
async save(event, opts) {
|
|
216
|
-
if (this.loading || this.saving || this.disabled) {
|
|
217
|
-
console.debug(this._logPrefix + 'Skip save: modal is busy (loading or saving)');
|
|
218
|
-
return false;
|
|
219
|
-
}
|
|
220
|
-
if (!this.dirty) {
|
|
221
|
-
console.debug(this._logPrefix + 'Skip save: modal not dirty');
|
|
222
|
-
return true;
|
|
223
|
-
}
|
|
224
|
-
// Wait end of async validation
|
|
225
|
-
await this.waitWhilePending();
|
|
226
|
-
// If invalid
|
|
227
|
-
if (this.invalid) {
|
|
228
|
-
this.logFormErrors();
|
|
229
|
-
this.setError('COMMON.FORM.HAS_ERROR');
|
|
230
|
-
this.openFirstInvalidTab();
|
|
231
|
-
this.scrollToTop();
|
|
232
|
-
this.markAllAsTouched();
|
|
233
|
-
this.submitted = true;
|
|
234
|
-
return false;
|
|
235
|
-
}
|
|
236
|
-
this.markAsSaving();
|
|
237
|
-
this.resetError();
|
|
238
|
-
if (this.debug)
|
|
239
|
-
console.debug(this._logPrefix + 'Saving data...');
|
|
240
|
-
try {
|
|
241
|
-
// Save all dirty children
|
|
242
|
-
const saved = await this.saveDirtyChildren();
|
|
243
|
-
if (!saved)
|
|
244
|
-
return false;
|
|
245
|
-
// Fill data
|
|
246
|
-
this.data = await this.getValue();
|
|
247
|
-
// Mark as submitted
|
|
248
|
-
this.submitted = true;
|
|
249
|
-
return true;
|
|
250
|
-
}
|
|
251
|
-
catch (err) {
|
|
252
|
-
this.submitted = true;
|
|
253
|
-
this.setError(err);
|
|
254
|
-
this.selectedTabIndex = 0;
|
|
255
|
-
this.scrollToTop(); // Scroll to top (to show error)
|
|
256
|
-
this.markAsDirty();
|
|
257
|
-
this.enable();
|
|
258
|
-
return false;
|
|
259
|
-
}
|
|
260
|
-
finally {
|
|
261
|
-
this.markAsSaved();
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
/**
|
|
265
|
-
* Save data (if dirty and valid), and return it. Otherwise, return nil value.
|
|
266
|
-
*/
|
|
267
|
-
async saveAndGetDataIfValid() {
|
|
268
|
-
// Form is not valid
|
|
269
|
-
if (!this.valid) {
|
|
270
|
-
// Make sure validation is finished
|
|
271
|
-
await AppFormUtils.waitWhilePending(this);
|
|
272
|
-
// If invalid: Open the first tab in error
|
|
273
|
-
if (this.invalid) {
|
|
274
|
-
this.openFirstInvalidTab();
|
|
275
|
-
return undefined;
|
|
276
|
-
}
|
|
277
|
-
// Continue (valid)
|
|
278
|
-
}
|
|
279
|
-
// Form is valid, but not saved
|
|
280
|
-
if (this.dirty) {
|
|
281
|
-
const saved = await this.save(new Event('save'));
|
|
282
|
-
if (!saved)
|
|
283
|
-
return undefined;
|
|
284
|
-
}
|
|
285
|
-
// Valid and saved data
|
|
286
|
-
return this.data;
|
|
287
|
-
}
|
|
288
|
-
async delete(event) {
|
|
289
|
-
if (this.loading || this.saving)
|
|
290
|
-
return false;
|
|
291
|
-
this.markAsSaving();
|
|
292
|
-
this.resetError();
|
|
293
|
-
try {
|
|
294
|
-
// Delegate deletion to modal caller
|
|
295
|
-
if (this.onDelete) {
|
|
296
|
-
const result = await this.onDelete(event, this.data);
|
|
297
|
-
// User cancelled
|
|
298
|
-
if (isNil(result) || (event && event.defaultPrevented))
|
|
299
|
-
return;
|
|
300
|
-
if (result) {
|
|
301
|
-
await this.modalCtrl.dismiss(this.data, 'delete');
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
// Or dismiss, with the role 'delete'
|
|
305
|
-
else {
|
|
306
|
-
if (this.isNewData) {
|
|
307
|
-
console.error(this._logPrefix + "Trying to delete a new data. Make no sense!");
|
|
308
|
-
}
|
|
309
|
-
await this.modalCtrl.dismiss(this.data, 'delete');
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
catch (err) {
|
|
313
|
-
this.submitted = true;
|
|
314
|
-
this.setError(err);
|
|
315
|
-
this.selectedTabIndex = 0;
|
|
316
|
-
this.markAsSaved();
|
|
317
|
-
if (this.enabled)
|
|
318
|
-
this.enable();
|
|
319
|
-
return false;
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
resetError(opts) {
|
|
323
|
-
if (isNotNilOrBlank(this.error)) {
|
|
324
|
-
this.error = null;
|
|
325
|
-
if (!opts || opts.emitEvent !== false)
|
|
326
|
-
this.markForCheck();
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
setError(err, opts) {
|
|
330
|
-
if (!err) {
|
|
331
|
-
super.setError(undefined, opts);
|
|
332
|
-
}
|
|
333
|
-
else if (typeof err === 'string') {
|
|
334
|
-
console.error('[entity-editor] Error: ' + (err || ''));
|
|
335
|
-
super.setError(err, opts);
|
|
336
|
-
}
|
|
337
|
-
else {
|
|
338
|
-
console.error('[entity-editor] Error: ' + err.message || '', err);
|
|
339
|
-
let userMessage = err.message && this.translate.instant(err.message) || err;
|
|
340
|
-
// Add details error (if any) under the main message
|
|
341
|
-
const detailMessage = (!err.details || typeof err.details === 'string')
|
|
342
|
-
? err.details
|
|
343
|
-
: err.details.message;
|
|
344
|
-
if (isNotNilOrBlank(detailMessage)) {
|
|
345
|
-
const cssClass = opts?.detailsCssClass || 'hidden-xs hidden-sm';
|
|
346
|
-
userMessage += `<br/><small class="${cssClass}" title="${detailMessage}">`;
|
|
347
|
-
userMessage += detailMessage.length < 70 ? detailMessage : detailMessage.substring(0, 67) + '...';
|
|
348
|
-
userMessage += '</small>';
|
|
349
|
-
}
|
|
350
|
-
super.setError(userMessage, opts);
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
/* -- protected methods -- */
|
|
354
|
-
waitWhilePending(opts) {
|
|
355
|
-
return AppFormUtils.waitWhilePending(this, opts);
|
|
356
|
-
}
|
|
357
|
-
async getValue() {
|
|
358
|
-
const json = await this.getJsonValueToSave();
|
|
359
|
-
const res = new this.dataType();
|
|
360
|
-
res.fromObject(json);
|
|
361
|
-
return res;
|
|
362
|
-
}
|
|
363
|
-
getJsonValueToSave() {
|
|
364
|
-
return Promise.resolve(this.form.value);
|
|
365
|
-
}
|
|
366
|
-
/**
|
|
367
|
-
* Compute the title
|
|
368
|
-
*
|
|
369
|
-
* @param data
|
|
370
|
-
*/
|
|
371
|
-
async updateTitle(data) {
|
|
372
|
-
data = data || this.data;
|
|
373
|
-
const title = await this.computeTitle(data);
|
|
374
|
-
this.$title.next(title);
|
|
375
|
-
}
|
|
376
|
-
async scrollToTop(duration) {
|
|
377
|
-
if (this.content) {
|
|
378
|
-
return this.content.scrollToTop(duration);
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
markForCheck() {
|
|
382
|
-
this.cd?.markForCheck();
|
|
383
|
-
}
|
|
384
|
-
/* -- private functions -- */
|
|
385
|
-
/**
|
|
386
|
-
* Open the first tab that is invalid
|
|
387
|
-
*/
|
|
388
|
-
openFirstInvalidTab() {
|
|
389
|
-
const invalidTabIndex = this.getFirstInvalidTabIndex();
|
|
390
|
-
if (invalidTabIndex !== -1 && this.selectedTabIndex !== invalidTabIndex) {
|
|
391
|
-
this.selectedTabIndex = invalidTabIndex;
|
|
392
|
-
this.markForCheck();
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
AppEntityEditorModal.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: AppEntityEditorModal, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
|
|
397
|
-
AppEntityEditorModal.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.5", type: AppEntityEditorModal, inputs: { data: "data", mobile: "mobile", usageMode: "usageMode", onAfterModalInit: "onAfterModalInit", onDelete: "onDelete", i18nSuffix: "i18nSuffix", isNew: "isNew", isNewData: "isNewData", disabled: "disabled" }, usesInheritance: true, ngImport: i0 });
|
|
398
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: AppEntityEditorModal, decorators: [{
|
|
399
|
-
type: Directive
|
|
400
|
-
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: undefined }, { type: undefined, decorators: [{
|
|
401
|
-
type: Optional
|
|
402
|
-
}] }]; }, propDecorators: { data: [{
|
|
403
|
-
type: Input
|
|
404
|
-
}], mobile: [{
|
|
405
|
-
type: Input
|
|
406
|
-
}], usageMode: [{
|
|
407
|
-
type: Input
|
|
408
|
-
}], onAfterModalInit: [{
|
|
409
|
-
type: Input
|
|
410
|
-
}], onDelete: [{
|
|
411
|
-
type: Input
|
|
412
|
-
}], i18nSuffix: [{
|
|
413
|
-
type: Input
|
|
414
|
-
}], isNew: [{
|
|
415
|
-
type: Input
|
|
416
|
-
}], isNewData: [{
|
|
417
|
-
type: Input
|
|
418
|
-
}], disabled: [{
|
|
419
|
-
type: Input
|
|
420
|
-
}] } });
|
|
421
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWVkaXRvci1tb2RhbC5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9mb3JtL2VudGl0eS1lZGl0b3ItbW9kYWwuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixpQkFBaUIsRUFBRSxTQUFTLEVBQVksS0FBSyxFQUFxQixRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxlQUFlLEVBQUUsZUFBZSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFDLGVBQWUsRUFBRSxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFJeEUsT0FBTyxFQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBQzdFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDMUMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDbkUsT0FBTyxFQUFjLFdBQVcsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBQ2pGLE9BQU8sRUFBVSxZQUFZLEVBQWlCLE1BQU0sMEJBQTBCLENBQUM7QUFDL0UsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0saURBQWlELENBQUM7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dG9yUmVmLCBEaXJlY3RpdmUsIEluamVjdG9yLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Um91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtBbGVydENvbnRyb2xsZXIsIE1vZGFsQ29udHJvbGxlcn0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuXG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtMb2NhbFNldHRpbmdzU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvbG9jYWwtc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQge0VudGl0eX0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7VXNhZ2VNb2RlfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9zZXR0aW5ncy5tb2RlbCc7XG5pbXBvcnQge0Zvcm1Hcm91cH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtBcHBUYWJFZGl0b3IsIEFwcFRhYkVkaXRvck9wdGlvbnMsIElBcHBFZGl0b3J9IGZyb20gJy4vZWRpdG9yLmNsYXNzJztcbmltcG9ydCB7QXBwRm9ybVV0aWxzfSBmcm9tICcuL2Zvcm0udXRpbHMnO1xuaW1wb3J0IHtBbGVydHN9IGZyb20gJy4uLy4uL3NoYXJlZC9hbGVydHMnO1xuaW1wb3J0IHtFcnJvckNvZGVzfSBmcm9tICcuLi9zZXJ2aWNlcy9lcnJvcnMnO1xuaW1wb3J0IHtpc05pbCwgaXNOb3ROaWwsIGlzTm90TmlsT3JCbGFua30gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQge0RhdGVGb3JtYXRQaXBlfSBmcm9tICcuLi8uLi9zaGFyZWQvcGlwZXMvZGF0ZS1mb3JtYXQucGlwZSc7XG5pbXBvcnQge0Vudmlyb25tZW50LCBFTlZJUk9OTUVOVH0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcbmltcG9ydCB7d2FpdEZvciwgd2FpdEZvckZhbHNlLCBXYWl0Rm9yT3B0aW9uc30gZnJvbSAnLi4vLi4vc2hhcmVkL29ic2VydmFibGVzJztcbmltcG9ydCB7Rm9ybUVycm9yVHJhbnNsYXRvcn0gZnJvbSAnLi4vLi4vc2hhcmVkL3ZhbGlkYXRvci9mb3JtLWVycm9yLWFkYXB0ZXIuY2xhc3MnO1xuaW1wb3J0IHtBcHBFcnJvcldpdGhEZXRhaWxzfSBmcm9tICcuL2VudGl0eS1lZGl0b3IuY2xhc3MnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWV9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuXG5leHBvcnQgaW50ZXJmYWNlIElFbnRpdHlFZGl0b3JNb2RhbE9wdGlvbnM8XG4gIFQgZXh0ZW5kcyBFbnRpdHk8VCwgSUQ+ICA9IEVudGl0eTxhbnksIGFueT4sXG4gIElEID0gbnVtYmVyPiB7XG5cbiAgLy8gRGF0YVxuICBpc05ldzogYm9vbGVhbjtcbiAgZGF0YTogVDtcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgb25BZnRlck1vZGFsSW5pdD86IDxNIGV4dGVuZHMgQXBwRW50aXR5RWRpdG9yTW9kYWw8VCwgSUQ+Pihtb2RhbDogTSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIG9uRGVsZXRlPzogKGV2ZW50OiBFdmVudCwgZGF0YTogVCkgPT4gUHJvbWlzZTxib29sZWFuPjtcblxuICB1c2FnZU1vZGU6IFVzYWdlTW9kZTtcbiAgbW9iaWxlOiBib29sZWFuO1xuICBpMThuU3VmZml4Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgQXBwRW50aXR5RWRpdG9yTW9kYWxPcHRpb25zIGV4dGVuZHMgQXBwVGFiRWRpdG9yT3B0aW9ucyB7XG4gIGkxOG5QcmVmaXg/OiBzdHJpbmc7XG59XG5cbi8vIEBkeW5hbWljXG5ARGlyZWN0aXZlKClcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFwcEVudGl0eUVkaXRvck1vZGFsPFxuICBUIGV4dGVuZHMgRW50aXR5PFQsIElEPixcbiAgSUQgPSBudW1iZXIsXG4gIE8gZXh0ZW5kcyBBcHBFbnRpdHlFZGl0b3JNb2RhbE9wdGlvbnMgPSBBcHBFbnRpdHlFZGl0b3JNb2RhbE9wdGlvbnNcbiAgPlxuICBleHRlbmRzIEFwcFRhYkVkaXRvcjxULCBJRD5cbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgSUVudGl0eUVkaXRvck1vZGFsT3B0aW9uczxULCBJRD4ge1xuXG4gIHByaXZhdGUgX3VzYWdlTW9kZTogVXNhZ2VNb2RlO1xuICBwcm90ZWN0ZWQgX2xvZ1ByZWZpeDtcbiAgcHJvdGVjdGVkIF9pc05ldzogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGF0ZUZvcm1hdDogRGF0ZUZvcm1hdFBpcGU7XG4gIHByb3RlY3RlZCByZWFkb25seSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWY7XG4gIHByb3RlY3RlZCByZWFkb25seSBzZXR0aW5nczogTG9jYWxTZXR0aW5nc1NlcnZpY2U7XG4gIHByb3RlY3RlZCByZWFkb25seSBtb2RhbEN0cmw6IE1vZGFsQ29udHJvbGxlcjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVudmlyb25lbWVudDogRW52aXJvbm1lbnQ7XG4gIHByb3RlY3RlZCBlcnJvclRyYW5zbGF0b3I6IEZvcm1FcnJvclRyYW5zbGF0b3I7XG5cbiAgcmVhZG9ubHkgc2F2aW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICR0aXRsZSA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICBASW5wdXQoKSBkYXRhOiBUO1xuICBASW5wdXQoKSBtb2JpbGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHVzYWdlTW9kZTogVXNhZ2VNb2RlO1xuICBASW5wdXQoKSBvbkFmdGVyTW9kYWxJbml0OiA8TSBleHRlbmRzIEFwcEVudGl0eUVkaXRvck1vZGFsPFQsIElEPj4obW9kYWw6IE0pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBASW5wdXQoKSBvbkRlbGV0ZTogKGV2ZW50OiBFdmVudCwgZGF0YTogVCkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgQElucHV0KCkgaTE4blN1ZmZpeDogc3RyaW5nID0gbnVsbDtcblxuICBASW5wdXQoKSBzZXQgaXNOZXcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc05ldyA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IGlzTmV3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc05vdE5pbCh0aGlzLl9pc05ldykgPyB0aGlzLl9pc05ldyA6IGlzTmlsKHRoaXMuZGF0YT8uaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBpc05ldyBpbnN0ZWFkXG4gICAqL1xuICBnZXQgaXNOZXdEYXRhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTmV3O1xuICB9XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgaXNOZXcgaW5zdGVhZFxuICAgKi9cbiAgQElucHV0KCkgc2V0IGlzTmV3RGF0YSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuaXNOZXcgPSB2YWx1ZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2VuYWJsZWQgPSAhdmFsdWU7XG4gIH1cblxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLl9lbmFibGVkO1xuICB9XG5cbiAgZ2V0IGlzT25GaWVsZE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MuaXNPbkZpZWxkTW9kZSh0aGlzLl91c2FnZU1vZGUpO1xuICB9XG5cbiAgZ2V0IHNhdmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zYXZpbmdTdWJqZWN0LnZhbHVlO1xuICB9XG5cbiAgbWFya0FzU2F2aW5nKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSl7XG4gICAgaWYgKHRoaXMuc2F2aW5nU3ViamVjdC52YWx1ZSAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zYXZpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtBc1NhdmVkKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSl7XG4gICAgaWYgKHRoaXMuc2F2aW5nU3ViamVjdC52YWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuc2F2aW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgZGF0YVR5cGU6IG5ldygpID0+IFQsXG4gICAgQE9wdGlvbmFsKCkgb3B0aW9ucz86IE9cbiAgKSB7XG4gICAgc3VwZXIobnVsbCxcbiAgICAgIGluamVjdG9yLmdldChSb3V0ZXIpLFxuICAgICAgaW5qZWN0b3IuZ2V0KEFsZXJ0Q29udHJvbGxlciksXG4gICAgICBpbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSksXG4gICAgICBvcHRpb25zKTtcbiAgICB0aGlzLmVudmlyb25lbWVudCA9IGluamVjdG9yLmdldChFTlZJUk9OTUVOVCk7XG4gICAgb3B0aW9ucyA9IDxPPntcbiAgICAgIC8vIERlZmF1bHQgb3B0aW9uc1xuICAgICAgaTE4blByZWZpeDogJycsXG5cbiAgICAgIC8vIE92ZXJyaWRlIGRlZmF1bHRzXG4gICAgICAuLi5vcHRpb25zXG4gICAgfTtcblxuICAgIHRoaXMucXVlcnlUYWJJbmRleFBhcmFtTmFtZSA9IHVuZGVmaW5lZDsgLy8gSW1wb3J0YW50OiBhdm9pZCBxdWVyeSBwYXJhbWV0ZXIgY2hhbmdlZFxuICAgIHRoaXMuc2V0dGluZ3MgPSBpbmplY3Rvci5nZXQoTG9jYWxTZXR0aW5nc1NlcnZpY2UpO1xuICAgIHRoaXMuZXJyb3JUcmFuc2xhdG9yID0gaW5qZWN0b3IuZ2V0KEZvcm1FcnJvclRyYW5zbGF0b3IpO1xuICAgIHRoaXMuY2QgPSBpbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICAgIHRoaXMuZGF0ZUZvcm1hdCA9IGluamVjdG9yLmdldChEYXRlRm9ybWF0UGlwZSk7XG4gICAgdGhpcy5tb2RhbEN0cmwgPSBpbmplY3Rvci5nZXQoTW9kYWxDb250cm9sbGVyKTtcbiAgICB0aGlzLmkxOG5Db250ZXh0ID0ge1xuICAgICAgcHJlZml4OiBvcHRpb25zLmkxOG5QcmVmaXgsXG4gICAgICBzdWZmaXg6IHRoaXMuaTE4blN1ZmZpeCB8fCAnJ1xuICAgIH07XG5cbiAgICAvLyBGT1IgREVWIE9OTFkgLS0tLVxuICAgIC8vdGhpcy5kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG5cbiAgICAvLyBEZWZhdWx0IHZhbHVlc1xuICAgIHRoaXMubW9iaWxlID0gaXNOb3ROaWwodGhpcy5tb2JpbGUpID8gdGhpcy5tb2JpbGUgOiB0aGlzLnNldHRpbmdzLm1vYmlsZTtcblxuICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICAvLyBSZWdpc3RlciBmb3Jtc1xuICAgIHRoaXMucmVnaXN0ZXJGb3JtcygpO1xuXG4gICAgLy8gRGlzYWJsZVxuICAgIGlmICh0aGlzLmRpc2FibGVkKSB0aGlzLmRpc2FibGUoKTtcblxuICAgIGlmICh0aGlzLmlzTmV3RGF0YSkge1xuICAgICAgLy8gVXBkYXRlIHRoZSB0aXRsZS5cbiAgICAgIHRoaXMudXBkYXRlVGl0bGUoKTtcbiAgICB9XG5cbiAgICBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZSB0aXRsZSBlYWNoIHRpbWUgdmFsdWUgY2hhbmdlc1xuICAgICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgICAgdGhpcy5mb3JtLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgyNTApKVxuICAgICAgICAgIC5zdWJzY3JpYmUoanNvbiA9PiB0aGlzLnVwZGF0ZVRpdGxlKGpzb24pKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG5cbiAgICBpZiAodGhpcy5vbkFmdGVyTW9kYWxJbml0KSB7XG4gICAgICBQcm9taXNlLnJlc29sdmUodGhpcy5vbkFmdGVyTW9kYWxJbml0KHRoaXMpKVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLmxvYWQoKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgLy8gVXNlIGEgdGltZW91dCB0byBhdm9pZCBlcnJvciAnTkcwMTAwOiBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yJ1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmxvYWQoKSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB0aGlzLiR0aXRsZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuJHRpdGxlLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zYXZpbmdTdWJqZWN0LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICB3YWl0SWRsZShvcHRzPzogV2FpdEZvck9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBXYWl0IGVuZCBvZiBzYXZpbmdcbiAgICBpZiAodGhpcy5zYXZpbmcpIHJldHVybiB3YWl0Rm9yRmFsc2UodGhpcy5zYXZpbmdTdWJqZWN0KTtcblxuICAgIHJldHVybiBzdXBlci53YWl0SWRsZShvcHRzKTtcbiAgfVxuXG4gIGFzeW5jIGxvYWQoKSB7XG4gICAgdGhpcy5tYXJrQXNSZWFkeSgpO1xuICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlVmlldyh0aGlzLmRhdGEpO1xuICAgIH1cbiAgICBjYXRjaChlcnIpIHtcbiAgICAgIGlmIChlcnIgPT09ICdDQU5DRUxMRUQnKSByZXR1cm47XG4gICAgICB0aGlzLnNldEVycm9yKGVycik7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSAwO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmRpcnR5KSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2FkKCk7XG4gICAgfVxuICB9XG5cbiAgdW5sb2FkKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGltcGxlbWVudGVkIG9uIG1vZGFsXCIpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlVmlldyhkYXRhOiBUIHwgbnVsbCwgb3B0cz86IHtcbiAgICBlbWl0RXZlbnQ/OiBib29sZWFuO1xuICAgIG9wZW5UYWJJbmRleD86IG51bWJlcjtcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgdGhpcy5yZXNldEVycm9yKCk7XG5cbiAgICBpZiAoIXRoaXMuZGF0YSkgdGhyb3cge2NvZGU6IEVycm9yQ29kZXMuREFUQV9OT1RfRk9VTkRfRVJST1IsIG1lc3NhZ2U6ICdFUlJPUi5EQVRBX05PX0ZPVU5EJ307XG5cbiAgICBhd2FpdCB0aGlzLnNldFZhbHVlKGRhdGEpO1xuXG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgdGhpcy5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICAgIHRoaXMudXBkYXRlVmlld1N0YXRlKGRhdGEpO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIHRpdGxlLlxuICAgICAgdGhpcy51cGRhdGVUaXRsZShkYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIG9yIGRpc2FibGUgc3RhdGVcbiAgICovXG4gIHVwZGF0ZVZpZXdTdGF0ZShkYXRhOiBULCBvcHRzPzoge29ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKHRoaXMuaXNOZXdEYXRhIHx8IHRoaXMuZW5hYmxlZCkge1xuICAgICAgdGhpcy5lbmFibGUob3B0cyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlKG9wdHMpO1xuXG4gICAgICAvLyBBbGxvdyB0byBzb3J0IHRhYmxlXG4gICAgICB0aGlzLnRhYmxlcz8uZm9yRWFjaCh0ID0+IHQuZW5hYmxlU29ydCgpKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzYXZlQW5kQ2xvc2UoZXZlbnQ/OiBFdmVudHxFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuc2F2ZUFuZEdldERhdGFJZlZhbGlkKCk7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRoaXMubW9kYWxDdHJsLmRpc21pc3MoZGF0YSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgY2xvc2UoZXZlbnQ6IEV2ZW50fEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZGlydHkpIHtcbiAgICAgIGNvbnN0IHNhdmVCZWZvcmVMZWF2ZSA9IGF3YWl0IEFsZXJ0cy5hc2tTYXZlQmVmb3JlTGVhdmUodGhpcy5hbGVydEN0cmwsIHRoaXMudHJhbnNsYXRlLCBldmVudCk7XG5cbiAgICAgIC8vIFVzZXIgY2FuY2VsbGVkXG4gICAgICBpZiAoaXNOaWwoc2F2ZUJlZm9yZUxlYXZlKSB8fCBldmVudCAmJiBldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSXMgdXNlciBjb25maXJtOiBjbG9zZSBub3JtYWxseVxuICAgICAgaWYgKHNhdmVCZWZvcmVMZWF2ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnNhdmVBbmRDbG9zZShldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLm1vZGFsQ3RybC5kaXNtaXNzKCk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSB0aGUgZWRpdG9yLCBieSBjYWxsaW5nIHRoZSBkYXRhU2VydmljZS5zYXZlKCkuXG4gICAqIEVuc3VyZSB0aGF0IGVkaXRvciBpZiB2YWxpZC4gSWYgbm90LCBkaXNwbGF5IGFuIGVycm9yXG4gICAqIEBwYXJhbSBldmVudFxuICAgKiBAcGFyYW0gb3B0c1xuICAgKi9cbiAgYXN5bmMgc2F2ZShldmVudD86IEV2ZW50fEV2ZW50LCBvcHRzPzogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMubG9hZGluZyB8fCB0aGlzLnNhdmluZyB8fCB0aGlzLmRpc2FibGVkKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKHRoaXMuX2xvZ1ByZWZpeCArICdTa2lwIHNhdmU6IG1vZGFsIGlzIGJ1c3kgKGxvYWRpbmcgb3Igc2F2aW5nKScpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZGlydHkpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcodGhpcy5fbG9nUHJlZml4ICsgJ1NraXAgc2F2ZTogbW9kYWwgbm90IGRpcnR5Jyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBXYWl0IGVuZCBvZiBhc3luYyB2YWxpZGF0aW9uXG4gICAgYXdhaXQgdGhpcy53YWl0V2hpbGVQZW5kaW5nKCk7XG5cbiAgICAvLyBJZiBpbnZhbGlkXG4gICAgaWYgKHRoaXMuaW52YWxpZCkge1xuICAgICAgdGhpcy5sb2dGb3JtRXJyb3JzKCk7XG4gICAgICB0aGlzLnNldEVycm9yKCdDT01NT04uRk9STS5IQVNfRVJST1InKTtcbiAgICAgIHRoaXMub3BlbkZpcnN0SW52YWxpZFRhYigpO1xuICAgICAgdGhpcy5zY3JvbGxUb1RvcCgpO1xuICAgICAgdGhpcy5tYXJrQWxsQXNUb3VjaGVkKCk7XG5cbiAgICAgIHRoaXMuc3VibWl0dGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLm1hcmtBc1NhdmluZygpO1xuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuXG4gICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5fbG9nUHJlZml4ICsgJ1NhdmluZyBkYXRhLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gU2F2ZSBhbGwgZGlydHkgY2hpbGRyZW5cbiAgICAgIGNvbnN0IHNhdmVkID0gYXdhaXQgdGhpcy5zYXZlRGlydHlDaGlsZHJlbigpO1xuICAgICAgaWYgKCFzYXZlZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBGaWxsIGRhdGFcbiAgICAgIHRoaXMuZGF0YSA9IGF3YWl0IHRoaXMuZ2V0VmFsdWUoKTtcblxuICAgICAgLy8gTWFyayBhcyBzdWJtaXR0ZWRcbiAgICAgIHRoaXMuc3VibWl0dGVkID0gdHJ1ZTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLnN1Ym1pdHRlZCA9IHRydWU7XG4gICAgICB0aGlzLnNldEVycm9yKGVycik7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSAwO1xuICAgICAgdGhpcy5zY3JvbGxUb1RvcCgpOyAvLyBTY3JvbGwgdG8gdG9wICh0byBzaG93IGVycm9yKVxuICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgdGhpcy5lbmFibGUoKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLm1hcmtBc1NhdmVkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgZGF0YSAoaWYgZGlydHkgYW5kIHZhbGlkKSwgYW5kIHJldHVybiBpdC4gT3RoZXJ3aXNlLCByZXR1cm4gbmlsIHZhbHVlLlxuICAgKi9cbiAgYXN5bmMgc2F2ZUFuZEdldERhdGFJZlZhbGlkKCk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIEZvcm0gaXMgbm90IHZhbGlkXG4gICAgaWYgKCF0aGlzLnZhbGlkKSB7XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB2YWxpZGF0aW9uIGlzIGZpbmlzaGVkXG4gICAgICBhd2FpdCBBcHBGb3JtVXRpbHMud2FpdFdoaWxlUGVuZGluZyh0aGlzKTtcblxuICAgICAgLy8gSWYgaW52YWxpZDogT3BlbiB0aGUgZmlyc3QgdGFiIGluIGVycm9yXG4gICAgICBpZiAodGhpcy5pbnZhbGlkKSB7XG4gICAgICAgIHRoaXMub3BlbkZpcnN0SW52YWxpZFRhYigpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICAvLyBDb250aW51ZSAodmFsaWQpXG4gICAgfVxuXG4gICAgLy8gRm9ybSBpcyB2YWxpZCwgYnV0IG5vdCBzYXZlZFxuICAgIGlmICh0aGlzLmRpcnR5KSB7XG4gICAgICBjb25zdCBzYXZlZCA9IGF3YWl0IHRoaXMuc2F2ZShuZXcgRXZlbnQoJ3NhdmUnKSk7XG4gICAgICBpZiAoIXNhdmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFZhbGlkIGFuZCBzYXZlZCBkYXRhXG4gICAgcmV0dXJuIHRoaXMuZGF0YTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShldmVudD86IEV2ZW50fEV2ZW50KSB7XG4gICAgaWYgKHRoaXMubG9hZGluZyB8fCB0aGlzLnNhdmluZykgcmV0dXJuIGZhbHNlO1xuXG4gICAgdGhpcy5tYXJrQXNTYXZpbmcoKTtcbiAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgICB0cnkge1xuXG4gICAgICAvLyBEZWxlZ2F0ZSBkZWxldGlvbiB0byBtb2RhbCBjYWxsZXJcbiAgICAgIGlmICh0aGlzLm9uRGVsZXRlKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub25EZWxldGUoZXZlbnQsIHRoaXMuZGF0YSk7XG5cbiAgICAgICAgLy8gVXNlciBjYW5jZWxsZWRcbiAgICAgICAgaWYgKGlzTmlsKHJlc3VsdCkgfHwgKGV2ZW50ICYmIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMubW9kYWxDdHJsLmRpc21pc3ModGhpcy5kYXRhLCAnZGVsZXRlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gT3IgZGlzbWlzcywgd2l0aCB0aGUgcm9sZSAnZGVsZXRlJ1xuICAgICAgZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmlzTmV3RGF0YSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IodGhpcy5fbG9nUHJlZml4ICsgXCJUcnlpbmcgdG8gZGVsZXRlIGEgbmV3IGRhdGEuIE1ha2Ugbm8gc2Vuc2UhXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5tb2RhbEN0cmwuZGlzbWlzcyh0aGlzLmRhdGEsICdkZWxldGUnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5zZXRFcnJvcihlcnIpO1xuICAgICAgdGhpcy5zZWxlY3RlZFRhYkluZGV4ID0gMDtcbiAgICAgIHRoaXMubWFya0FzU2F2ZWQoKTtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQpIHRoaXMuZW5hYmxlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRFcnJvcihvcHRzPzoge2VtaXRFdmVudD86IGJvb2xlYW59KSB7XG4gICAgaWYgKGlzTm90TmlsT3JCbGFuayh0aGlzLmVycm9yKSkge1xuICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHNldEVycm9yKGVycjogc3RyaW5nIHwgQXBwRXJyb3JXaXRoRGV0YWlscywgb3B0cz86IHtlbWl0RXZlbnQ/OiBib29sZWFuOyBkZXRhaWxzQ3NzQ2xhc3M/OiBzdHJpbmc7fSkge1xuICAgIGlmICghZXJyKSB7XG4gICAgICBzdXBlci5zZXRFcnJvcih1bmRlZmluZWQsIG9wdHMpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc29sZS5lcnJvcignW2VudGl0eS1lZGl0b3JdIEVycm9yOiAnICsgKGVyciB8fCAnJykpO1xuICAgICAgc3VwZXIuc2V0RXJyb3IoZXJyIGFzIHN0cmluZywgb3B0cyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignW2VudGl0eS1lZGl0b3JdIEVycm9yOiAnICsgZXJyLm1lc3NhZ2UgfHwgJycsIGVycik7XG4gICAgICBsZXQgdXNlck1lc3NhZ2UgPSBlcnIubWVzc2FnZSAmJiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGVyci5tZXNzYWdlKSB8fCBlcnI7XG5cbiAgICAgIC8vIEFkZCBkZXRhaWxzIGVycm9yIChpZiBhbnkpIHVuZGVyIHRoZSBtYWluIG1lc3NhZ2VcbiAgICAgIGNvbnN0IGRldGFpbE1lc3NhZ2UgPSAoIWVyci5kZXRhaWxzIHx8IHR5cGVvZiBlcnIuZGV0YWlscyA9PT0gJ3N0cmluZycpXG4gICAgICAgID8gZXJyLmRldGFpbHMgYXMgc3RyaW5nXG4gICAgICAgIDogZXJyLmRldGFpbHMubWVzc2FnZTtcbiAgICAgIGlmIChpc05vdE5pbE9yQmxhbmsoZGV0YWlsTWVzc2FnZSkpIHtcbiAgICAgICAgY29uc3QgY3NzQ2xhc3MgPSBvcHRzPy5kZXRhaWxzQ3NzQ2xhc3MgfHwgJ2hpZGRlbi14cyBoaWRkZW4tc20nO1xuICAgICAgICB1c2VyTWVzc2FnZSArPSBgPGJyLz48c21hbGwgY2xhc3M9XCIke2Nzc0NsYXNzfVwiIHRpdGxlPVwiJHtkZXRhaWxNZXNzYWdlfVwiPmA7XG4gICAgICAgIHVzZXJNZXNzYWdlICs9IGRldGFpbE1lc3NhZ2UubGVuZ3RoIDwgNzAgPyBkZXRhaWxNZXNzYWdlIDogZGV0YWlsTWVzc2FnZS5zdWJzdHJpbmcoMCwgNjcpICsgJy4uLic7XG4gICAgICAgIHVzZXJNZXNzYWdlICs9ICc8L3NtYWxsPic7XG4gICAgICB9XG4gICAgICBzdXBlci5zZXRFcnJvcih1c2VyTWVzc2FnZSwgb3B0cyk7XG4gICAgfVxuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIGFic3RyYWN0IG1ldGhvZHMgKHRvIG92ZXJyaWRlKSAtLSAqL1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZWdpc3RlckZvcm1zKCk7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNvbXB1dGVUaXRsZShkYXRhOiBUKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzZXRWYWx1ZShkYXRhOiBUKTogUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBmb3JtKCk6IEZvcm1Hcm91cDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0Rmlyc3RJbnZhbGlkVGFiSW5kZXgoKTogbnVtYmVyO1xuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2RzIC0tICovXG5cbiAgcHJvdGVjdGVkIHdhaXRXaGlsZVBlbmRpbmcob3B0cz86IFdhaXRGb3JPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIEFwcEZvcm1VdGlscy53YWl0V2hpbGVQZW5kaW5nKHRoaXMsIG9wdHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldFZhbHVlKCk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCB0aGlzLmdldEpzb25WYWx1ZVRvU2F2ZSgpO1xuXG4gICAgY29uc3QgcmVzID0gbmV3IHRoaXMuZGF0YVR5cGUoKTtcbiAgICByZXMuZnJvbU9iamVjdChqc29uKTtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0SnNvblZhbHVlVG9TYXZlKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmZvcm0udmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgdGhlIHRpdGxlXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlVGl0bGUoZGF0YT86IFQpIHtcbiAgICBkYXRhID0gZGF0YSB8fCB0aGlzLmRhdGE7XG4gICAgY29uc3QgdGl0bGUgPSBhd2FpdCB0aGlzLmNvbXB1dGVUaXRsZShkYXRhKTtcbiAgICB0aGlzLiR0aXRsZS5uZXh0KHRpdGxlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBzY3JvbGxUb1RvcChkdXJhdGlvbj86IG51bWJlcikge1xuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQuc2Nyb2xsVG9Ub3AoZHVyYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZD8ubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiAtLSBwcml2YXRlIGZ1bmN0aW9ucyAtLSAqL1xuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBmaXJzdCB0YWIgdGhhdCBpcyBpbnZhbGlkXG4gICAqL1xuICBwcml2YXRlIG9wZW5GaXJzdEludmFsaWRUYWIoKSB7XG4gICAgY29uc3QgaW52YWxpZFRhYkluZGV4ID0gdGhpcy5nZXRGaXJzdEludmFsaWRUYWJJbmRleCgpO1xuICAgIGlmIChpbnZhbGlkVGFiSW5kZXggIT09IC0xICYmIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCAhPT0gaW52YWxpZFRhYkluZGV4KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSBpbnZhbGlkVGFiSW5kZXg7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG59XG4iXX0=
|