@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
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { SharedModule } from '../../shared/shared.module';
|
|
3
|
+
import { TableSelectColumnsComponent } from './table-select-columns.component';
|
|
4
|
+
import { ActionsColumnComponent } from './actions-column.component';
|
|
5
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@ngx-translate/core";
|
|
8
|
+
export class AppTableModule {
|
|
9
|
+
}
|
|
10
|
+
AppTableModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: AppTableModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
11
|
+
AppTableModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.2.8", ngImport: i0, type: AppTableModule, declarations: [
|
|
12
|
+
// Components
|
|
13
|
+
TableSelectColumnsComponent,
|
|
14
|
+
ActionsColumnComponent], imports: [SharedModule, i1.TranslateModule], exports: [TranslateModule,
|
|
15
|
+
// Components
|
|
16
|
+
TableSelectColumnsComponent,
|
|
17
|
+
ActionsColumnComponent] });
|
|
18
|
+
AppTableModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: AppTableModule, imports: [SharedModule,
|
|
19
|
+
TranslateModule.forChild(), TranslateModule] });
|
|
20
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: AppTableModule, decorators: [{
|
|
21
|
+
type: NgModule,
|
|
22
|
+
args: [{
|
|
23
|
+
imports: [
|
|
24
|
+
SharedModule,
|
|
25
|
+
TranslateModule.forChild()
|
|
26
|
+
],
|
|
27
|
+
declarations: [
|
|
28
|
+
// Components
|
|
29
|
+
TableSelectColumnsComponent,
|
|
30
|
+
ActionsColumnComponent,
|
|
31
|
+
],
|
|
32
|
+
exports: [
|
|
33
|
+
TranslateModule,
|
|
34
|
+
// Components
|
|
35
|
+
TableSelectColumnsComponent,
|
|
36
|
+
ActionsColumnComponent
|
|
37
|
+
]
|
|
38
|
+
}]
|
|
39
|
+
}] });
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL3RhYmxlL3RhYmxlLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUM3RSxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0scUJBQXFCLENBQUM7OztBQW9CcEQsTUFBTSxPQUFPLGNBQWM7OzJHQUFkLGNBQWM7NEdBQWQsY0FBYztRQVh2QixhQUFhO1FBQ2IsMkJBQTJCO1FBQzNCLHNCQUFzQixhQVB0QixZQUFZLGlDQVVaLGVBQWU7UUFDZixhQUFhO1FBQ2IsMkJBQTJCO1FBQzNCLHNCQUFzQjs0R0FHYixjQUFjLFlBaEJ2QixZQUFZO1FBQ1osZUFBZSxDQUFDLFFBQVEsRUFBRSxFQVMxQixlQUFlOzJGQU1OLGNBQWM7a0JBbEIxQixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLGVBQWUsQ0FBQyxRQUFRLEVBQUU7cUJBQzNCO29CQUVELFlBQVksRUFBRTt3QkFDWixhQUFhO3dCQUNiLDJCQUEyQjt3QkFDM0Isc0JBQXNCO3FCQUN2QjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsZUFBZTt3QkFDZixhQUFhO3dCQUNiLDJCQUEyQjt3QkFDM0Isc0JBQXNCO3FCQUN2QjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TmdNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtTaGFyZWRNb2R1bGV9IGZyb20gJy4uLy4uL3NoYXJlZC9zaGFyZWQubW9kdWxlJztcbmltcG9ydCB7VGFibGVTZWxlY3RDb2x1bW5zQ29tcG9uZW50fSBmcm9tICcuL3RhYmxlLXNlbGVjdC1jb2x1bW5zLmNvbXBvbmVudCc7XG5pbXBvcnQge0FjdGlvbnNDb2x1bW5Db21wb25lbnR9IGZyb20gJy4vYWN0aW9ucy1jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIFNoYXJlZE1vZHVsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUuZm9yQ2hpbGQoKVxuICBdLFxuXG4gIGRlY2xhcmF0aW9uczogW1xuICAgIC8vIENvbXBvbmVudHNcbiAgICBUYWJsZVNlbGVjdENvbHVtbnNDb21wb25lbnQsXG4gICAgQWN0aW9uc0NvbHVtbkNvbXBvbmVudCxcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAvLyBDb21wb25lbnRzXG4gICAgVGFibGVTZWxlY3RDb2x1bW5zQ29tcG9uZW50LFxuICAgIEFjdGlvbnNDb2x1bW5Db21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBBcHBUYWJsZU1vZHVsZSB7XG59XG4iXX0=
|
|
@@ -36,8 +36,8 @@ import * as i19 from "@angular/material/tooltip";
|
|
|
36
36
|
import * as i20 from "../../../shared/material/autocomplete/material.autocomplete";
|
|
37
37
|
import * as i21 from "../../../shared/directives/autofocus.directive";
|
|
38
38
|
import * as i22 from "../../../shared/toolbar/toolbar";
|
|
39
|
-
import * as i23 from "
|
|
40
|
-
import * as i24 from "
|
|
39
|
+
import * as i23 from "../../form/buttons/form-buttons-bar.component";
|
|
40
|
+
import * as i24 from "../actions-column.component";
|
|
41
41
|
import * as i25 from "../../../shared/pipes/date-format.pipe";
|
|
42
42
|
import * as i26 from "../../../shared/pipes/number-format.pipe";
|
|
43
43
|
import * as i27 from "../../../shared/pipes/arrays.pipe";
|
|
@@ -229,8 +229,8 @@ export class TableTestPage extends AppTable {
|
|
|
229
229
|
}
|
|
230
230
|
}
|
|
231
231
|
TableTestPage.maxRowCount = 100;
|
|
232
|
-
TableTestPage.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.
|
|
233
|
-
TableTestPage.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.
|
|
232
|
+
TableTestPage.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: TableTestPage, deps: [{ token: i0.Injector }, { token: i1.AppValidatorService }, { token: i2.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
233
|
+
TableTestPage.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.8", type: TableTestPage, selector: "app-table-testing", inputs: { enableInfiniteScroll: "enableInfiniteScroll", useSticky: "useSticky" }, providers: [
|
|
234
234
|
{
|
|
235
235
|
provide: AppValidatorService,
|
|
236
236
|
useClass: ReferentialValidatorService
|
|
@@ -238,8 +238,8 @@ TableTestPage.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version:
|
|
|
238
238
|
{
|
|
239
239
|
provide: AppTable, useExisting: forwardRef(() => TableTestPage),
|
|
240
240
|
}
|
|
241
|
-
], viewQueries: [{ propertyName: "filterExpansionPanel", first: true, predicate: MatExpansionPanel, descendants: true, static: true }, { propertyName: "infiniteScroll", first: true, predicate: IonInfiniteScroll, descendants: true }], usesInheritance: true, ngImport: i0, template: "<app-toolbar color=\"primary\" [canGoBack]=\"true\"\n [hasValidate]=\"!(loadingSubject|async) && dirty\"\n (onValidate)=\"save()\"\n [backHref]=\"'/testing'\">\n <ion-buttons slot=\"end\">\n\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n <!-- Add -->\n <button mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"'COMMON.BTN_ADD'|translate\"\n (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\"\n *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold;\">close</mat-icon>\n </button>\n\n <!-- show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon *ngIf=\"filterCriteriaCount; else emptyFilter\"\n [matBadge]=\"filterCriteriaCount\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\">filter_list_alt\n </mat-icon>\n <ng-template #emptyFilter>\n <mat-icon>filter_list_alt</mat-icon>\n </ng-template>\n </button>\n\n <!-- show filter -->\n <button mat-icon-button *ngIf=\"mobile\"\n [disabled]=\"!(dirtySubject|async)\"\n (click)=\"save()\">\n <mat-icon>save</mat-icon>\n </button>\n\n <!-- start/stop timer to auto-load data -->\n <ion-button *ngIf=\"!timer\" (click)=\"startTimer()\">Start reload</ion-button>\n <ion-button *ngIf=\"timer\" (click)=\"stopTimer()\" color=\"accent\">Stop reload</ion-button>\n </ng-container>\n\n <!-- if row selection -->\n <ng-template #hasSelection>\n\n <!-- delete -->\n <button mat-icon-button\n *ngIf=\"canEdit\" [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n\n <!-- duplicate -->\n <button mat-icon-button\n *ngIf=\"canEdit && selection.selected | isArrayLength: {equals: 1}\"\n [title]=\"'COMMON.BTN_DUPLICATE'|translate\"\n (click)=\"duplicateRow($event, selection.selected[0])\">\n <mat-icon>file_copy</mat-icon>\n </button>\n </ng-template>\n </ion-buttons>\n</app-toolbar>\n<ion-content class=\"ion-no-padding\">\n\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- error -->\n <ion-item *ngIf=\"mobile && error\" lines=\"none\" @slideUpDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <!-- search -->\n <mat-expansion-panel #filterExpansionPanel class=\"filter-panel filter-panel-floating\">\n <form class=\"form-container ion-padding-top\" [formGroup]=\"filterForm\" (ngSubmit)=\"applyFilterAndClosePanel($event)\">\n\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search text -->\n <mat-form-field>\n <ion-icon matPrefix name=\"search\"></ion-icon>\n <input matInput\n formControlName=\"searchText\"\n autocomplete=\"off\"\n [placeholder]=\"'TABLE.TESTING.SEARCH_TEXT'|translate\">\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label [hidden]=\"(loadingSubject|async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\">\n {{ (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT') | translate: {\n count: (totalRowCount |\n numberFormat)\n } }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\"\n (click)=\"filterExpansionPanel.close()\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\">\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n </mat-action-row>\n </mat-expansion-panel>\n\n <!-- table -->\n <div [class.table-container]=\"!enableInfiniteScroll\">\n <table #table mat-table matSort matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\">\n\n <!-- group header cells -->\n\n <ng-container matColumnDef=\"top-start\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\" [attr.colspan]=\"2\">\n <!-- start spacer -->\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"group-1\">\n <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"3\" style=\"background-color: whitesmoke; margin-bottom: -1px;\">\n <ion-label translate>{{i18nColumnPrefix + 'GROUP_1'}}</ion-label>\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"group-2\">\n <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"3\">\n <ion-label translate>{{i18nColumnPrefix + 'GROUP_2'}}</ion-label>\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"top-end\" >\n <th mat-header-cell *matHeaderCellDef>\n <!-- end spacer -->\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\" [class.mat-column-sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\" [class.mat-column-sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">{{ row.currentData?.id }}</td>\n </ng-container>\n\n <!-- Label column -->\n <ng-container matColumnDef=\"label\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.LABEL</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn='label'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput\n [formControl]=\"row.validator.controls['label']\"\n [placeholder]=\"'TABLE.TESTING.LABEL'|translate\"\n [appAutofocus]=\"row.editing && focusColumn === 'label'\"\n [readonly]=\"!row.editing\">\n <mat-error *ngIf=\"row.validator.controls['label'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Name column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.NAME</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\"\n (click)=\"focusColumn='name'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput\n [formControl]=\"row.validator?.controls.name\" [placeholder]=\"'TABLE.TESTING.NAME'|translate\"\n [appAutofocus]=\"row.editing && focusColumn === 'name'\"\n [readonly]=\"!row.editing\">\n <mat-error *ngIf=\"row.validator?.controls.name.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Level column -->\n <ng-container matColumnDef=\"levelId\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.LEVEL_ID</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\">\n <mat-autocomplete-field floatLabel=\"never\"\n [formControl]=\"row.validator.controls.levelId\"\n [config]=\"autocompleteFields.level\"\n [readonly]=\"!row.editing\"\n [required]=\"true\">\n </mat-autocomplete-field>\n </td>\n </ng-container>\n\n <!-- Status column -->\n <ng-container matColumnDef=\"statusId\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.STATUS</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\">\n <mat-form-field floatLabel=\"never\">\n <ion-icon matPrefix *ngIf=\"row.validator.controls['statusId'].value >=0\" [name]=\"statusById[row.validator.controls['statusId'].value]?.icon\"></ion-icon>\n\n <mat-select [formControl]=\"row.validator.controls['statusId']\" [placeholder]=\"i18nColumnPrefix + 'STATUS_ID'|translate\">\n <mat-select-trigger>\n <span *ngIf=\"row.validator.controls['statusId'].value >=0\">\n {{ statusById[row.validator.controls['statusId'].value]?.label | translate}}</span>\n </mat-select-trigger>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['statusId'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n\n <!-- Creation date column -->\n <ng-container matColumnDef=\"updateDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.UPDATE_DATE</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-form-field-disabled\">\n <ion-text class=\"ion-text-end\" color=\"medium\" *ngIf=\"row.id!==-1\">\n <small [matTooltip]=\"'TABLE.TESTING.CREATION_DATE'|translate\" *ngIf=\"row.currentData.creationDate; let creationDate\">\n <ion-icon name=\"calendar\"></ion-icon>\n {{ creationDate | dateFormat: {time: true} }}\n </small><br/>\n <small [matTooltip]=\"'TABLE.TESTING.UPDATE_DATE'|translate\" *ngIf=\"row.currentData.updateDate; let updateDate\">\n <ion-icon name=\"time-outline\"></ion-icon>\n {{ updateDate | dateFormat: {time: true} }}\n </small>\n </ion-text>\n </td>\n </ng-container>\n\n <!-- Comment column -->\n <ng-container matColumnDef=\"comments\">\n <th mat-header-cell *matHeaderCellDef>\n <ion-label translate>TABLE.TESTING.COMMENTS</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-form-field floatLabel=\"never\" *ngIf=\"row.editing; else iconComment\">\n <!--<textarea matInput [formControl]=\"row.validator?.controls.comments\"\n [placeholder]=\"'TABLE.TESTING.COMMENTS'|translate\"\n [readonly]=\"!row.editing\"></textarea>-->\n\n <input type=\"text\" matInput [formControl]=\"row.validator?.controls.comments\"\n [placeholder]=\"'TABLE.TESTING.COMMENTS'|translate\"\n [readonly]=\"!row.editing\">\n </mat-form-field>\n\n <ng-template #iconComment>\n <mat-icon class=\"comment\"\n *ngIf=\"row.validator?.controls.comments.value\"\n [title]=\"row.validator?.controls.comments.value\"></mat-icon>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column [stickyEnd]=\"true\" [canCancel]=\"false\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [cellTemplate]=\"cellInjection\">\n\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <span *ngIf=\"row.editing && !row.validator.dirty\">-</span>\n </ng-template>\n\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"groupColumns;\" class=\"mat-toolbar\"></tr>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-disabled]=\"!row.editing\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n\n <ion-infinite-scroll *ngIf=\"enableInfiniteScroll\"\n [threshold]=\"mobile ? '10%' : '2%'\" position=\"bottom\"\n (ionInfinite)=\"fetchMore($event)\">\n <ion-infinite-scroll-content\n loadingSpinner=\"circles\"\n [loadingText]=\"'COMMON.LOADING_DOTS'|translate\">\n </ion-infinite-scroll-content>\n </ion-infinite-scroll>\n </div>\n</ion-content>\n\n<ion-footer>\n <!-- Paginator -->\n <mat-paginator *ngIf=\"!enableInfiniteScroll\"\n [length]=\"totalRowCount\" [pageSize]=\"defaultPageSize\" [pageSizeOptions]=\"defaultPageSizeOptions\"\n class=\"mat-paginator-footer\"\n showFirstLastButtons>\n </mat-paginator>\n\n <app-form-buttons-bar *ngIf=\"canEdit && !mobile\"\n (onCancel)=\"load()\"\n (onSave)=\"save()\"\n [disabled]=\"(loadingSubject|async) || !dirty\">\n <!-- error -->\n <ion-item *ngIf=\"error$|async\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n </app-form-buttons-bar>\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\"\n *ngIf=\"canEdit && mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addRow($event)\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n", styles: [".table-container .mat-table .mat-column-select{min-width:30px}.table-container .mat-table .mat-column-id{min-width:30px;max-width:30px}.table-container .mat-table .mat-column-label,.table-container .mat-table .mat-column-name,.table-container .mat-table .mat-column-levelId,.table-container .mat-table .mat-column-statusId{min-width:150px}.table-container .mat-table .mat-column-comments{min-width:100px;max-width:100px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i4.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i4.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i4.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i4.IonFab, selector: "ion-fab", inputs: ["activated", "edge", "horizontal", "vertical"] }, { kind: "component", type: i4.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i4.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i4.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i4.IonInfiniteScroll, selector: "ion-infinite-scroll", inputs: ["disabled", "position", "threshold"] }, { kind: "component", type: i4.IonInfiniteScrollContent, selector: "ion-infinite-scroll-content", inputs: ["loadingSpinner", "loadingText"] }, { kind: "component", type: i4.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i4.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i4.IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: i4.IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "component", type: i4.IonRow, selector: "ion-row" }, { kind: "component", type: i4.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i4.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i5.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i7.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i7.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i8.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "directive", type: i9.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatPrefix, selector: "[matPrefix]" }, { kind: "directive", type: i9.MatSuffix, selector: "[matSuffix]" }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i11.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i12.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "directive", type: i12.MatExpansionPanelActionRow, selector: "mat-action-row" }, { kind: "component", type: i13.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i14.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i15.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "directive", type: i15.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i16.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i17.MatBadge, selector: "[matBadge]", inputs: ["matBadgeDisabled", "matBadgeColor", "matBadgeOverlap", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "directive", type: i18.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i19.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i20.MatAutocompleteField, selector: "mat-autocomplete-field", inputs: ["equals", "logPrefix", "formControl", "formControlName", "floatLabel", "appearance", "placeholder", "suggestFn", "required", "mobile", "clearable", "debounceTime", "displayWith", "displayAttributes", "displayColumnSizes", "displayColumnNames", "highlightAccent", "showAllOnFocus", "showPanelOnFocus", "autofocus", "config", "i18nPrefix", "noResultMessage", "class", "panelWidth", "matAutocompletePosition", "multiple", "itemSize", "fetchMoreThreshold", "suggestLengthThreshold", "showLoadingSpinner", "debug", "showSearchBar", "stickySearchBar", "filter", "readonly", "tabindex", "items"], outputs: ["click", "blur", "focus", "dropButtonClick", "keydown.escape", "keyup.enter"] }, { kind: "directive", type: i21.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i22.ToolbarComponent, selector: "app-toolbar", inputs: ["title", "color", "class", "backHref", "defaultBackHref", "hasValidate", "hasClose", "hasSearch", "canGoBack", "canShowMenu"], outputs: ["onValidate", "onClose", "onValidateAndClose", "onBackClick", "onSearch"] }, { kind: "component", type: i23.ActionsColumnComponent, selector: "app-actions-column", inputs: ["stickyEnd", "canCancel", "canDelete", "canBackward", "canForward", "canConfirmAndAdd", "dirtyIcon", "optionsTitle", "class", "cellTemplate"], outputs: ["optionsClick", "cancelOrDeleteClick", "confirmAndAddClick", "backward", "forward"] }, { kind: "component", type: i24.FormButtonsBarComponent, selector: "app-form-buttons-bar", inputs: ["disabled", "disabledCancel", "classList"], outputs: ["onCancel", "onSave", "onNext", "onBack"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "pipe", type: i25.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i26.NumberFormatPipe, name: "numberFormat" }, { kind: "pipe", type: i27.ArrayLengthPipe, name: "isArrayLength" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
242
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.
|
|
241
|
+
], viewQueries: [{ propertyName: "filterExpansionPanel", first: true, predicate: MatExpansionPanel, descendants: true, static: true }, { propertyName: "infiniteScroll", first: true, predicate: IonInfiniteScroll, descendants: true }], usesInheritance: true, ngImport: i0, template: "<app-toolbar color=\"primary\" [canGoBack]=\"true\"\n [hasValidate]=\"!(loadingSubject|async) && dirty\"\n (onValidate)=\"save()\"\n [backHref]=\"'/testing'\">\n <ion-buttons slot=\"end\">\n\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n <!-- Add -->\n <button mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"'COMMON.BTN_ADD'|translate\"\n (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\"\n *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold;\">close</mat-icon>\n </button>\n\n <!-- show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon *ngIf=\"filterCriteriaCount; else emptyFilter\"\n [matBadge]=\"filterCriteriaCount\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\">filter_list_alt\n </mat-icon>\n <ng-template #emptyFilter>\n <mat-icon>filter_list_alt</mat-icon>\n </ng-template>\n </button>\n\n <!-- save -->\n <button mat-icon-button *ngIf=\"mobile\"\n [disabled]=\"!(dirtySubject|async)\"\n (click)=\"save()\">\n <mat-icon>save</mat-icon>\n </button>\n\n <!-- start/stop timer to auto-load data -->\n <ion-button *ngIf=\"!timer\" (click)=\"startTimer()\">Start reload</ion-button>\n <ion-button *ngIf=\"timer\" (click)=\"stopTimer()\" color=\"accent\">Stop reload</ion-button>\n </ng-container>\n\n <!-- if row selection -->\n <ng-template #hasSelection>\n\n <!-- delete -->\n <button mat-icon-button\n *ngIf=\"canEdit\" [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n\n <!-- duplicate -->\n <button mat-icon-button\n *ngIf=\"canEdit && selection.selected | isArrayLength: {equals: 1}\"\n [title]=\"'COMMON.BTN_DUPLICATE'|translate\"\n (click)=\"duplicateRow($event, selection.selected[0])\">\n <mat-icon>file_copy</mat-icon>\n </button>\n </ng-template>\n </ion-buttons>\n</app-toolbar>\n<ion-content class=\"ion-no-padding\">\n\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- error -->\n <ion-item *ngIf=\"mobile && error\" lines=\"none\" @slideUpDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <!-- search -->\n <mat-expansion-panel #filterExpansionPanel class=\"filter-panel filter-panel-floating\">\n <form class=\"form-container ion-padding-top\" [formGroup]=\"filterForm\" (ngSubmit)=\"applyFilterAndClosePanel($event)\">\n\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search text -->\n <mat-form-field>\n <ion-icon matPrefix name=\"search\"></ion-icon>\n <input matInput\n formControlName=\"searchText\"\n autocomplete=\"off\"\n [placeholder]=\"'TABLE.TESTING.SEARCH_TEXT'|translate\">\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label [hidden]=\"(loadingSubject|async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\">\n {{ (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT') | translate: {\n count: (totalRowCount |\n numberFormat)\n } }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\"\n (click)=\"filterExpansionPanel.close()\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\">\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n </mat-action-row>\n </mat-expansion-panel>\n\n <!-- table -->\n <div [class.table-container]=\"!enableInfiniteScroll\">\n <table #table mat-table matSort matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\">\n\n <!-- group header cells -->\n\n <ng-container matColumnDef=\"top-start\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\" [attr.colspan]=\"2\">\n <!-- start spacer -->\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"group-1\">\n <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"3\" style=\"background-color: whitesmoke; margin-bottom: -1px;\">\n <ion-label translate>{{i18nColumnPrefix + 'GROUP_1'}}</ion-label>\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"group-2\">\n <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"3\">\n <ion-label translate>{{i18nColumnPrefix + 'GROUP_2'}}</ion-label>\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"top-end\" >\n <th mat-header-cell *matHeaderCellDef>\n <!-- end spacer -->\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\" [class.mat-column-sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\" [class.mat-column-sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">{{ row.currentData?.id }}</td>\n </ng-container>\n\n <!-- Label column -->\n <ng-container matColumnDef=\"label\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.LABEL</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn='label'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput\n [formControl]=\"row.validator.controls['label']\"\n [placeholder]=\"'TABLE.TESTING.LABEL'|translate\"\n [appAutofocus]=\"row.editing && focusColumn === 'label'\"\n [readonly]=\"!row.editing\">\n <mat-error *ngIf=\"row.validator.controls['label'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Name column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.NAME</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\"\n (click)=\"focusColumn='name'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput\n [formControl]=\"row.validator?.controls.name\" [placeholder]=\"'TABLE.TESTING.NAME'|translate\"\n [appAutofocus]=\"row.editing && focusColumn === 'name'\"\n [readonly]=\"!row.editing\">\n <mat-error *ngIf=\"row.validator?.controls.name.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Level column -->\n <ng-container matColumnDef=\"levelId\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.LEVEL_ID</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\">\n <mat-autocomplete-field floatLabel=\"never\"\n [formControl]=\"row.validator.controls.levelId\"\n [config]=\"autocompleteFields.level\"\n [readonly]=\"!row.editing\"\n [required]=\"true\">\n </mat-autocomplete-field>\n </td>\n </ng-container>\n\n <!-- Status column -->\n <ng-container matColumnDef=\"statusId\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.STATUS</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\">\n <mat-form-field floatLabel=\"never\">\n <ion-icon matPrefix *ngIf=\"row.validator.controls['statusId'].value >=0\" [name]=\"statusById[row.validator.controls['statusId'].value]?.icon\"></ion-icon>\n\n <mat-select [formControl]=\"row.validator.controls['statusId']\" [placeholder]=\"i18nColumnPrefix + 'STATUS_ID'|translate\">\n <mat-select-trigger>\n <span *ngIf=\"row.validator.controls['statusId'].value >=0\">\n {{ statusById[row.validator.controls['statusId'].value]?.label | translate}}</span>\n </mat-select-trigger>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['statusId'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n\n <!-- Creation date column -->\n <ng-container matColumnDef=\"updateDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.UPDATE_DATE</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-form-field-disabled\">\n <ion-text class=\"ion-text-end\" color=\"medium\" *ngIf=\"row.id!==-1\">\n <small [matTooltip]=\"'TABLE.TESTING.CREATION_DATE'|translate\" *ngIf=\"row.currentData.creationDate; let creationDate\">\n <ion-icon name=\"calendar\"></ion-icon>\n {{ creationDate | dateFormat: {time: true} }}\n </small><br/>\n <small [matTooltip]=\"'TABLE.TESTING.UPDATE_DATE'|translate\" *ngIf=\"row.currentData.updateDate; let updateDate\">\n <ion-icon name=\"time-outline\"></ion-icon>\n {{ updateDate | dateFormat: {time: true} }}\n </small>\n </ion-text>\n </td>\n </ng-container>\n\n <!-- Comment column -->\n <ng-container matColumnDef=\"comments\">\n <th mat-header-cell *matHeaderCellDef>\n <ion-label translate>TABLE.TESTING.COMMENTS</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-form-field floatLabel=\"never\" *ngIf=\"row.editing; else iconComment\">\n <!--<textarea matInput [formControl]=\"row.validator?.controls.comments\"\n [placeholder]=\"'TABLE.TESTING.COMMENTS'|translate\"\n [readonly]=\"!row.editing\"></textarea>-->\n\n <input type=\"text\" matInput [formControl]=\"row.validator?.controls.comments\"\n [placeholder]=\"'TABLE.TESTING.COMMENTS'|translate\"\n [readonly]=\"!row.editing\">\n </mat-form-field>\n\n <ng-template #iconComment>\n <mat-icon class=\"comment\"\n *ngIf=\"row.validator?.controls.comments.value\"\n [title]=\"row.validator?.controls.comments.value\"></mat-icon>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column [stickyEnd]=\"true\" [canCancel]=\"false\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [cellTemplate]=\"cellInjection\">\n\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <span *ngIf=\"row.editing && !row.validator.dirty\">-</span>\n </ng-template>\n\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"groupColumns;\" class=\"mat-toolbar\"></tr>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-disabled]=\"!row.editing\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n\n <ion-infinite-scroll *ngIf=\"enableInfiniteScroll\"\n [threshold]=\"mobile ? '10%' : '2%'\" position=\"bottom\"\n (ionInfinite)=\"fetchMore($event)\">\n <ion-infinite-scroll-content\n loadingSpinner=\"circles\"\n [loadingText]=\"'COMMON.LOADING_DOTS'|translate\">\n </ion-infinite-scroll-content>\n </ion-infinite-scroll>\n </div>\n</ion-content>\n\n<ion-footer>\n <!-- Paginator -->\n <mat-paginator *ngIf=\"!enableInfiniteScroll\"\n [length]=\"totalRowCount\" [pageSize]=\"defaultPageSize\" [pageSizeOptions]=\"defaultPageSizeOptions\"\n class=\"mat-paginator-footer\"\n showFirstLastButtons>\n </mat-paginator>\n\n <app-form-buttons-bar *ngIf=\"canEdit && !mobile\"\n (onCancel)=\"load()\"\n (onSave)=\"save()\"\n [disabled]=\"(loadingSubject|async) || !dirty\">\n <!-- error -->\n <ion-item *ngIf=\"error$|async\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n </app-form-buttons-bar>\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\"\n *ngIf=\"canEdit && mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addRow($event)\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n", styles: [".table-container .mat-table .mat-column-select{min-width:30px}.table-container .mat-table .mat-column-id{min-width:30px;max-width:30px}.table-container .mat-table .mat-column-label,.table-container .mat-table .mat-column-name,.table-container .mat-table .mat-column-levelId,.table-container .mat-table .mat-column-statusId{min-width:150px}.table-container .mat-table .mat-column-comments{min-width:100px;max-width:100px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i4.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i4.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i4.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i4.IonFab, selector: "ion-fab", inputs: ["activated", "edge", "horizontal", "vertical"] }, { kind: "component", type: i4.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i4.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i4.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i4.IonInfiniteScroll, selector: "ion-infinite-scroll", inputs: ["disabled", "position", "threshold"] }, { kind: "component", type: i4.IonInfiniteScrollContent, selector: "ion-infinite-scroll-content", inputs: ["loadingSpinner", "loadingText"] }, { kind: "component", type: i4.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i4.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i4.IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: i4.IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "component", type: i4.IonRow, selector: "ion-row" }, { kind: "component", type: i4.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i4.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i5.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i7.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i7.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i8.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "directive", type: i9.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatPrefix, selector: "[matPrefix]" }, { kind: "directive", type: i9.MatSuffix, selector: "[matSuffix]" }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i11.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i12.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "directive", type: i12.MatExpansionPanelActionRow, selector: "mat-action-row" }, { kind: "component", type: i13.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i14.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i15.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "directive", type: i15.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i16.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i17.MatBadge, selector: "[matBadge]", inputs: ["matBadgeDisabled", "matBadgeColor", "matBadgeOverlap", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "directive", type: i18.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i19.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i20.MatAutocompleteField, selector: "mat-autocomplete-field", inputs: ["equals", "logPrefix", "formControl", "formControlName", "floatLabel", "appearance", "placeholder", "suggestFn", "required", "mobile", "clearable", "debounceTime", "displayWith", "displayAttributes", "displayColumnSizes", "displayColumnNames", "highlightAccent", "showAllOnFocus", "showPanelOnFocus", "autofocus", "config", "i18nPrefix", "noResultMessage", "class", "panelWidth", "matAutocompletePosition", "multiple", "itemSize", "fetchMoreThreshold", "suggestLengthThreshold", "showLoadingSpinner", "debug", "showSearchBar", "stickySearchBar", "filter", "readonly", "tabindex", "items"], outputs: ["click", "blur", "focus", "dropButtonClick", "keydown.escape", "keyup.enter"] }, { kind: "directive", type: i21.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i22.ToolbarComponent, selector: "app-toolbar", inputs: ["title", "color", "class", "backHref", "defaultBackHref", "hasValidate", "hasClose", "hasSearch", "canGoBack", "canShowMenu"], outputs: ["onValidate", "onClose", "onValidateAndClose", "onBackClick", "onSearch"] }, { kind: "component", type: i23.FormButtonsBarComponent, selector: "app-form-buttons-bar", inputs: ["disabled", "disabledCancel", "classList"], outputs: ["onCancel", "onSave", "onNext", "onBack"] }, { kind: "component", type: i24.ActionsColumnComponent, selector: "app-actions-column", inputs: ["stickyEnd", "canCancel", "canDelete", "canBackward", "canForward", "canConfirmAndAdd", "dirtyIcon", "optionsTitle", "class", "cellTemplate"], outputs: ["optionsClick", "cancelOrDeleteClick", "confirmAndAddClick", "backward", "forward"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "pipe", type: i25.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i26.NumberFormatPipe, name: "numberFormat" }, { kind: "pipe", type: i27.ArrayLengthPipe, name: "isArrayLength" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
242
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: TableTestPage, decorators: [{
|
|
243
243
|
type: Component,
|
|
244
244
|
args: [{ selector: 'app-table-testing', providers: [
|
|
245
245
|
{
|
|
@@ -249,7 +249,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
|
|
|
249
249
|
{
|
|
250
250
|
provide: AppTable, useExisting: forwardRef(() => TableTestPage),
|
|
251
251
|
}
|
|
252
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<app-toolbar color=\"primary\" [canGoBack]=\"true\"\n [hasValidate]=\"!(loadingSubject|async) && dirty\"\n (onValidate)=\"save()\"\n [backHref]=\"'/testing'\">\n <ion-buttons slot=\"end\">\n\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n <!-- Add -->\n <button mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"'COMMON.BTN_ADD'|translate\"\n (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\"\n *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold;\">close</mat-icon>\n </button>\n\n <!-- show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon *ngIf=\"filterCriteriaCount; else emptyFilter\"\n [matBadge]=\"filterCriteriaCount\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\">filter_list_alt\n </mat-icon>\n <ng-template #emptyFilter>\n <mat-icon>filter_list_alt</mat-icon>\n </ng-template>\n </button>\n\n <!-- show filter -->\n <button mat-icon-button *ngIf=\"mobile\"\n [disabled]=\"!(dirtySubject|async)\"\n (click)=\"save()\">\n <mat-icon>save</mat-icon>\n </button>\n\n <!-- start/stop timer to auto-load data -->\n <ion-button *ngIf=\"!timer\" (click)=\"startTimer()\">Start reload</ion-button>\n <ion-button *ngIf=\"timer\" (click)=\"stopTimer()\" color=\"accent\">Stop reload</ion-button>\n </ng-container>\n\n <!-- if row selection -->\n <ng-template #hasSelection>\n\n <!-- delete -->\n <button mat-icon-button\n *ngIf=\"canEdit\" [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n\n <!-- duplicate -->\n <button mat-icon-button\n *ngIf=\"canEdit && selection.selected | isArrayLength: {equals: 1}\"\n [title]=\"'COMMON.BTN_DUPLICATE'|translate\"\n (click)=\"duplicateRow($event, selection.selected[0])\">\n <mat-icon>file_copy</mat-icon>\n </button>\n </ng-template>\n </ion-buttons>\n</app-toolbar>\n<ion-content class=\"ion-no-padding\">\n\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- error -->\n <ion-item *ngIf=\"mobile && error\" lines=\"none\" @slideUpDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <!-- search -->\n <mat-expansion-panel #filterExpansionPanel class=\"filter-panel filter-panel-floating\">\n <form class=\"form-container ion-padding-top\" [formGroup]=\"filterForm\" (ngSubmit)=\"applyFilterAndClosePanel($event)\">\n\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search text -->\n <mat-form-field>\n <ion-icon matPrefix name=\"search\"></ion-icon>\n <input matInput\n formControlName=\"searchText\"\n autocomplete=\"off\"\n [placeholder]=\"'TABLE.TESTING.SEARCH_TEXT'|translate\">\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label [hidden]=\"(loadingSubject|async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\">\n {{ (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT') | translate: {\n count: (totalRowCount |\n numberFormat)\n } }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\"\n (click)=\"filterExpansionPanel.close()\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\">\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n </mat-action-row>\n </mat-expansion-panel>\n\n <!-- table -->\n <div [class.table-container]=\"!enableInfiniteScroll\">\n <table #table mat-table matSort matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\">\n\n <!-- group header cells -->\n\n <ng-container matColumnDef=\"top-start\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\" [attr.colspan]=\"2\">\n <!-- start spacer -->\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"group-1\">\n <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"3\" style=\"background-color: whitesmoke; margin-bottom: -1px;\">\n <ion-label translate>{{i18nColumnPrefix + 'GROUP_1'}}</ion-label>\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"group-2\">\n <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"3\">\n <ion-label translate>{{i18nColumnPrefix + 'GROUP_2'}}</ion-label>\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"top-end\" >\n <th mat-header-cell *matHeaderCellDef>\n <!-- end spacer -->\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\" [class.mat-column-sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\" [class.mat-column-sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">{{ row.currentData?.id }}</td>\n </ng-container>\n\n <!-- Label column -->\n <ng-container matColumnDef=\"label\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.LABEL</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn='label'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput\n [formControl]=\"row.validator.controls['label']\"\n [placeholder]=\"'TABLE.TESTING.LABEL'|translate\"\n [appAutofocus]=\"row.editing && focusColumn === 'label'\"\n [readonly]=\"!row.editing\">\n <mat-error *ngIf=\"row.validator.controls['label'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Name column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.NAME</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\"\n (click)=\"focusColumn='name'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput\n [formControl]=\"row.validator?.controls.name\" [placeholder]=\"'TABLE.TESTING.NAME'|translate\"\n [appAutofocus]=\"row.editing && focusColumn === 'name'\"\n [readonly]=\"!row.editing\">\n <mat-error *ngIf=\"row.validator?.controls.name.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Level column -->\n <ng-container matColumnDef=\"levelId\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.LEVEL_ID</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\">\n <mat-autocomplete-field floatLabel=\"never\"\n [formControl]=\"row.validator.controls.levelId\"\n [config]=\"autocompleteFields.level\"\n [readonly]=\"!row.editing\"\n [required]=\"true\">\n </mat-autocomplete-field>\n </td>\n </ng-container>\n\n <!-- Status column -->\n <ng-container matColumnDef=\"statusId\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.STATUS</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\">\n <mat-form-field floatLabel=\"never\">\n <ion-icon matPrefix *ngIf=\"row.validator.controls['statusId'].value >=0\" [name]=\"statusById[row.validator.controls['statusId'].value]?.icon\"></ion-icon>\n\n <mat-select [formControl]=\"row.validator.controls['statusId']\" [placeholder]=\"i18nColumnPrefix + 'STATUS_ID'|translate\">\n <mat-select-trigger>\n <span *ngIf=\"row.validator.controls['statusId'].value >=0\">\n {{ statusById[row.validator.controls['statusId'].value]?.label | translate}}</span>\n </mat-select-trigger>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['statusId'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n\n <!-- Creation date column -->\n <ng-container matColumnDef=\"updateDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.UPDATE_DATE</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-form-field-disabled\">\n <ion-text class=\"ion-text-end\" color=\"medium\" *ngIf=\"row.id!==-1\">\n <small [matTooltip]=\"'TABLE.TESTING.CREATION_DATE'|translate\" *ngIf=\"row.currentData.creationDate; let creationDate\">\n <ion-icon name=\"calendar\"></ion-icon>\n {{ creationDate | dateFormat: {time: true} }}\n </small><br/>\n <small [matTooltip]=\"'TABLE.TESTING.UPDATE_DATE'|translate\" *ngIf=\"row.currentData.updateDate; let updateDate\">\n <ion-icon name=\"time-outline\"></ion-icon>\n {{ updateDate | dateFormat: {time: true} }}\n </small>\n </ion-text>\n </td>\n </ng-container>\n\n <!-- Comment column -->\n <ng-container matColumnDef=\"comments\">\n <th mat-header-cell *matHeaderCellDef>\n <ion-label translate>TABLE.TESTING.COMMENTS</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-form-field floatLabel=\"never\" *ngIf=\"row.editing; else iconComment\">\n <!--<textarea matInput [formControl]=\"row.validator?.controls.comments\"\n [placeholder]=\"'TABLE.TESTING.COMMENTS'|translate\"\n [readonly]=\"!row.editing\"></textarea>-->\n\n <input type=\"text\" matInput [formControl]=\"row.validator?.controls.comments\"\n [placeholder]=\"'TABLE.TESTING.COMMENTS'|translate\"\n [readonly]=\"!row.editing\">\n </mat-form-field>\n\n <ng-template #iconComment>\n <mat-icon class=\"comment\"\n *ngIf=\"row.validator?.controls.comments.value\"\n [title]=\"row.validator?.controls.comments.value\"></mat-icon>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column [stickyEnd]=\"true\" [canCancel]=\"false\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [cellTemplate]=\"cellInjection\">\n\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <span *ngIf=\"row.editing && !row.validator.dirty\">-</span>\n </ng-template>\n\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"groupColumns;\" class=\"mat-toolbar\"></tr>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-disabled]=\"!row.editing\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n\n <ion-infinite-scroll *ngIf=\"enableInfiniteScroll\"\n [threshold]=\"mobile ? '10%' : '2%'\" position=\"bottom\"\n (ionInfinite)=\"fetchMore($event)\">\n <ion-infinite-scroll-content\n loadingSpinner=\"circles\"\n [loadingText]=\"'COMMON.LOADING_DOTS'|translate\">\n </ion-infinite-scroll-content>\n </ion-infinite-scroll>\n </div>\n</ion-content>\n\n<ion-footer>\n <!-- Paginator -->\n <mat-paginator *ngIf=\"!enableInfiniteScroll\"\n [length]=\"totalRowCount\" [pageSize]=\"defaultPageSize\" [pageSizeOptions]=\"defaultPageSizeOptions\"\n class=\"mat-paginator-footer\"\n showFirstLastButtons>\n </mat-paginator>\n\n <app-form-buttons-bar *ngIf=\"canEdit && !mobile\"\n (onCancel)=\"load()\"\n (onSave)=\"save()\"\n [disabled]=\"(loadingSubject|async) || !dirty\">\n <!-- error -->\n <ion-item *ngIf=\"error$|async\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n </app-form-buttons-bar>\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\"\n *ngIf=\"canEdit && mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addRow($event)\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n", styles: [".table-container .mat-table .mat-column-select{min-width:30px}.table-container .mat-table .mat-column-id{min-width:30px;max-width:30px}.table-container .mat-table .mat-column-label,.table-container .mat-table .mat-column-name,.table-container .mat-table .mat-column-levelId,.table-container .mat-table .mat-column-statusId{min-width:150px}.table-container .mat-table .mat-column-comments{min-width:100px;max-width:100px}\n"] }]
|
|
252
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<app-toolbar color=\"primary\" [canGoBack]=\"true\"\n [hasValidate]=\"!(loadingSubject|async) && dirty\"\n (onValidate)=\"save()\"\n [backHref]=\"'/testing'\">\n <ion-buttons slot=\"end\">\n\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n <!-- Add -->\n <button mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"'COMMON.BTN_ADD'|translate\"\n (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\"\n *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold;\">close</mat-icon>\n </button>\n\n <!-- show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon *ngIf=\"filterCriteriaCount; else emptyFilter\"\n [matBadge]=\"filterCriteriaCount\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\">filter_list_alt\n </mat-icon>\n <ng-template #emptyFilter>\n <mat-icon>filter_list_alt</mat-icon>\n </ng-template>\n </button>\n\n <!-- save -->\n <button mat-icon-button *ngIf=\"mobile\"\n [disabled]=\"!(dirtySubject|async)\"\n (click)=\"save()\">\n <mat-icon>save</mat-icon>\n </button>\n\n <!-- start/stop timer to auto-load data -->\n <ion-button *ngIf=\"!timer\" (click)=\"startTimer()\">Start reload</ion-button>\n <ion-button *ngIf=\"timer\" (click)=\"stopTimer()\" color=\"accent\">Stop reload</ion-button>\n </ng-container>\n\n <!-- if row selection -->\n <ng-template #hasSelection>\n\n <!-- delete -->\n <button mat-icon-button\n *ngIf=\"canEdit\" [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n\n <!-- duplicate -->\n <button mat-icon-button\n *ngIf=\"canEdit && selection.selected | isArrayLength: {equals: 1}\"\n [title]=\"'COMMON.BTN_DUPLICATE'|translate\"\n (click)=\"duplicateRow($event, selection.selected[0])\">\n <mat-icon>file_copy</mat-icon>\n </button>\n </ng-template>\n </ion-buttons>\n</app-toolbar>\n<ion-content class=\"ion-no-padding\">\n\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- error -->\n <ion-item *ngIf=\"mobile && error\" lines=\"none\" @slideUpDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <!-- search -->\n <mat-expansion-panel #filterExpansionPanel class=\"filter-panel filter-panel-floating\">\n <form class=\"form-container ion-padding-top\" [formGroup]=\"filterForm\" (ngSubmit)=\"applyFilterAndClosePanel($event)\">\n\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search text -->\n <mat-form-field>\n <ion-icon matPrefix name=\"search\"></ion-icon>\n <input matInput\n formControlName=\"searchText\"\n autocomplete=\"off\"\n [placeholder]=\"'TABLE.TESTING.SEARCH_TEXT'|translate\">\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label [hidden]=\"(loadingSubject|async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\">\n {{ (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT') | translate: {\n count: (totalRowCount |\n numberFormat)\n } }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\"\n (click)=\"filterExpansionPanel.close()\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\">\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n </mat-action-row>\n </mat-expansion-panel>\n\n <!-- table -->\n <div [class.table-container]=\"!enableInfiniteScroll\">\n <table #table mat-table matSort matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\">\n\n <!-- group header cells -->\n\n <ng-container matColumnDef=\"top-start\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\" [attr.colspan]=\"2\">\n <!-- start spacer -->\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"group-1\">\n <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"3\" style=\"background-color: whitesmoke; margin-bottom: -1px;\">\n <ion-label translate>{{i18nColumnPrefix + 'GROUP_1'}}</ion-label>\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"group-2\">\n <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"3\">\n <ion-label translate>{{i18nColumnPrefix + 'GROUP_2'}}</ion-label>\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"top-end\" >\n <th mat-header-cell *matHeaderCellDef>\n <!-- end spacer -->\n </th>\n </ng-container>\n\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\" [class.mat-column-sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\" [class.mat-column-sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">{{ row.currentData?.id }}</td>\n </ng-container>\n\n <!-- Label column -->\n <ng-container matColumnDef=\"label\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.LABEL</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn='label'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput\n [formControl]=\"row.validator.controls['label']\"\n [placeholder]=\"'TABLE.TESTING.LABEL'|translate\"\n [appAutofocus]=\"row.editing && focusColumn === 'label'\"\n [readonly]=\"!row.editing\">\n <mat-error *ngIf=\"row.validator.controls['label'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Name column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.NAME</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\"\n (click)=\"focusColumn='name'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput\n [formControl]=\"row.validator?.controls.name\" [placeholder]=\"'TABLE.TESTING.NAME'|translate\"\n [appAutofocus]=\"row.editing && focusColumn === 'name'\"\n [readonly]=\"!row.editing\">\n <mat-error *ngIf=\"row.validator?.controls.name.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Level column -->\n <ng-container matColumnDef=\"levelId\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.LEVEL_ID</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\">\n <mat-autocomplete-field floatLabel=\"never\"\n [formControl]=\"row.validator.controls.levelId\"\n [config]=\"autocompleteFields.level\"\n [readonly]=\"!row.editing\"\n [required]=\"true\">\n </mat-autocomplete-field>\n </td>\n </ng-container>\n\n <!-- Status column -->\n <ng-container matColumnDef=\"statusId\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.STATUS</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\">\n <mat-form-field floatLabel=\"never\">\n <ion-icon matPrefix *ngIf=\"row.validator.controls['statusId'].value >=0\" [name]=\"statusById[row.validator.controls['statusId'].value]?.icon\"></ion-icon>\n\n <mat-select [formControl]=\"row.validator.controls['statusId']\" [placeholder]=\"i18nColumnPrefix + 'STATUS_ID'|translate\">\n <mat-select-trigger>\n <span *ngIf=\"row.validator.controls['statusId'].value >=0\">\n {{ statusById[row.validator.controls['statusId'].value]?.label | translate}}</span>\n </mat-select-trigger>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['statusId'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n\n <!-- Creation date column -->\n <ng-container matColumnDef=\"updateDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>TABLE.TESTING.UPDATE_DATE</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-form-field-disabled\">\n <ion-text class=\"ion-text-end\" color=\"medium\" *ngIf=\"row.id!==-1\">\n <small [matTooltip]=\"'TABLE.TESTING.CREATION_DATE'|translate\" *ngIf=\"row.currentData.creationDate; let creationDate\">\n <ion-icon name=\"calendar\"></ion-icon>\n {{ creationDate | dateFormat: {time: true} }}\n </small><br/>\n <small [matTooltip]=\"'TABLE.TESTING.UPDATE_DATE'|translate\" *ngIf=\"row.currentData.updateDate; let updateDate\">\n <ion-icon name=\"time-outline\"></ion-icon>\n {{ updateDate | dateFormat: {time: true} }}\n </small>\n </ion-text>\n </td>\n </ng-container>\n\n <!-- Comment column -->\n <ng-container matColumnDef=\"comments\">\n <th mat-header-cell *matHeaderCellDef>\n <ion-label translate>TABLE.TESTING.COMMENTS</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-form-field floatLabel=\"never\" *ngIf=\"row.editing; else iconComment\">\n <!--<textarea matInput [formControl]=\"row.validator?.controls.comments\"\n [placeholder]=\"'TABLE.TESTING.COMMENTS'|translate\"\n [readonly]=\"!row.editing\"></textarea>-->\n\n <input type=\"text\" matInput [formControl]=\"row.validator?.controls.comments\"\n [placeholder]=\"'TABLE.TESTING.COMMENTS'|translate\"\n [readonly]=\"!row.editing\">\n </mat-form-field>\n\n <ng-template #iconComment>\n <mat-icon class=\"comment\"\n *ngIf=\"row.validator?.controls.comments.value\"\n [title]=\"row.validator?.controls.comments.value\"></mat-icon>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column [stickyEnd]=\"true\" [canCancel]=\"false\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [cellTemplate]=\"cellInjection\">\n\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <span *ngIf=\"row.editing && !row.validator.dirty\">-</span>\n </ng-template>\n\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"groupColumns;\" class=\"mat-toolbar\"></tr>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-disabled]=\"!row.editing\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n\n <ion-infinite-scroll *ngIf=\"enableInfiniteScroll\"\n [threshold]=\"mobile ? '10%' : '2%'\" position=\"bottom\"\n (ionInfinite)=\"fetchMore($event)\">\n <ion-infinite-scroll-content\n loadingSpinner=\"circles\"\n [loadingText]=\"'COMMON.LOADING_DOTS'|translate\">\n </ion-infinite-scroll-content>\n </ion-infinite-scroll>\n </div>\n</ion-content>\n\n<ion-footer>\n <!-- Paginator -->\n <mat-paginator *ngIf=\"!enableInfiniteScroll\"\n [length]=\"totalRowCount\" [pageSize]=\"defaultPageSize\" [pageSizeOptions]=\"defaultPageSizeOptions\"\n class=\"mat-paginator-footer\"\n showFirstLastButtons>\n </mat-paginator>\n\n <app-form-buttons-bar *ngIf=\"canEdit && !mobile\"\n (onCancel)=\"load()\"\n (onSave)=\"save()\"\n [disabled]=\"(loadingSubject|async) || !dirty\">\n <!-- error -->\n <ion-item *ngIf=\"error$|async\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n </app-form-buttons-bar>\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\"\n *ngIf=\"canEdit && mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addRow($event)\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n", styles: [".table-container .mat-table .mat-column-select{min-width:30px}.table-container .mat-table .mat-column-id{min-width:30px;max-width:30px}.table-container .mat-table .mat-column-label,.table-container .mat-table .mat-column-name,.table-container .mat-table .mat-column-levelId,.table-container .mat-table .mat-column-statusId{min-width:150px}.table-container .mat-table .mat-column-comments{min-width:100px;max-width:100px}\n"] }]
|
|
253
253
|
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.AppValidatorService }, { type: i2.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { enableInfiniteScroll: [{
|
|
254
254
|
type: Input
|
|
255
255
|
}], useSticky: [{
|
|
@@ -261,4 +261,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
|
|
|
261
261
|
type: ViewChild,
|
|
262
262
|
args: [IonInfiniteScroll]
|
|
263
263
|
}] } });
|
|
264
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUudGVzdGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS90YWJsZS90ZXN0aW5nL3RhYmxlLnRlc3RpbmcudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvdGFibGUvdGVzdGluZy90YWJsZS50ZXN0aW5nLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFxQixTQUFTLEVBQUUsVUFBVSxFQUFZLEtBQUssRUFBcUIsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQy9JLE9BQU8sRUFBQyxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsc0JBQXNCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RyxPQUFPLEVBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQUMzRixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUMzRSxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxzREFBc0QsQ0FBQztBQUM3RixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUVsRixPQUFPLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBQ2xGLE9BQU8sRUFBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBQywy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RUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pCLENBQUM7O0FBL09NLHlCQUFXLEdBQUcsR0FBRyxDQUFDOzBHQUhkLGFBQWE7OEZBQWIsYUFBYSw4SEFYYjtRQUNUO1lBQ0UsT0FBTyxFQUFFLG1CQUFtQjtZQUM1QixRQUFRLEVBQUUsMkJBQTJCO1NBQ3RDO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO1NBQ2hFO0tBQ0YsZ0ZBeUJVLGlCQUFpQiwrRkFDakIsaUJBQWlCLHVFQ3ZEOUIscWxoQkFnWUE7MkZEaFdhLGFBQWE7a0JBZnpCLFNBQVM7K0JBQ0UsbUJBQW1CLGFBR2xCO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxtQkFBbUI7NEJBQzVCLFFBQVEsRUFBRSwyQkFBMkI7eUJBQ3RDO3dCQUNEOzRCQUNFLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDO3lCQUNoRTtxQkFDRixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTTtrTUFpQnRDLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQU13QyxvQkFBb0I7c0JBQWpFLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUNkLGNBQWM7c0JBQTNDLFNBQVM7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5qZWN0b3IsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QXBwVGFibGUsIERFRkFVTFRfUEFHRV9TSVpFLCBSRVNFUlZFRF9FTkRfQ09MVU1OUywgUkVTRVJWRURfU1RBUlRfQ09MVU1OU30gZnJvbSAnLi4vdGFibGUuY2xhc3MnO1xuaW1wb3J0IHtSZWZlcmVudGlhbCwgU3RhdHVzQnlJZCwgU3RhdHVzTGlzdH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbW9kZWwvcmVmZXJlbnRpYWwubW9kZWwnO1xuaW1wb3J0IHtJb25JbmZpbml0ZVNjcm9sbH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHtFbnRpdGllc1RhYmxlRGF0YVNvdXJjZX0gZnJvbSAnLi4vZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZS5jbGFzcyc7XG5pbXBvcnQge0luTWVtb3J5RW50aXRpZXNTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2VydmljZXMvbWVtb3J5LWVudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7QXBwVmFsaWRhdG9yU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdG9yL2Jhc2UudmFsaWRhdG9yLmNsYXNzJztcbmltcG9ydCB7QWJzdHJhY3RDb250cm9sLCBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtR3JvdXB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7aXNOaWwsIGlzTm90TmlsfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7ZnJvbVVuaXhNc1RpbWVzdGFtcH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2RhdGVzJztcbmltcG9ydCB7UmVmZXJlbnRpYWxGaWx0ZXJ9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Rlc3RpbmcvcmVmZXJlbnRpYWwtZmlsdGVyLm1vZGVsJztcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBmaWx0ZXIsIHRhcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtNYXRFeHBhbnNpb25QYW5lbH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZXhwYW5zaW9uJztcbmltcG9ydCB7UmVmZXJlbnRpYWxWYWxpZGF0b3JTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90ZXN0aW5nL3JlZmVyZW50aWFsLnZhbGlkYXRvcic7XG5pbXBvcnQge1N0YXR1c0lkc30gZnJvbSAnLi4vLi4vc2VydmljZXMvbW9kZWwvbW9kZWwuZW51bSc7XG5pbXBvcnQge1N1YnNjcmlwdGlvbiwgdGltZXJ9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdGFibGUtdGVzdGluZycsXG4gIHN0eWxlVXJsczogWyd0YWJsZS50ZXN0aW5nLnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICd0YWJsZS50ZXN0aW5nLmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBBcHBWYWxpZGF0b3JTZXJ2aWNlLFxuICAgICAgdXNlQ2xhc3M6IFJlZmVyZW50aWFsVmFsaWRhdG9yU2VydmljZVxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogQXBwVGFibGUsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRhYmxlVGVzdFBhZ2UpLFxuICAgIH1cbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVUZXN0UGFnZSBleHRlbmRzIEFwcFRhYmxlPFJlZmVyZW50aWFsLCBSZWZlcmVudGlhbEZpbHRlcj5cbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgc3RhdGljIG1heFJvd0NvdW50ID0gMTAwO1xuXG4gIHRpbWVyOiBTdWJzY3JpcHRpb247XG4gIGNhbkVkaXQgPSB0cnVlO1xuICBkYXRhOiBSZWZlcmVudGlhbFtdO1xuICBmaWx0ZXJGb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xuICBmaWx0ZXJDcml0ZXJpYUNvdW50ID0gMDtcbiAgZ3JvdXBDb2x1bW5zID0gWyd0b3Atc3RhcnQnLCAnZ3JvdXAtMScsICdncm91cC0yJywgJ3RvcC1lbmQnXTtcblxuICByZWFkb25seSBzdGF0dXNMaXN0ID0gU3RhdHVzTGlzdDtcbiAgcmVhZG9ubHkgc3RhdHVzQnlJZCA9IFN0YXR1c0J5SWQ7XG5cbiAgQElucHV0KCkgZW5hYmxlSW5maW5pdGVTY3JvbGw6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHVzZVN0aWNreSA9IHRydWU7XG5cbiAgZ2V0IGhhc01vcmVEYXRhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGEubGVuZ3RoIDwgMTAwO1xuICB9XG5cbiAgQFZpZXdDaGlsZChNYXRFeHBhbnNpb25QYW5lbCwge3N0YXRpYzogdHJ1ZX0pIGZpbHRlckV4cGFuc2lvblBhbmVsOiBNYXRFeHBhbnNpb25QYW5lbDtcbiAgQFZpZXdDaGlsZChJb25JbmZpbml0ZVNjcm9sbCkgaW5maW5pdGVTY3JvbGw6IElvbkluZmluaXRlU2Nyb2xsO1xuXG4gIGdldCBkYXRhU2VydmljZSgpOiBJbk1lbW9yeUVudGl0aWVzU2VydmljZTxSZWZlcmVudGlhbD57XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2UuZGF0YVNlcnZpY2UgYXMgSW5NZW1vcnlFbnRpdGllc1NlcnZpY2U8UmVmZXJlbnRpYWw+XG4gIH1cblxuICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCB2YWxpZGF0b3JTZXJ2aWNlOiBBcHBWYWxpZGF0b3JTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxuICAgICAgICAgICAgICApIHtcbiAgICBzdXBlcihpbmplY3RvciwgW1xuICAgICAgLi4uUkVTRVJWRURfU1RBUlRfQ09MVU1OUyxcbiAgICAgICdsYWJlbCcsXG4gICAgICAnbmFtZScsXG4gICAgICAnbGV2ZWxJZCcsXG4gICAgICAnc3RhdHVzSWQnLFxuICAgICAgJ3VwZGF0ZURhdGUnLFxuICAgICAgJ2NvbW1lbnRzJyxcbiAgICAgIC4uLlJFU0VSVkVEX0VORF9DT0xVTU5TXG4gICAgXSxcbiAgICAgIG5ldyBFbnRpdGllc1RhYmxlRGF0YVNvdXJjZShSZWZlcmVudGlhbCwgbmV3IEluTWVtb3J5RW50aXRpZXNTZXJ2aWNlKFJlZmVyZW50aWFsLCBSZWZlcmVudGlhbEZpbHRlciwge1xuICAgICAgICBzb3J0QnlSZXBsYWNlbWVudDoge2lkOiAnaWQnfVxuICAgICAgfSksIHZhbGlkYXRvclNlcnZpY2UsIHtcbiAgICAgICAgc3VwcHJlc3NFcnJvcnM6IGZhbHNlXG4gICAgICB9KSxcbiAgICAgIG51bGwpO1xuXG4gICAgLy8gV29ya3Mgd2l0aCB0cnVlIGFuZCBmYWxzZVxuICAgIHRoaXMuZW5hYmxlSW5maW5pdGVTY3JvbGwgPSB0aGlzLm1vYmlsZTtcblxuICAgIHRoaXMuYXV0b0xvYWQgPSBmYWxzZTtcbiAgICB0aGlzLmlubGluZUVkaXRpb24gPSB0cnVlO1xuICAgIHRoaXMuaTE4bkNvbHVtblByZWZpeCA9ICdUQUJMRS5URVNUSU5HLic7XG5cbiAgICB0aGlzLmNvbmZpcm1CZWZvcmVEZWxldGUgPSB0cnVlO1xuICAgIHRoaXMuY29uZmlybUJlZm9yZUNhbmNlbCA9IGZhbHNlO1xuICAgIHRoaXMudW5kb2FibGVEZWxldGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuc2F2ZUJlZm9yZURlbGV0ZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5zYXZlQmVmb3JlU29ydCA9IHRydWU7XG4gICAgdGhpcy5zYXZlQmVmb3JlRmlsdGVyID0gdHJ1ZTtcbiAgICB0aGlzLnByb3BhZ2F0ZVJvd0Vycm9yID0gdHJ1ZTtcblxuICAgIHRoaXMuZmlsdGVyRm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIHNlYXJjaFRleHQ6IFtudWxsXVxuICAgIH0pO1xuXG4gICAgdGhpcy5vblN0YXJ0RWRpdGluZ1Jvdy5zdWJzY3JpYmUocm93ID0+IHtcbiAgICAgIHJvdy52YWxpZGF0b3IucGF0Y2hWYWx1ZSh7ZW50aXR5TmFtZTogJ1Rlc3RWTyd9LCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIC8vIFVwZGF0ZSBmaWx0ZXIgd2hlbiBjaGFuZ2VzXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMuZmlsdGVyRm9ybS52YWx1ZUNoYW5nZXNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDI1MCksXG4gICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuZmlsdGVyRm9ybS52YWxpZCksXG4gICAgICAgICAgdGFwKHZhbHVlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IFJlZmVyZW50aWFsRmlsdGVyLmZyb21PYmplY3QodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJDcml0ZXJpYUNvdW50ID0gZmlsdGVyLmNvdW50Tm90RW1wdHlDcml0ZXJpYSgpO1xuICAgICAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIC8vIEFwcGx5aW5nIHRoZSBmaWx0ZXJcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsdGVyKGZpbHRlciwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAvLyBTYXZlIGZpbHRlciBpbiBzZXR0aW5ncyAoYWZ0ZXIgYSBkZWJvdW5jZSB0aW1lKVxuICAgICAgICAgIGRlYm91bmNlVGltZSg1MDApLFxuICAgICAgICAgIHRhcChqc29uID0+IHRoaXMuc2V0dGluZ3Muc2F2ZVBhZ2VTZXR0aW5nKHRoaXMuc2V0dGluZ3NJZCwganNvbiwgJ2ZpbHRlcicpKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKVxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyQXV0b2NvbXBsZXRlRmllbGQoJ2xldmVsJywge1xuICAgICAgICBpdGVtczogW1xuICAgICAgICAgIHtpZDogMSwgbGFiZWw6ICdBJywgbmFtZTogJ2l0ZW0gQSd9LFxuICAgICAgICAgIHtpZDogMSwgbGFiZWw6ICdCJywgbmFtZTogJ2l0ZW0gQid9XG4gICAgICAgIF0sXG4gICAgICAgIG1vYmlsZTogdGhpcy5tb2JpbGVcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMub25SZWZyZXNoLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybS5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5maWx0ZXJGb3JtLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICB9KSk7XG5cbiAgICB0aGlzLm1hcmtBc1JlYWR5KCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG5cbiAgICAvLyBSZXN0b3JlIGZpbHRlciBmcm9tIHNldHRpbmdzXG4gICAgdGhpcy5yZXN0b3JlRmlsdGVyKCk7XG5cbiAgICAvLyBMb2FkIGRhdGFcbiAgICB0aGlzLmxvYWQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGNvbnNvbGUuZGVidWcoJ1t0ZXN0LXRhYmxlXSBEZXN0cm95aW5nIHRhYmxlLi4uJyk7XG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB0aGlzLnN0b3BUaW1lcigpO1xuICAgIC8vdGhpcy5kYXRhU2VydmljZS5zdG9wKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzdG9yZUZpbHRlcigpIHtcbiAgICBjb25zdCBqc29uID0gdGhpcy5zZXR0aW5ncy5nZXRQYWdlU2V0dGluZ3ModGhpcy5zZXR0aW5nc0lkLCAnZmlsdGVyJyk7XG4gICAgY29uc29sZS5kZWJ1ZygnW3RhYmxlLXRlc3RdIFJlc3RvcmluZyBmaWx0ZXIgZnJvbSBzZXR0aW5ncy4uLicsIGpzb24pO1xuXG4gICAgaWYgKGpzb24pIHtcbiAgICAgIGNvbnN0IGZpbHRlciA9IFJlZmVyZW50aWFsRmlsdGVyLmZyb21PYmplY3QoanNvbik7XG4gICAgICB0aGlzLmZpbHRlckZvcm0ucGF0Y2hWYWx1ZShqc29uLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgdGhpcy5maWx0ZXJDcml0ZXJpYUNvdW50ID0gZmlsdGVyLmNvdW50Tm90RW1wdHlDcml0ZXJpYSgpO1xuICAgICAgdGhpcy5zZXRGaWx0ZXIoZmlsdGVyLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVUaW1lcigpIHtcbiAgICBpZiAoaXNOb3ROaWwodGhpcy50aW1lcikpIHRoaXMuc3RvcFRpbWVyKCk7XG4gICAgZWxzZSB0aGlzLnN0YXJ0VGltZXIoKTtcbiAgfVxuXG4gIGxvYWQoKSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW3Rlc3QtdGFibGVdIFVwZGF0aW5nIGRhdGEuLi4nKTtcbiAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcblxuICAgIGlmIChpc05pbCh0aGlzLmRhdGEpKSB7XG4gICAgICB0aGlzLmRhdGEgPSB0aGlzLmdlbmVyYXRlRGF0YSgwLCBUYWJsZVRlc3RQYWdlLm1heFJvd0NvdW50KTtcbiAgICB9XG4gICAgdGhpcy5kYXRhU2VydmljZS52YWx1ZSA9IHRoaXMuZGF0YTtcblxuICAgIHRoaXMub25SZWZyZXNoLmVtaXQoKTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoTW9yZShldmVudCkge1xuICAgIGNvbnNvbGUuZGVidWcoJ1t0YWJsZS10ZXN0XSBMb2FkaW5nIG1vcmUuLi4nLCBldmVudCk7XG4gICAgY29uc3QgZmV0Y2hlZCA9IGF3YWl0IHRoaXMuX2RhdGFTb3VyY2UuZmV0Y2hNb3JlKCk7XG5cbiAgICBpZiAoZmV0Y2hlZCAmJiBldmVudD8udGFyZ2V0ICYmIGV2ZW50LnRhcmdldC5jb21wbGV0ZSkge1xuICAgICAgLy8gV2FpdCBlbmQgb2YgbG9hZFxuICAgICAgYXdhaXQgdGhpcy53YWl0SWRsZSgpO1xuICAgICAgLy8gTWFyayB0YXJnZXQgZXZlbnQgYXMgY29tcGxldGVkIChlLmcuIElvblJlZnJlc2hlcilcbiAgICAgIGV2ZW50LnRhcmdldC5jb21wbGV0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNhdmUob3B0cz86IHsga2VlcEVkaXRpbmc/OiBib29sZWFuIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzYXZlZCA9IGF3YWl0IHN1cGVyLnNhdmUob3B0cyk7XG4gICAgaWYgKHNhdmVkKSB7XG4gICAgICAvLyBVcGRhdGUgc291cmNlIGRhdGFcbiAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YVNlcnZpY2UudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBzYXZlZDtcbiAgfVxuXG4gIGNsZWFyQ29udHJvbFZhbHVlKGV2ZW50OiBFdmVudCwgZm9ybUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IGJvb2xlYW4ge1xuICAgIGlmIChldmVudCkgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIEF2b2lkIHRvIGVudGVyIGlucHV0IHRoZSBmaWVsZFxuICAgIGZvcm1Db250cm9sLnNldFZhbHVlKG51bGwpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVyQW5kQ2xvc2VQYW5lbChldmVudD86IEV2ZW50KSB7XG4gICAgdGhpcy5kZWZhdWx0UGFnZVNpemUgPSBERUZBVUxUX1BBR0VfU0laRTtcbiAgICB0aGlzLm9uUmVmcmVzaC5lbWl0KGV2ZW50KTtcbiAgICB0aGlzLmZpbHRlckV4cGFuc2lvblBhbmVsLmNsb3NlKCk7XG4gIH1cblxuICByZXNldEZpbHRlcihldmVudD86IEV2ZW50KSB7XG4gICAgdGhpcy5maWx0ZXJGb3JtLnJlc2V0KHt9LCB7ZW1pdEV2ZW50OiB0cnVlfSk7XG4gICAgdGhpcy5zZXRGaWx0ZXIoUmVmZXJlbnRpYWxGaWx0ZXIuZnJvbU9iamVjdCh7fSksIHtlbWl0RXZlbnQ6IHRydWV9KTtcbiAgICB0aGlzLmZpbHRlckV4cGFuc2lvblBhbmVsLmNsb3NlKCk7XG4gIH1cblxuICBzdGFydFRpbWVyKCkge1xuICAgIHRoaXMuc3RvcFRpbWVyKCk7XG4gICAgdGhpcy50aW1lciA9IHRpbWVyKDUwMClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmRhdGEgPSBudWxsOyAvLyBSZXNldFxuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgc3RvcFRpbWVyKCkge1xuICAgIHRoaXMudGltZXI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy50aW1lciA9IG51bGw7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2VuZXJhdGVEYXRhKG9mZnNldD86IG51bWJlciwgc2l6ZT86IG51bWJlciwgKTogUmVmZXJlbnRpYWxbXSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG4gICAgc2l6ZSA9IHNpemUgfHwgMTAwO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFJlZmVyZW50aWFsPigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICBjb25zdCBpZCA9IGkgKyAxICsgb2Zmc2V0O1xuICAgICAgY29uc3QgaXRlbSA9IFJlZmVyZW50aWFsLmZyb21PYmplY3Qoe1xuICAgICAgICBpZCxcbiAgICAgICAgbGFiZWw6ICdDT0RFLScgKyBpZCxcbiAgICAgICAgbmFtZTogJ05hbWUgIycgKyBpZCxcbiAgICAgICAgbGV2ZWxJZDoge2lkOiAxLCBsYWJlbDogJ0EnLCBuYW1lOiAnSXRlbSBBJ30sXG4gICAgICAgIHN0YXR1c0lkOiBTdGF0dXNJZHMuRU5BQkxFLFxuICAgICAgICBjb21tZW50czogJ015IGNvbW1lbnQgIycgKyBpZCxcbiAgICAgICAgY3JlYXRpb25EYXRlOiBmcm9tVW5peE1zVGltZXN0YW1wKERhdGUubm93KCkgLSBpICogNjAgKiAxMDAwKSxcbiAgICAgICAgdXBkYXRlRGF0ZTogZnJvbVVuaXhNc1RpbWVzdGFtcChEYXRlLm5vdygpIC0gaSAqIDYwICogMTAwMCksXG4gICAgICAgIGVudGl0eU5hbWU6ICdUZXN0Vk8nXG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiIsIjxhcHAtdG9vbGJhciBjb2xvcj1cInByaW1hcnlcIiBbY2FuR29CYWNrXT1cInRydWVcIlxuICAgICAgICAgICAgIFtoYXNWYWxpZGF0ZV09XCIhKGxvYWRpbmdTdWJqZWN0fGFzeW5jKSAmJiBkaXJ0eVwiXG4gICAgICAgICAgICAgKG9uVmFsaWRhdGUpPVwic2F2ZSgpXCJcbiAgICAgICAgICAgICBbYmFja0hyZWZdPVwiJy90ZXN0aW5nJ1wiPlxuICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuXG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNlbGVjdGlvbi5oYXNWYWx1ZSgpOyBlbHNlIGhhc1NlbGVjdGlvblwiPlxuICAgICAgPCEtLSBBZGQgLS0+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cImNhbkVkaXQgJiYgIW1vYmlsZVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9BREQnfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhZGRSb3coKVwiPlxuICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8IS0tIHJlc2V0IGZpbHRlciAtLT5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJyZXNldEZpbHRlcigpXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJmaWx0ZXJDcml0ZXJpYUNvdW50XCI+XG4gICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cImFjY2VudFwiPmZpbHRlcl9saXN0X2FsdDwvbWF0LWljb24+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24tc2Vjb25kYXJ5XCIgc3R5bGU9XCJsZWZ0OiAxNnB4OyB0b3A6IDVweDsgZm9udC13ZWlnaHQ6IGJvbGQ7XCI+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDwhLS0gc2hvdyBmaWx0ZXIgLS0+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiZmlsdGVyRXhwYW5zaW9uUGFuZWwudG9nZ2xlKClcIj5cbiAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZmlsdGVyQ3JpdGVyaWFDb3VudDsgZWxzZSBlbXB0eUZpbHRlclwiXG4gICAgICAgICAgICAgICAgICBbbWF0QmFkZ2VdPVwiZmlsdGVyQ3JpdGVyaWFDb3VudFwiXG4gICAgICAgICAgICAgICAgICBtYXRCYWRnZUNvbG9yPVwiYWNjZW50XCJcbiAgICAgICAgICAgICAgICAgIG1hdEJhZGdlU2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgIG1hdEJhZGdlUG9zaXRpb249XCJhYm92ZSBhZnRlclwiPmZpbHRlcl9saXN0X2FsdFxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2VtcHR5RmlsdGVyPlxuICAgICAgICAgIDxtYXQtaWNvbj5maWx0ZXJfbGlzdF9hbHQ8L21hdC1pY29uPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDwhLS0gc2hvdyBmaWx0ZXIgLS0+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAqbmdJZj1cIm1vYmlsZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhKGRpcnR5U3ViamVjdHxhc3luYylcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2F2ZSgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5zYXZlPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8IS0tIHN0YXJ0L3N0b3AgdGltZXIgdG8gYXV0by1sb2FkIGRhdGEgLS0+XG4gICAgICA8aW9uLWJ1dHRvbiAqbmdJZj1cIiF0aW1lclwiIChjbGljayk9XCJzdGFydFRpbWVyKClcIj5TdGFydCByZWxvYWQ8L2lvbi1idXR0b24+XG4gICAgICA8aW9uLWJ1dHRvbiAqbmdJZj1cInRpbWVyXCIgKGNsaWNrKT1cInN0b3BUaW1lcigpXCIgY29sb3I9XCJhY2NlbnRcIj5TdG9wIHJlbG9hZDwvaW9uLWJ1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gaWYgcm93IHNlbGVjdGlvbiAtLT5cbiAgICA8bmctdGVtcGxhdGUgI2hhc1NlbGVjdGlvbj5cblxuICAgICAgPCEtLSBkZWxldGUgLS0+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cImNhbkVkaXRcIiBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fREVMRVRFJ3x0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlU2VsZWN0aW9uKCRldmVudClcIj5cbiAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPCEtLSBkdXBsaWNhdGUgLS0+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cImNhbkVkaXQgJiYgc2VsZWN0aW9uLnNlbGVjdGVkIHwgaXNBcnJheUxlbmd0aDoge2VxdWFsczogMX1cIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fRFVQTElDQVRFJ3x0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZHVwbGljYXRlUm93KCRldmVudCwgc2VsZWN0aW9uLnNlbGVjdGVkWzBdKVwiPlxuICAgICAgICA8bWF0LWljb24+ZmlsZV9jb3B5PC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvaW9uLWJ1dHRvbnM+XG48L2FwcC10b29sYmFyPlxuPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cblxuICA8aW9uLXJlZnJlc2hlciBzbG90PVwiZml4ZWRcIiAqbmdJZj1cIm1vYmlsZVwiIChpb25SZWZyZXNoKT1cImRvUmVmcmVzaCgkZXZlbnQpXCI+XG4gICAgPGlvbi1yZWZyZXNoZXItY29udGVudD48L2lvbi1yZWZyZXNoZXItY29udGVudD5cbiAgPC9pb24tcmVmcmVzaGVyPlxuXG4gIDwhLS0gZXJyb3IgLS0+XG4gIDxpb24taXRlbSAqbmdJZj1cIm1vYmlsZSAmJiBlcnJvclwiIGxpbmVzPVwibm9uZVwiIEBzbGlkZVVwRG93bkFuaW1hdGlvbj5cbiAgICA8aW9uLWljb24gY29sb3I9XCJkYW5nZXJcIiBzbG90PVwic3RhcnRcIiBuYW1lPVwiYWxlcnQtY2lyY2xlXCI+PC9pb24taWNvbj5cbiAgICA8aW9uLWxhYmVsIGNvbG9yPVwiZGFuZ2VyXCIgY2xhc3M9XCJlcnJvclwiIFtpbm5lckhUTUxdPVwiZXJyb3J8dHJhbnNsYXRlXCI+PC9pb24tbGFiZWw+XG4gIDwvaW9uLWl0ZW0+XG5cbiAgPCEtLSBzZWFyY2ggLS0+XG4gIDxtYXQtZXhwYW5zaW9uLXBhbmVsICNmaWx0ZXJFeHBhbnNpb25QYW5lbCBjbGFzcz1cImZpbHRlci1wYW5lbCBmaWx0ZXItcGFuZWwtZmxvYXRpbmdcIj5cbiAgICA8Zm9ybSBjbGFzcz1cImZvcm0tY29udGFpbmVyIGlvbi1wYWRkaW5nLXRvcFwiIFtmb3JtR3JvdXBdPVwiZmlsdGVyRm9ybVwiIChuZ1N1Ym1pdCk9XCJhcHBseUZpbHRlckFuZENsb3NlUGFuZWwoJGV2ZW50KVwiPlxuXG4gICAgICA8aW9uLWdyaWQ+XG4gICAgICAgIDxpb24tcm93PlxuICAgICAgICAgIDxpb24tY29sPlxuICAgICAgICAgICAgPCEtLSBzZWFyY2ggdGV4dCAtLT5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIG1hdFByZWZpeCBuYW1lPVwic2VhcmNoXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzZWFyY2hUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1RBQkxFLlRFU1RJTkcuU0VBUkNIX1RFWFQnfHRyYW5zbGF0ZVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXRTdWZmaXggdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyQ29udHJvbFZhbHVlKCRldmVudCwgZmlsdGVyRm9ybS5jb250cm9scy5zZWFyY2hUZXh0KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCJmaWx0ZXJGb3JtLmNvbnRyb2xzLnNlYXJjaFRleHQuZGlzYWJsZWQgfHwgIWZpbHRlckZvcm0uY29udHJvbHMuc2VhcmNoVGV4dC52YWx1ZVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDwvaW9uLWdyaWQ+XG4gICAgPC9mb3JtPlxuXG4gICAgPG1hdC1hY3Rpb24tcm93PlxuICAgICAgPCEtLSBDb3VudGVyICAtLT5cbiAgICAgIDxpb24tbGFiZWwgW2hpZGRlbl09XCIobG9hZGluZ1N1YmplY3R8YXN5bmMpIHx8IGZpbHRlckZvcm0uZGlydHlcIlxuICAgICAgICAgICAgICAgICBbY29sb3JdPVwiZW1wdHkgJiYgJ2RhbmdlcidcIlxuICAgICAgICAgICAgICAgICBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gICAgICAgIHt7ICh0b3RhbFJvd0NvdW50ID8gJ0NPTU1PTi5SRVNVTFRfQ09VTlQnIDogJ0NPTU1PTi5OT19SRVNVTFQnKSB8IHRyYW5zbGF0ZToge1xuICAgICAgICBjb3VudDogKHRvdGFsUm93Q291bnQgfFxuICAgICAgICAgIG51bWJlckZvcm1hdClcbiAgICAgIH0gfX1cbiAgICAgIDwvaW9uLWxhYmVsPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwidG9vbGJhci1zcGFjZXJcIj48L2Rpdj5cblxuICAgICAgPCEtLSBDbG9zZSBwYW5lbCAtLT5cbiAgICAgIDxpb24tYnV0dG9uIG1hdC1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmaWx0ZXJFeHBhbnNpb25QYW5lbC5jbG9zZSgpXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nU3ViamVjdHxhc3luY1wiPlxuICAgICAgICA8aW9uLXRleHQgdHJhbnNsYXRlPkNPTU1PTi5CVE5fQ0xPU0U8L2lvbi10ZXh0PlxuICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgICA8IS0tIFNlYXJjaCBidXR0b24gLS0+XG4gICAgICA8aW9uLWJ1dHRvbiBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBbY29sb3JdPVwiZmlsdGVyRm9ybS5kaXJ0eSA/ICd0ZXJ0aWFyeScgOiAnZGFyaydcIlxuICAgICAgICAgICAgICAgICAgW2ZpbGxdPVwiZmlsdGVyRm9ybS5kaXJ0eSA/ICdzb2xpZCcgOiAnY2xlYXInXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhcHBseUZpbHRlckFuZENsb3NlUGFuZWwoJGV2ZW50KVwiPlxuICAgICAgICA8aW9uLXRleHQgdHJhbnNsYXRlPkNPTU1PTi5CVE5fQVBQTFk8L2lvbi10ZXh0PlxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgIDwvbWF0LWFjdGlvbi1yb3c+XG4gIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cblxuICA8IS0tIHRhYmxlIC0tPlxuICA8ZGl2IFtjbGFzcy50YWJsZS1jb250YWluZXJdPVwiIWVuYWJsZUluZmluaXRlU2Nyb2xsXCI+XG4gICAgPHRhYmxlICN0YWJsZSBtYXQtdGFibGUgbWF0U29ydCBtYXRTb3J0RGlzYWJsZUNsZWFyXG4gICAgICAgICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxuICAgICAgICAgICBbbWF0U29ydEFjdGl2ZV09XCJkZWZhdWx0U29ydEJ5XCJcbiAgICAgICAgICAgW21hdFNvcnREaXJlY3Rpb25dPVwiZGVmYXVsdFNvcnREaXJlY3Rpb25cIlxuICAgICAgICAgICBbdHJhY2tCeV09XCJ0cmFja0J5Rm5cIj5cblxuICAgICAgPCEtLSBncm91cCBoZWFkZXIgY2VsbHMgLS0+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwidG9wLXN0YXJ0XCIgW3N0aWNreV09XCJ1c2VTdGlja3lcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCIhY2FuRWRpdFwiIFthdHRyLmNvbHNwYW5dPVwiMlwiPlxuICAgICAgICAgIDwhLS0gc3RhcnQgc3BhY2VyIC0tPlxuICAgICAgICA8L3RoPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZ3JvdXAtMVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFthdHRyLmNvbHNwYW5dPVwiM1wiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogd2hpdGVzbW9rZTsgbWFyZ2luLWJvdHRvbTogLTFweDtcIj5cbiAgICAgICAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT57e2kxOG5Db2x1bW5QcmVmaXggKyAnR1JPVVBfMSd9fTwvaW9uLWxhYmVsPlxuICAgICAgICA8L3RoPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZ3JvdXAtMlwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFthdHRyLmNvbHNwYW5dPVwiM1wiPlxuICAgICAgICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPnt7aTE4bkNvbHVtblByZWZpeCArICdHUk9VUF8yJ319PC9pb24tbGFiZWw+XG4gICAgICAgIDwvdGg+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ0b3AtZW5kXCIgPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICAgIDwhLS0gZW5kIHNwYWNlciAtLT5cbiAgICAgICAgPC90aD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNlbGVjdFwiIFtzdGlja3ldPVwidXNlU3RpY2t5XCIgW2NsYXNzLm1hdC1jb2x1bW4tc3RpY2t5XT1cInVzZVN0aWNreVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIiFjYW5FZGl0XCI+XG4gICAgICAgICAgPG1hdC1jaGVja2JveCAoY2hhbmdlKT1cIiRldmVudCA/IG1hc3RlclRvZ2dsZSgpIDogbnVsbFwiIFtjaGVja2VkXT1cInNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmIGlzQWxsU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhaXNBbGxTZWxlY3RlZCgpXCI+XG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCIhY2FuRWRpdFwiPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChjaGFuZ2UpPVwiJGV2ZW50ID8gc2VsZWN0aW9uLnRvZ2dsZShyb3cpIDogbnVsbFwiIFtjaGVja2VkXT1cInNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdylcIj5cbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIElkIGNvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaWRcIiBbc3RpY2t5XT1cInVzZVN0aWNreVwiIFtjbGFzcy5tYXQtY29sdW1uLXN0aWNreV09XCJ1c2VTdGlja3lcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+XG4gICAgICAgICAgPGlvbi1sYWJlbD4jPC9pb24tbGFiZWw+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj57eyByb3cuY3VycmVudERhdGE/LmlkIH19PC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIExhYmVsIGNvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibGFiZWxcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+XG4gICAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+VEFCTEUuVEVTVElORy5MQUJFTDwvaW9uLWxhYmVsPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgKGNsaWNrKT1cImZvY3VzQ29sdW1uPSdsYWJlbCdcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cIm5ldmVyXCI+XG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwicm93LnZhbGlkYXRvci5jb250cm9sc1snbGFiZWwnXVwiXG4gICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidUQUJMRS5URVNUSU5HLkxBQkVMJ3x0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgIFthcHBBdXRvZm9jdXNdPVwicm93LmVkaXRpbmcgJiYgZm9jdXNDb2x1bW4gPT09ICdsYWJlbCdcIlxuICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIhcm93LmVkaXRpbmdcIj5cbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJyb3cudmFsaWRhdG9yLmNvbnRyb2xzWydsYWJlbCddLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX1JFUVVJUkVEPC9tYXQtZXJyb3I+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIE5hbWUgY29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJuYW1lXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlxuICAgICAgICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPlRBQkxFLlRFU1RJTkcuTkFNRTwvaW9uLWxhYmVsPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgW2NsYXNzLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkXT1cIiFyb3cuZWRpdGluZ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiZm9jdXNDb2x1bW49J25hbWUnXCI+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XCJuZXZlclwiPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInJvdy52YWxpZGF0b3I/LmNvbnRyb2xzLm5hbWVcIiBbcGxhY2Vob2xkZXJdPVwiJ1RBQkxFLlRFU1RJTkcuTkFNRSd8dHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICBbYXBwQXV0b2ZvY3VzXT1cInJvdy5lZGl0aW5nICYmIGZvY3VzQ29sdW1uID09PSAnbmFtZSdcIlxuICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIhcm93LmVkaXRpbmdcIj5cbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJyb3cudmFsaWRhdG9yPy5jb250cm9scy5uYW1lLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX1JFUVVJUkVEPC9tYXQtZXJyb3I+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIExldmVsIGNvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibGV2ZWxJZFwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5cbiAgICAgICAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT5UQUJMRS5URVNUSU5HLkxFVkVMX0lEPC9pb24tbGFiZWw+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBbY2xhc3MubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRdPVwiIXJvdy5lZGl0aW5nXCI+XG4gICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUtZmllbGQgZmxvYXRMYWJlbD1cIm5ldmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwicm93LnZhbGlkYXRvci5jb250cm9scy5sZXZlbElkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cImF1dG9jb21wbGV0ZUZpZWxkcy5sZXZlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIiFyb3cuZWRpdGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIj5cbiAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGUtZmllbGQ+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTdGF0dXMgY29sdW1uICAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic3RhdHVzSWRcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+VVNFUi5TVEFUVVM8L3NwYW4+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBbY2xhc3MubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRdPVwiIXJvdy5lZGl0aW5nXCI+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XCJuZXZlclwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIG1hdFByZWZpeCAqbmdJZj1cInJvdy52YWxpZGF0b3IuY29udHJvbHNbJ3N0YXR1c0lkJ10udmFsdWUgJmd0Oz0wXCIgW25hbWVdPVwic3RhdHVzQnlJZFtyb3cudmFsaWRhdG9yLmNvbnRyb2xzWydzdGF0dXNJZCddLnZhbHVlXT8uaWNvblwiPjwvaW9uLWljb24+XG5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbF09XCJyb3cudmFsaWRhdG9yLmNvbnRyb2xzWydzdGF0dXNJZCddXCIgW3BsYWNlaG9sZGVyXT1cImkxOG5Db2x1bW5QcmVmaXggKyAnU1RBVFVTX0lEJ3x0cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlcj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvdy52YWxpZGF0b3IuY29udHJvbHNbJ3N0YXR1c0lkJ10udmFsdWUgJmd0Oz0wXCI+XG4gICAgICAgICAgICAgICAgICB7eyBzdGF0dXNCeUlkW3Jvdy52YWxpZGF0b3IuY29udHJvbHNbJ3N0YXR1c0lkJ10udmFsdWVdPy5sYWJlbCB8IHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc3RhdHVzTGlzdFwiIFt2YWx1ZV09XCJpdGVtLmlkXCI+XG4gICAgICAgICAgICAgICAgPGlvbi1pY29uIFtuYW1lXT1cIml0ZW0uaWNvblwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAge3sgaXRlbS5sYWJlbCB8dHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJyb3cudmFsaWRhdG9yLmNvbnRyb2xzWydzdGF0dXNJZCddLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX1JFUVVJUkVEPC9tYXQtZXJyb3I+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgIDwhLS0gQ3JlYXRpb24gZGF0ZSBjb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInVwZGF0ZURhdGVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+XG4gICAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+VEFCTEUuVEVTVElORy5VUERBVEVfREFURTwvaW9uLWxhYmVsPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgY2xhc3M9XCJtYXQtZm9ybS1maWVsZC1kaXNhYmxlZFwiPlxuICAgICAgICAgIDxpb24tdGV4dCBjbGFzcz1cImlvbi10ZXh0LWVuZFwiIGNvbG9yPVwibWVkaXVtXCIgKm5nSWY9XCJyb3cuaWQhPT0tMVwiPlxuICAgICAgICAgICAgPHNtYWxsIFttYXRUb29sdGlwXT1cIidUQUJMRS5URVNUSU5HLkNSRUFUSU9OX0RBVEUnfHRyYW5zbGF0ZVwiICpuZ0lmPVwicm93LmN1cnJlbnREYXRhLmNyZWF0aW9uRGF0ZTsgbGV0IGNyZWF0aW9uRGF0ZVwiPlxuICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNhbGVuZGFyXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAge3sgY3JlYXRpb25EYXRlIHwgZGF0ZUZvcm1hdDoge3RpbWU6IHRydWV9IH19XG4gICAgICAgICAgICA8L3NtYWxsPjxici8+XG4gICAgICAgICAgICA8c21hbGwgW21hdFRvb2x0aXBdPVwiJ1RBQkxFLlRFU1RJTkcuVVBEQVRFX0RBVEUnfHRyYW5zbGF0ZVwiICpuZ0lmPVwicm93LmN1cnJlbnREYXRhLnVwZGF0ZURhdGU7IGxldCB1cGRhdGVEYXRlXCI+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwidGltZS1vdXRsaW5lXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAge3sgdXBkYXRlRGF0ZSB8IGRhdGVGb3JtYXQ6IHt0aW1lOiB0cnVlfSB9fVxuICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gQ29tbWVudCBjb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImNvbW1lbnRzXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+VEFCTEUuVEVTVElORy5DT01NRU5UUzwvaW9uLWxhYmVsPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XCJuZXZlclwiICpuZ0lmPVwicm93LmVkaXRpbmc7IGVsc2UgaWNvbkNvbW1lbnRcIj5cbiAgICAgICAgICAgIDwhLS08dGV4dGFyZWEgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cInJvdy52YWxpZGF0b3I/LmNvbnRyb2xzLmNvbW1lbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1RBQkxFLlRFU1RJTkcuQ09NTUVOVFMnfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIiFyb3cuZWRpdGluZ1wiPjwvdGV4dGFyZWE+LS0+XG5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJyb3cudmFsaWRhdG9yPy5jb250cm9scy5jb21tZW50c1wiXG4gICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidUQUJMRS5URVNUSU5HLkNPTU1FTlRTJ3x0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIhcm93LmVkaXRpbmdcIj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNpY29uQ29tbWVudD5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbW1lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicm93LnZhbGlkYXRvcj8uY29udHJvbHMuY29tbWVudHMudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJyb3cudmFsaWRhdG9yPy5jb250cm9scy5jb21tZW50cy52YWx1ZVwiPjwvbWF0LWljb24+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIEFjdGlvbnMgYnV0dG9ucyBjb2x1bW4gLS0+XG4gICAgICA8YXBwLWFjdGlvbnMtY29sdW1uIFtzdGlja3lFbmRdPVwidHJ1ZVwiIFtjYW5DYW5jZWxdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uc0NsaWNrKT1cIm9wZW5TZWxlY3RDb2x1bW5zTW9kYWwoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjYW5jZWxPckRlbGV0ZUNsaWNrKT1cImNhbmNlbE9yRGVsZXRlKCRldmVudC5ldmVudCwgJGV2ZW50LnJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlybUFuZEFkZENsaWNrKT1cImNvbmZpcm1BbmRBZGQoJGV2ZW50LmV2ZW50LCAkZXZlbnQucm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChiYWNrd2FyZCk9XCJjb25maXJtQW5kQmFja3dhcmQoJGV2ZW50LmV2ZW50LCAkZXZlbnQucm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChmb3J3YXJkKT1cImNvbmZpcm1BbmRGb3J3YXJkKCRldmVudC5ldmVudCwgJGV2ZW50LnJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2VsbFRlbXBsYXRlXT1cImNlbGxJbmplY3Rpb25cIj5cblxuICAgICAgICA8IS0tIGNlbGwgaW5qZWN0aW9uLS0+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbEluamVjdGlvbiBsZXQtcm93PlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93LmVkaXRpbmcgJiYgIXJvdy52YWxpZGF0b3IuZGlydHlcIj4tPC9zcGFuPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8L2FwcC1hY3Rpb25zLWNvbHVtbj5cblxuICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJncm91cENvbHVtbnM7XCIgY2xhc3M9XCJtYXQtdG9vbGJhclwiPjwvdHI+XG4gICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnM7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XG4gICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucztcIlxuICAgICAgICAgIFtjbGFzcy5tYXQtcm93LXNlbGVjdGVkXT1cInJvdy5lZGl0aW5nXCJcbiAgICAgICAgICBbY2xhc3MubWF0LXJvdy1lcnJvcl09XCJyb3cudmFsaWRhdG9yPy5pbnZhbGlkXCJcbiAgICAgICAgICBbY2xhc3MubWF0LXJvdy1kaXNhYmxlZF09XCIhcm93LmVkaXRpbmdcIlxuICAgICAgICAgIFtjbGFzcy5tYXQtcm93LWRpcnR5XT1cInJvdy52YWxpZGF0b3I/LmRpcnR5XCJcbiAgICAgICAgICAoY2xpY2spPVwiY2xpY2tSb3coJGV2ZW50LCByb3cpXCJcbiAgICAgICAgICAoa2V5ZG93bi5lc2NhcGUpPVwiZXNjYXBlRWRpdGluZ1JvdygkZXZlbnQpXCJcbiAgICAgICAgICBbY2RrVHJhcEZvY3VzXT1cInJvdy52YWxpZGF0b3I/LmludmFsaWRcIj48L3RyPlxuICAgIDwvdGFibGU+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGluZ1N1YmplY3R8YXN5bmM7IGVsc2Ugbm9SZXN1bHRcIj5cbiAgICAgIDxpb24taXRlbT5cbiAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IGFuaW1hdGVkPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICA8L2lvbi1pdGVtPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLXRlbXBsYXRlICNub1Jlc3VsdD5cbiAgICAgIDxpb24taXRlbSAqbmdJZj1cInRvdGFsUm93Q291bnQgPT09IDBcIj5cbiAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwiZGFuZ2VyXCIgY2xhc3M9XCJ0ZXh0LWl0YWxpY1wiIHRyYW5zbGF0ZT5DT01NT04uTk9fUkVTVUxUPC9pb24tdGV4dD5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxpb24taW5maW5pdGUtc2Nyb2xsICpuZ0lmPVwiZW5hYmxlSW5maW5pdGVTY3JvbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFt0aHJlc2hvbGRdPVwibW9iaWxlID8gJzEwJScgOiAnMiUnXCIgcG9zaXRpb249XCJib3R0b21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIChpb25JbmZpbml0ZSk9XCJmZXRjaE1vcmUoJGV2ZW50KVwiPlxuICAgICAgPGlvbi1pbmZpbml0ZS1zY3JvbGwtY29udGVudFxuICAgICAgICBsb2FkaW5nU3Bpbm5lcj1cImNpcmNsZXNcIlxuICAgICAgICBbbG9hZGluZ1RleHRdPVwiJ0NPTU1PTi5MT0FESU5HX0RPVFMnfHRyYW5zbGF0ZVwiPlxuICAgICAgPC9pb24taW5maW5pdGUtc2Nyb2xsLWNvbnRlbnQ+XG4gICAgPC9pb24taW5maW5pdGUtc2Nyb2xsPlxuICA8L2Rpdj5cbjwvaW9uLWNvbnRlbnQ+XG5cbjxpb24tZm9vdGVyPlxuICA8IS0tIFBhZ2luYXRvciAgLS0+XG4gIDxtYXQtcGFnaW5hdG9yICpuZ0lmPVwiIWVuYWJsZUluZmluaXRlU2Nyb2xsXCJcbiAgICAgICAgICAgICAgICAgW2xlbmd0aF09XCJ0b3RhbFJvd0NvdW50XCIgW3BhZ2VTaXplXT1cImRlZmF1bHRQYWdlU2l6ZVwiIFtwYWdlU2l6ZU9wdGlvbnNdPVwiZGVmYXVsdFBhZ2VTaXplT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0LXBhZ2luYXRvci1mb290ZXJcIlxuICAgICAgICAgICAgICAgICBzaG93Rmlyc3RMYXN0QnV0dG9ucz5cbiAgPC9tYXQtcGFnaW5hdG9yPlxuXG4gIDxhcHAtZm9ybS1idXR0b25zLWJhciAqbmdJZj1cImNhbkVkaXQgJiYgIW1vYmlsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25DYW5jZWwpPVwibG9hZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblNhdmUpPVwic2F2ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIobG9hZGluZ1N1YmplY3R8YXN5bmMpIHx8ICFkaXJ0eVwiPlxuICAgIDwhLS0gZXJyb3IgLS0+XG4gICAgPGlvbi1pdGVtICpuZ0lmPVwiZXJyb3IkfGFzeW5jXCIgbGluZXM9XCJub25lXCI+XG4gICAgICA8aW9uLWljb24gY29sb3I9XCJkYW5nZXJcIiBzbG90PVwic3RhcnRcIiBuYW1lPVwiYWxlcnQtY2lyY2xlXCI+PC9pb24taWNvbj5cbiAgICAgIDxpb24tbGFiZWwgY29sb3I9XCJkYW5nZXJcIiBbaW5uZXJIVE1MXT1cImVycm9yfHRyYW5zbGF0ZVwiPjwvaW9uLWxhYmVsPlxuICAgIDwvaW9uLWl0ZW0+XG4gIDwvYXBwLWZvcm0tYnV0dG9ucy1iYXI+XG48L2lvbi1mb290ZXI+XG5cbjxpb24tZmFiIHNsb3Q9XCJmaXhlZFwiIHZlcnRpY2FsPVwiYm90dG9tXCIgaG9yaXpvbnRhbD1cImVuZFwiXG4gICAgICAgICAqbmdJZj1cImNhbkVkaXQgJiYgbW9iaWxlXCI+XG4gIDxpb24tZmFiLWJ1dHRvbiBjb2xvcj1cInRlcnRpYXJ5XCIgKGNsaWNrKT1cImFkZFJvdygkZXZlbnQpXCI+XG4gICAgPGlvbi1pY29uIG5hbWU9XCJhZGRcIj48L2lvbi1pY29uPlxuICA8L2lvbi1mYWItYnV0dG9uPlxuPC9pb24tZmFiPlxuIl19
|
|
264
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUudGVzdGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS90YWJsZS90ZXN0aW5nL3RhYmxlLnRlc3RpbmcudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvdGFibGUvdGVzdGluZy90YWJsZS50ZXN0aW5nLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFxQixTQUFTLEVBQUUsVUFBVSxFQUFZLEtBQUssRUFBcUIsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQy9JLE9BQU8sRUFBQyxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsc0JBQXNCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RyxPQUFPLEVBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQUMzRixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUMzRSxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxzREFBc0QsQ0FBQztBQUM3RixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUVsRixPQUFPLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBQ2xGLE9BQU8sRUFBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBQywy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RUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pCLENBQUM7O0FBL09NLHlCQUFXLEdBQUcsR0FBRyxDQUFDOzBHQUhkLGFBQWE7OEZBQWIsYUFBYSw4SEFYYjtRQUNUO1lBQ0UsT0FBTyxFQUFFLG1CQUFtQjtZQUM1QixRQUFRLEVBQUUsMkJBQTJCO1NBQ3RDO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO1NBQ2hFO0tBQ0YsZ0ZBeUJVLGlCQUFpQiwrRkFDakIsaUJBQWlCLHVFQ3ZEOUIsOGtoQkFnWUE7MkZEaFdhLGFBQWE7a0JBZnpCLFNBQVM7K0JBQ0UsbUJBQW1CLGFBR2xCO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxtQkFBbUI7NEJBQzVCLFFBQVEsRUFBRSwyQkFBMkI7eUJBQ3RDO3dCQUNEOzRCQUNFLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDO3lCQUNoRTtxQkFDRixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTTtrTUFpQnRDLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQU13QyxvQkFBb0I7c0JBQWpFLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUNkLGNBQWM7c0JBQTNDLFNBQVM7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5qZWN0b3IsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QXBwVGFibGUsIERFRkFVTFRfUEFHRV9TSVpFLCBSRVNFUlZFRF9FTkRfQ09MVU1OUywgUkVTRVJWRURfU1RBUlRfQ09MVU1OU30gZnJvbSAnLi4vdGFibGUuY2xhc3MnO1xuaW1wb3J0IHtSZWZlcmVudGlhbCwgU3RhdHVzQnlJZCwgU3RhdHVzTGlzdH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbW9kZWwvcmVmZXJlbnRpYWwubW9kZWwnO1xuaW1wb3J0IHtJb25JbmZpbml0ZVNjcm9sbH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHtFbnRpdGllc1RhYmxlRGF0YVNvdXJjZX0gZnJvbSAnLi4vZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZS5jbGFzcyc7XG5pbXBvcnQge0luTWVtb3J5RW50aXRpZXNTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2VydmljZXMvbWVtb3J5LWVudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7QXBwVmFsaWRhdG9yU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdG9yL2Jhc2UudmFsaWRhdG9yLmNsYXNzJztcbmltcG9ydCB7QWJzdHJhY3RDb250cm9sLCBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtR3JvdXB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7aXNOaWwsIGlzTm90TmlsfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7ZnJvbVVuaXhNc1RpbWVzdGFtcH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2RhdGVzJztcbmltcG9ydCB7UmVmZXJlbnRpYWxGaWx0ZXJ9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Rlc3RpbmcvcmVmZXJlbnRpYWwtZmlsdGVyLm1vZGVsJztcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBmaWx0ZXIsIHRhcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtNYXRFeHBhbnNpb25QYW5lbH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZXhwYW5zaW9uJztcbmltcG9ydCB7UmVmZXJlbnRpYWxWYWxpZGF0b3JTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90ZXN0aW5nL3JlZmVyZW50aWFsLnZhbGlkYXRvcic7XG5pbXBvcnQge1N0YXR1c0lkc30gZnJvbSAnLi4vLi4vc2VydmljZXMvbW9kZWwvbW9kZWwuZW51bSc7XG5pbXBvcnQge1N1YnNjcmlwdGlvbiwgdGltZXJ9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdGFibGUtdGVzdGluZycsXG4gIHN0eWxlVXJsczogWyd0YWJsZS50ZXN0aW5nLnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICd0YWJsZS50ZXN0aW5nLmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBBcHBWYWxpZGF0b3JTZXJ2aWNlLFxuICAgICAgdXNlQ2xhc3M6IFJlZmVyZW50aWFsVmFsaWRhdG9yU2VydmljZVxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogQXBwVGFibGUsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRhYmxlVGVzdFBhZ2UpLFxuICAgIH1cbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVUZXN0UGFnZSBleHRlbmRzIEFwcFRhYmxlPFJlZmVyZW50aWFsLCBSZWZlcmVudGlhbEZpbHRlcj5cbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgc3RhdGljIG1heFJvd0NvdW50ID0gMTAwO1xuXG4gIHRpbWVyOiBTdWJzY3JpcHRpb247XG4gIGNhbkVkaXQgPSB0cnVlO1xuICBkYXRhOiBSZWZlcmVudGlhbFtdO1xuICBmaWx0ZXJGb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xuICBmaWx0ZXJDcml0ZXJpYUNvdW50ID0gMDtcbiAgZ3JvdXBDb2x1bW5zID0gWyd0b3Atc3RhcnQnLCAnZ3JvdXAtMScsICdncm91cC0yJywgJ3RvcC1lbmQnXTtcblxuICByZWFkb25seSBzdGF0dXNMaXN0ID0gU3RhdHVzTGlzdDtcbiAgcmVhZG9ubHkgc3RhdHVzQnlJZCA9IFN0YXR1c0J5SWQ7XG5cbiAgQElucHV0KCkgZW5hYmxlSW5maW5pdGVTY3JvbGw6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHVzZVN0aWNreSA9IHRydWU7XG5cbiAgZ2V0IGhhc01vcmVEYXRhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGEubGVuZ3RoIDwgMTAwO1xuICB9XG5cbiAgQFZpZXdDaGlsZChNYXRFeHBhbnNpb25QYW5lbCwge3N0YXRpYzogdHJ1ZX0pIGZpbHRlckV4cGFuc2lvblBhbmVsOiBNYXRFeHBhbnNpb25QYW5lbDtcbiAgQFZpZXdDaGlsZChJb25JbmZpbml0ZVNjcm9sbCkgaW5maW5pdGVTY3JvbGw6IElvbkluZmluaXRlU2Nyb2xsO1xuXG4gIGdldCBkYXRhU2VydmljZSgpOiBJbk1lbW9yeUVudGl0aWVzU2VydmljZTxSZWZlcmVudGlhbD57XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2UuZGF0YVNlcnZpY2UgYXMgSW5NZW1vcnlFbnRpdGllc1NlcnZpY2U8UmVmZXJlbnRpYWw+XG4gIH1cblxuICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCB2YWxpZGF0b3JTZXJ2aWNlOiBBcHBWYWxpZGF0b3JTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxuICAgICAgICAgICAgICApIHtcbiAgICBzdXBlcihpbmplY3RvciwgW1xuICAgICAgLi4uUkVTRVJWRURfU1RBUlRfQ09MVU1OUyxcbiAgICAgICdsYWJlbCcsXG4gICAgICAnbmFtZScsXG4gICAgICAnbGV2ZWxJZCcsXG4gICAgICAnc3RhdHVzSWQnLFxuICAgICAgJ3VwZGF0ZURhdGUnLFxuICAgICAgJ2NvbW1lbnRzJyxcbiAgICAgIC4uLlJFU0VSVkVEX0VORF9DT0xVTU5TXG4gICAgXSxcbiAgICAgIG5ldyBFbnRpdGllc1RhYmxlRGF0YVNvdXJjZShSZWZlcmVudGlhbCwgbmV3IEluTWVtb3J5RW50aXRpZXNTZXJ2aWNlKFJlZmVyZW50aWFsLCBSZWZlcmVudGlhbEZpbHRlciwge1xuICAgICAgICBzb3J0QnlSZXBsYWNlbWVudDoge2lkOiAnaWQnfVxuICAgICAgfSksIHZhbGlkYXRvclNlcnZpY2UsIHtcbiAgICAgICAgc3VwcHJlc3NFcnJvcnM6IGZhbHNlXG4gICAgICB9KSxcbiAgICAgIG51bGwpO1xuXG4gICAgLy8gV29ya3Mgd2l0aCB0cnVlIGFuZCBmYWxzZVxuICAgIHRoaXMuZW5hYmxlSW5maW5pdGVTY3JvbGwgPSB0aGlzLm1vYmlsZTtcblxuICAgIHRoaXMuYXV0b0xvYWQgPSBmYWxzZTtcbiAgICB0aGlzLmlubGluZUVkaXRpb24gPSB0cnVlO1xuICAgIHRoaXMuaTE4bkNvbHVtblByZWZpeCA9ICdUQUJMRS5URVNUSU5HLic7XG5cbiAgICB0aGlzLmNvbmZpcm1CZWZvcmVEZWxldGUgPSB0cnVlO1xuICAgIHRoaXMuY29uZmlybUJlZm9yZUNhbmNlbCA9IGZhbHNlO1xuICAgIHRoaXMudW5kb2FibGVEZWxldGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuc2F2ZUJlZm9yZURlbGV0ZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5zYXZlQmVmb3JlU29ydCA9IHRydWU7XG4gICAgdGhpcy5zYXZlQmVmb3JlRmlsdGVyID0gdHJ1ZTtcbiAgICB0aGlzLnByb3BhZ2F0ZVJvd0Vycm9yID0gdHJ1ZTtcblxuICAgIHRoaXMuZmlsdGVyRm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIHNlYXJjaFRleHQ6IFtudWxsXVxuICAgIH0pO1xuXG4gICAgdGhpcy5vblN0YXJ0RWRpdGluZ1Jvdy5zdWJzY3JpYmUocm93ID0+IHtcbiAgICAgIHJvdy52YWxpZGF0b3IucGF0Y2hWYWx1ZSh7ZW50aXR5TmFtZTogJ1Rlc3RWTyd9LCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIC8vIFVwZGF0ZSBmaWx0ZXIgd2hlbiBjaGFuZ2VzXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMuZmlsdGVyRm9ybS52YWx1ZUNoYW5nZXNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDI1MCksXG4gICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuZmlsdGVyRm9ybS52YWxpZCksXG4gICAgICAgICAgdGFwKHZhbHVlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IFJlZmVyZW50aWFsRmlsdGVyLmZyb21PYmplY3QodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJDcml0ZXJpYUNvdW50ID0gZmlsdGVyLmNvdW50Tm90RW1wdHlDcml0ZXJpYSgpO1xuICAgICAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIC8vIEFwcGx5aW5nIHRoZSBmaWx0ZXJcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsdGVyKGZpbHRlciwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAvLyBTYXZlIGZpbHRlciBpbiBzZXR0aW5ncyAoYWZ0ZXIgYSBkZWJvdW5jZSB0aW1lKVxuICAgICAgICAgIGRlYm91bmNlVGltZSg1MDApLFxuICAgICAgICAgIHRhcChqc29uID0+IHRoaXMuc2V0dGluZ3Muc2F2ZVBhZ2VTZXR0aW5nKHRoaXMuc2V0dGluZ3NJZCwganNvbiwgJ2ZpbHRlcicpKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKVxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyQXV0b2NvbXBsZXRlRmllbGQoJ2xldmVsJywge1xuICAgICAgICBpdGVtczogW1xuICAgICAgICAgIHtpZDogMSwgbGFiZWw6ICdBJywgbmFtZTogJ2l0ZW0gQSd9LFxuICAgICAgICAgIHtpZDogMSwgbGFiZWw6ICdCJywgbmFtZTogJ2l0ZW0gQid9XG4gICAgICAgIF0sXG4gICAgICAgIG1vYmlsZTogdGhpcy5tb2JpbGVcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMub25SZWZyZXNoLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybS5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5maWx0ZXJGb3JtLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICB9KSk7XG5cbiAgICB0aGlzLm1hcmtBc1JlYWR5KCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG5cbiAgICAvLyBSZXN0b3JlIGZpbHRlciBmcm9tIHNldHRpbmdzXG4gICAgdGhpcy5yZXN0b3JlRmlsdGVyKCk7XG5cbiAgICAvLyBMb2FkIGRhdGFcbiAgICB0aGlzLmxvYWQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGNvbnNvbGUuZGVidWcoJ1t0ZXN0LXRhYmxlXSBEZXN0cm95aW5nIHRhYmxlLi4uJyk7XG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB0aGlzLnN0b3BUaW1lcigpO1xuICAgIC8vdGhpcy5kYXRhU2VydmljZS5zdG9wKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzdG9yZUZpbHRlcigpIHtcbiAgICBjb25zdCBqc29uID0gdGhpcy5zZXR0aW5ncy5nZXRQYWdlU2V0dGluZ3ModGhpcy5zZXR0aW5nc0lkLCAnZmlsdGVyJyk7XG4gICAgY29uc29sZS5kZWJ1ZygnW3RhYmxlLXRlc3RdIFJlc3RvcmluZyBmaWx0ZXIgZnJvbSBzZXR0aW5ncy4uLicsIGpzb24pO1xuXG4gICAgaWYgKGpzb24pIHtcbiAgICAgIGNvbnN0IGZpbHRlciA9IFJlZmVyZW50aWFsRmlsdGVyLmZyb21PYmplY3QoanNvbik7XG4gICAgICB0aGlzLmZpbHRlckZvcm0ucGF0Y2hWYWx1ZShqc29uLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgdGhpcy5maWx0ZXJDcml0ZXJpYUNvdW50ID0gZmlsdGVyLmNvdW50Tm90RW1wdHlDcml0ZXJpYSgpO1xuICAgICAgdGhpcy5zZXRGaWx0ZXIoZmlsdGVyLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVUaW1lcigpIHtcbiAgICBpZiAoaXNOb3ROaWwodGhpcy50aW1lcikpIHRoaXMuc3RvcFRpbWVyKCk7XG4gICAgZWxzZSB0aGlzLnN0YXJ0VGltZXIoKTtcbiAgfVxuXG4gIGxvYWQoKSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW3Rlc3QtdGFibGVdIFVwZGF0aW5nIGRhdGEuLi4nKTtcbiAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcblxuICAgIGlmIChpc05pbCh0aGlzLmRhdGEpKSB7XG4gICAgICB0aGlzLmRhdGEgPSB0aGlzLmdlbmVyYXRlRGF0YSgwLCBUYWJsZVRlc3RQYWdlLm1heFJvd0NvdW50KTtcbiAgICB9XG4gICAgdGhpcy5kYXRhU2VydmljZS52YWx1ZSA9IHRoaXMuZGF0YTtcblxuICAgIHRoaXMub25SZWZyZXNoLmVtaXQoKTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoTW9yZShldmVudCkge1xuICAgIGNvbnNvbGUuZGVidWcoJ1t0YWJsZS10ZXN0XSBMb2FkaW5nIG1vcmUuLi4nLCBldmVudCk7XG4gICAgY29uc3QgZmV0Y2hlZCA9IGF3YWl0IHRoaXMuX2RhdGFTb3VyY2UuZmV0Y2hNb3JlKCk7XG5cbiAgICBpZiAoZmV0Y2hlZCAmJiBldmVudD8udGFyZ2V0ICYmIGV2ZW50LnRhcmdldC5jb21wbGV0ZSkge1xuICAgICAgLy8gV2FpdCBlbmQgb2YgbG9hZFxuICAgICAgYXdhaXQgdGhpcy53YWl0SWRsZSgpO1xuICAgICAgLy8gTWFyayB0YXJnZXQgZXZlbnQgYXMgY29tcGxldGVkIChlLmcuIElvblJlZnJlc2hlcilcbiAgICAgIGV2ZW50LnRhcmdldC5jb21wbGV0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNhdmUob3B0cz86IHsga2VlcEVkaXRpbmc/OiBib29sZWFuIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzYXZlZCA9IGF3YWl0IHN1cGVyLnNhdmUob3B0cyk7XG4gICAgaWYgKHNhdmVkKSB7XG4gICAgICAvLyBVcGRhdGUgc291cmNlIGRhdGFcbiAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YVNlcnZpY2UudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBzYXZlZDtcbiAgfVxuXG4gIGNsZWFyQ29udHJvbFZhbHVlKGV2ZW50OiBFdmVudCwgZm9ybUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IGJvb2xlYW4ge1xuICAgIGlmIChldmVudCkgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIEF2b2lkIHRvIGVudGVyIGlucHV0IHRoZSBmaWVsZFxuICAgIGZvcm1Db250cm9sLnNldFZhbHVlKG51bGwpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVyQW5kQ2xvc2VQYW5lbChldmVudD86IEV2ZW50KSB7XG4gICAgdGhpcy5kZWZhdWx0UGFnZVNpemUgPSBERUZBVUxUX1BBR0VfU0laRTtcbiAgICB0aGlzLm9uUmVmcmVzaC5lbWl0KGV2ZW50KTtcbiAgICB0aGlzLmZpbHRlckV4cGFuc2lvblBhbmVsLmNsb3NlKCk7XG4gIH1cblxuICByZXNldEZpbHRlcihldmVudD86IEV2ZW50KSB7XG4gICAgdGhpcy5maWx0ZXJGb3JtLnJlc2V0KHt9LCB7ZW1pdEV2ZW50OiB0cnVlfSk7XG4gICAgdGhpcy5zZXRGaWx0ZXIoUmVmZXJlbnRpYWxGaWx0ZXIuZnJvbU9iamVjdCh7fSksIHtlbWl0RXZlbnQ6IHRydWV9KTtcbiAgICB0aGlzLmZpbHRlckV4cGFuc2lvblBhbmVsLmNsb3NlKCk7XG4gIH1cblxuICBzdGFydFRpbWVyKCkge1xuICAgIHRoaXMuc3RvcFRpbWVyKCk7XG4gICAgdGhpcy50aW1lciA9IHRpbWVyKDUwMClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmRhdGEgPSBudWxsOyAvLyBSZXNldFxuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgc3RvcFRpbWVyKCkge1xuICAgIHRoaXMudGltZXI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy50aW1lciA9IG51bGw7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2VuZXJhdGVEYXRhKG9mZnNldD86IG51bWJlciwgc2l6ZT86IG51bWJlciwgKTogUmVmZXJlbnRpYWxbXSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG4gICAgc2l6ZSA9IHNpemUgfHwgMTAwO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFJlZmVyZW50aWFsPigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICBjb25zdCBpZCA9IGkgKyAxICsgb2Zmc2V0O1xuICAgICAgY29uc3QgaXRlbSA9IFJlZmVyZW50aWFsLmZyb21PYmplY3Qoe1xuICAgICAgICBpZCxcbiAgICAgICAgbGFiZWw6ICdDT0RFLScgKyBpZCxcbiAgICAgICAgbmFtZTogJ05hbWUgIycgKyBpZCxcbiAgICAgICAgbGV2ZWxJZDoge2lkOiAxLCBsYWJlbDogJ0EnLCBuYW1lOiAnSXRlbSBBJ30sXG4gICAgICAgIHN0YXR1c0lkOiBTdGF0dXNJZHMuRU5BQkxFLFxuICAgICAgICBjb21tZW50czogJ015IGNvbW1lbnQgIycgKyBpZCxcbiAgICAgICAgY3JlYXRpb25EYXRlOiBmcm9tVW5peE1zVGltZXN0YW1wKERhdGUubm93KCkgLSBpICogNjAgKiAxMDAwKSxcbiAgICAgICAgdXBkYXRlRGF0ZTogZnJvbVVuaXhNc1RpbWVzdGFtcChEYXRlLm5vdygpIC0gaSAqIDYwICogMTAwMCksXG4gICAgICAgIGVudGl0eU5hbWU6ICdUZXN0Vk8nXG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiIsIjxhcHAtdG9vbGJhciBjb2xvcj1cInByaW1hcnlcIiBbY2FuR29CYWNrXT1cInRydWVcIlxuICAgICAgICAgICAgIFtoYXNWYWxpZGF0ZV09XCIhKGxvYWRpbmdTdWJqZWN0fGFzeW5jKSAmJiBkaXJ0eVwiXG4gICAgICAgICAgICAgKG9uVmFsaWRhdGUpPVwic2F2ZSgpXCJcbiAgICAgICAgICAgICBbYmFja0hyZWZdPVwiJy90ZXN0aW5nJ1wiPlxuICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuXG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNlbGVjdGlvbi5oYXNWYWx1ZSgpOyBlbHNlIGhhc1NlbGVjdGlvblwiPlxuICAgICAgPCEtLSBBZGQgLS0+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cImNhbkVkaXQgJiYgIW1vYmlsZVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9BREQnfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhZGRSb3coKVwiPlxuICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8IS0tIHJlc2V0IGZpbHRlciAtLT5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJyZXNldEZpbHRlcigpXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJmaWx0ZXJDcml0ZXJpYUNvdW50XCI+XG4gICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cImFjY2VudFwiPmZpbHRlcl9saXN0X2FsdDwvbWF0LWljb24+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24tc2Vjb25kYXJ5XCIgc3R5bGU9XCJsZWZ0OiAxNnB4OyB0b3A6IDVweDsgZm9udC13ZWlnaHQ6IGJvbGQ7XCI+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDwhLS0gc2hvdyBmaWx0ZXIgLS0+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiZmlsdGVyRXhwYW5zaW9uUGFuZWwudG9nZ2xlKClcIj5cbiAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZmlsdGVyQ3JpdGVyaWFDb3VudDsgZWxzZSBlbXB0eUZpbHRlclwiXG4gICAgICAgICAgICAgICAgICBbbWF0QmFkZ2VdPVwiZmlsdGVyQ3JpdGVyaWFDb3VudFwiXG4gICAgICAgICAgICAgICAgICBtYXRCYWRnZUNvbG9yPVwiYWNjZW50XCJcbiAgICAgICAgICAgICAgICAgIG1hdEJhZGdlU2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgIG1hdEJhZGdlUG9zaXRpb249XCJhYm92ZSBhZnRlclwiPmZpbHRlcl9saXN0X2FsdFxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2VtcHR5RmlsdGVyPlxuICAgICAgICAgIDxtYXQtaWNvbj5maWx0ZXJfbGlzdF9hbHQ8L21hdC1pY29uPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDwhLS0gc2F2ZSAtLT5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uICpuZ0lmPVwibW9iaWxlXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEoZGlydHlTdWJqZWN0fGFzeW5jKVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzYXZlKClcIj5cbiAgICAgICAgPG1hdC1pY29uPnNhdmU8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDwhLS0gc3RhcnQvc3RvcCB0aW1lciB0byBhdXRvLWxvYWQgZGF0YSAtLT5cbiAgICAgIDxpb24tYnV0dG9uICpuZ0lmPVwiIXRpbWVyXCIgKGNsaWNrKT1cInN0YXJ0VGltZXIoKVwiPlN0YXJ0IHJlbG9hZDwvaW9uLWJ1dHRvbj5cbiAgICAgIDxpb24tYnV0dG9uICpuZ0lmPVwidGltZXJcIiAoY2xpY2spPVwic3RvcFRpbWVyKClcIiBjb2xvcj1cImFjY2VudFwiPlN0b3AgcmVsb2FkPC9pb24tYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBpZiByb3cgc2VsZWN0aW9uIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSAjaGFzU2VsZWN0aW9uPlxuXG4gICAgICA8IS0tIGRlbGV0ZSAtLT5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwiY2FuRWRpdFwiIFt0aXRsZV09XCInQ09NTU9OLkJUTl9ERUxFVEUnfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVTZWxlY3Rpb24oJGV2ZW50KVwiPlxuICAgICAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8IS0tIGR1cGxpY2F0ZSAtLT5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwiY2FuRWRpdCAmJiBzZWxlY3Rpb24uc2VsZWN0ZWQgfCBpc0FycmF5TGVuZ3RoOiB7ZXF1YWxzOiAxfVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9EVVBMSUNBVEUnfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJkdXBsaWNhdGVSb3coJGV2ZW50LCBzZWxlY3Rpb24uc2VsZWN0ZWRbMF0pXCI+XG4gICAgICAgIDxtYXQtaWNvbj5maWxlX2NvcHk8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9pb24tYnV0dG9ucz5cbjwvYXBwLXRvb2xiYXI+XG48aW9uLWNvbnRlbnQgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuXG4gIDxpb24tcmVmcmVzaGVyIHNsb3Q9XCJmaXhlZFwiICpuZ0lmPVwibW9iaWxlXCIgKGlvblJlZnJlc2gpPVwiZG9SZWZyZXNoKCRldmVudClcIj5cbiAgICA8aW9uLXJlZnJlc2hlci1jb250ZW50PjwvaW9uLXJlZnJlc2hlci1jb250ZW50PlxuICA8L2lvbi1yZWZyZXNoZXI+XG5cbiAgPCEtLSBlcnJvciAtLT5cbiAgPGlvbi1pdGVtICpuZ0lmPVwibW9iaWxlICYmIGVycm9yXCIgbGluZXM9XCJub25lXCIgQHNsaWRlVXBEb3duQW5pbWF0aW9uPlxuICAgIDxpb24taWNvbiBjb2xvcj1cImRhbmdlclwiIHNsb3Q9XCJzdGFydFwiIG5hbWU9XCJhbGVydC1jaXJjbGVcIj48L2lvbi1pY29uPlxuICAgIDxpb24tbGFiZWwgY29sb3I9XCJkYW5nZXJcIiBjbGFzcz1cImVycm9yXCIgW2lubmVySFRNTF09XCJlcnJvcnx0cmFuc2xhdGVcIj48L2lvbi1sYWJlbD5cbiAgPC9pb24taXRlbT5cblxuICA8IS0tIHNlYXJjaCAtLT5cbiAgPG1hdC1leHBhbnNpb24tcGFuZWwgI2ZpbHRlckV4cGFuc2lvblBhbmVsIGNsYXNzPVwiZmlsdGVyLXBhbmVsIGZpbHRlci1wYW5lbC1mbG9hdGluZ1wiPlxuICAgIDxmb3JtIGNsYXNzPVwiZm9ybS1jb250YWluZXIgaW9uLXBhZGRpbmctdG9wXCIgW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCIgKG5nU3VibWl0KT1cImFwcGx5RmlsdGVyQW5kQ2xvc2VQYW5lbCgkZXZlbnQpXCI+XG5cbiAgICAgIDxpb24tZ3JpZD5cbiAgICAgICAgPGlvbi1yb3c+XG4gICAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgICA8IS0tIHNlYXJjaCB0ZXh0IC0tPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8aW9uLWljb24gbWF0UHJlZml4IG5hbWU9XCJzZWFyY2hcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNlYXJjaFRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInVEFCTEUuVEVTVElORy5TRUFSQ0hfVEVYVCd8dHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJDb250cm9sVmFsdWUoJGV2ZW50LCBmaWx0ZXJGb3JtLmNvbnRyb2xzLnNlYXJjaFRleHQpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cImZpbHRlckZvcm0uY29udHJvbHMuc2VhcmNoVGV4dC5kaXNhYmxlZCB8fCAhZmlsdGVyRm9ybS5jb250cm9scy5zZWFyY2hUZXh0LnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgPC9pb24tcm93PlxuICAgICAgPC9pb24tZ3JpZD5cbiAgICA8L2Zvcm0+XG5cbiAgICA8bWF0LWFjdGlvbi1yb3c+XG4gICAgICA8IS0tIENvdW50ZXIgIC0tPlxuICAgICAgPGlvbi1sYWJlbCBbaGlkZGVuXT1cIihsb2FkaW5nU3ViamVjdHxhc3luYykgfHwgZmlsdGVyRm9ybS5kaXJ0eVwiXG4gICAgICAgICAgICAgICAgIFtjb2xvcl09XCJlbXB0eSAmJiAnZGFuZ2VyJ1wiXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgICAgICAge3sgKHRvdGFsUm93Q291bnQgPyAnQ09NTU9OLlJFU1VMVF9DT1VOVCcgOiAnQ09NTU9OLk5PX1JFU1VMVCcpIHwgdHJhbnNsYXRlOiB7XG4gICAgICAgIGNvdW50OiAodG90YWxSb3dDb3VudCB8XG4gICAgICAgICAgbnVtYmVyRm9ybWF0KVxuICAgICAgfSB9fVxuICAgICAgPC9pb24tbGFiZWw+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXNwYWNlclwiPjwvZGl2PlxuXG4gICAgICA8IS0tIENsb3NlIHBhbmVsIC0tPlxuICAgICAgPGlvbi1idXR0b24gbWF0LWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZpbHRlckV4cGFuc2lvblBhbmVsLmNsb3NlKClcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImxvYWRpbmdTdWJqZWN0fGFzeW5jXCI+XG4gICAgICAgIDxpb24tdGV4dCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9DTE9TRTwvaW9uLXRleHQ+XG4gICAgICA8L2lvbi1idXR0b24+XG5cbiAgICAgIDwhLS0gU2VhcmNoIGJ1dHRvbiAtLT5cbiAgICAgIDxpb24tYnV0dG9uIG1hdC1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJmaWx0ZXJGb3JtLmRpcnR5ID8gJ3RlcnRpYXJ5JyA6ICdkYXJrJ1wiXG4gICAgICAgICAgICAgICAgICBbZmlsbF09XCJmaWx0ZXJGb3JtLmRpcnR5ID8gJ3NvbGlkJyA6ICdjbGVhcidcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5RmlsdGVyQW5kQ2xvc2VQYW5lbCgkZXZlbnQpXCI+XG4gICAgICAgIDxpb24tdGV4dCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9BUFBMWTwvaW9uLXRleHQ+XG4gICAgICA8L2lvbi1idXR0b24+XG4gICAgPC9tYXQtYWN0aW9uLXJvdz5cbiAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuXG4gIDwhLS0gdGFibGUgLS0+XG4gIDxkaXYgW2NsYXNzLnRhYmxlLWNvbnRhaW5lcl09XCIhZW5hYmxlSW5maW5pdGVTY3JvbGxcIj5cbiAgICA8dGFibGUgI3RhYmxlIG1hdC10YWJsZSBtYXRTb3J0IG1hdFNvcnREaXNhYmxlQ2xlYXJcbiAgICAgICAgICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXG4gICAgICAgICAgIFttYXRTb3J0QWN0aXZlXT1cImRlZmF1bHRTb3J0QnlcIlxuICAgICAgICAgICBbbWF0U29ydERpcmVjdGlvbl09XCJkZWZhdWx0U29ydERpcmVjdGlvblwiXG4gICAgICAgICAgIFt0cmFja0J5XT1cInRyYWNrQnlGblwiPlxuXG4gICAgICA8IS0tIGdyb3VwIGhlYWRlciBjZWxscyAtLT5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ0b3Atc3RhcnRcIiBbc3RpY2t5XT1cInVzZVN0aWNreVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIiFjYW5FZGl0XCIgW2F0dHIuY29sc3Bhbl09XCIyXCI+XG4gICAgICAgICAgPCEtLSBzdGFydCBzcGFjZXIgLS0+XG4gICAgICAgIDwvdGg+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJncm91cC0xXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2F0dHIuY29sc3Bhbl09XCIzXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZXNtb2tlOyBtYXJnaW4tYm90dG9tOiAtMXB4O1wiPlxuICAgICAgICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPnt7aTE4bkNvbHVtblByZWZpeCArICdHUk9VUF8xJ319PC9pb24tbGFiZWw+XG4gICAgICAgIDwvdGg+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJncm91cC0yXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2F0dHIuY29sc3Bhbl09XCIzXCI+XG4gICAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+e3tpMThuQ29sdW1uUHJlZml4ICsgJ0dST1VQXzInfX08L2lvbi1sYWJlbD5cbiAgICAgICAgPC90aD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInRvcC1lbmRcIiA+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgPCEtLSBlbmQgc3BhY2VyIC0tPlxuICAgICAgICA8L3RoPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCIgW3N0aWNreV09XCJ1c2VTdGlja3lcIiBbY2xhc3MubWF0LWNvbHVtbi1zdGlja3ldPVwidXNlU3RpY2t5XCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiIWNhbkVkaXRcIj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IChjaGFuZ2UpPVwiJGV2ZW50ID8gbWFzdGVyVG9nZ2xlKCkgOiBudWxsXCIgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgaXNBbGxTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmICFpc0FsbFNlbGVjdGVkKClcIj5cbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIiFjYW5FZGl0XCI+XG4gICAgICAgICAgPG1hdC1jaGVja2JveCAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKGNoYW5nZSk9XCIkZXZlbnQgPyBzZWxlY3Rpb24udG9nZ2xlKHJvdykgOiBudWxsXCIgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiPlxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gSWQgY29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJpZFwiIFtzdGlja3ldPVwidXNlU3RpY2t5XCIgW2NsYXNzLm1hdC1jb2x1bW4tc3RpY2t5XT1cInVzZVN0aWNreVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5cbiAgICAgICAgICA8aW9uLWxhYmVsPiM8L2lvbi1sYWJlbD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPnt7IHJvdy5jdXJyZW50RGF0YT8uaWQgfX08L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gTGFiZWwgY29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJsYWJlbFwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5cbiAgICAgICAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT5UQUJMRS5URVNUSU5HLkxBQkVMPC9pb24tbGFiZWw+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiAoY2xpY2spPVwiZm9jdXNDb2x1bW49J2xhYmVsJ1wiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVwibmV2ZXJcIj5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJyb3cudmFsaWRhdG9yLmNvbnRyb2xzWydsYWJlbCddXCJcbiAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1RBQkxFLlRFU1RJTkcuTEFCRUwnfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgW2FwcEF1dG9mb2N1c109XCJyb3cuZWRpdGluZyAmJiBmb2N1c0NvbHVtbiA9PT0gJ2xhYmVsJ1wiXG4gICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIiFyb3cuZWRpdGluZ1wiPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInJvdy52YWxpZGF0b3IuY29udHJvbHNbJ2xhYmVsJ10uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiB0cmFuc2xhdGU+RVJST1IuRklFTERfUkVRVUlSRUQ8L21hdC1lcnJvcj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gTmFtZSBjb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIm5hbWVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+XG4gICAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+VEFCTEUuVEVTVElORy5OQU1FPC9pb24tbGFiZWw+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBbY2xhc3MubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRdPVwiIXJvdy5lZGl0aW5nXCJcbiAgICAgICAgICAgIChjbGljayk9XCJmb2N1c0NvbHVtbj0nbmFtZSdcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cIm5ldmVyXCI+XG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwicm93LnZhbGlkYXRvcj8uY29udHJvbHMubmFtZVwiIFtwbGFjZWhvbGRlcl09XCInVEFCTEUuVEVTVElORy5OQU1FJ3x0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgIFthcHBBdXRvZm9jdXNdPVwicm93LmVkaXRpbmcgJiYgZm9jdXNDb2x1bW4gPT09ICduYW1lJ1wiXG4gICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIiFyb3cuZWRpdGluZ1wiPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInJvdy52YWxpZGF0b3I/LmNvbnRyb2xzLm5hbWUuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiB0cmFuc2xhdGU+RVJST1IuRklFTERfUkVRVUlSRUQ8L21hdC1lcnJvcj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gTGV2ZWwgY29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJsZXZlbElkXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlxuICAgICAgICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPlRBQkxFLlRFU1RJTkcuTEVWRUxfSUQ8L2lvbi1sYWJlbD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIFtjbGFzcy5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZF09XCIhcm93LmVkaXRpbmdcIj5cbiAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZS1maWVsZCBmbG9hdExhYmVsPVwibmV2ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJyb3cudmFsaWRhdG9yLmNvbnRyb2xzLmxldmVsSWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb25maWddPVwiYXV0b2NvbXBsZXRlRmllbGRzLmxldmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiIXJvdy5lZGl0aW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiPlxuICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZS1maWVsZD5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIFN0YXR1cyBjb2x1bW4gIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzdGF0dXNJZFwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5VU0VSLlNUQVRVUzwvc3Bhbj5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIFtjbGFzcy5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZF09XCIhcm93LmVkaXRpbmdcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cIm5ldmVyXCI+XG4gICAgICAgICAgICA8aW9uLWljb24gbWF0UHJlZml4ICpuZ0lmPVwicm93LnZhbGlkYXRvci5jb250cm9sc1snc3RhdHVzSWQnXS52YWx1ZSAmZ3Q7PTBcIiBbbmFtZV09XCJzdGF0dXNCeUlkW3Jvdy52YWxpZGF0b3IuY29udHJvbHNbJ3N0YXR1c0lkJ10udmFsdWVdPy5pY29uXCI+PC9pb24taWNvbj5cblxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sXT1cInJvdy52YWxpZGF0b3IuY29udHJvbHNbJ3N0YXR1c0lkJ11cIiBbcGxhY2Vob2xkZXJdPVwiaTE4bkNvbHVtblByZWZpeCArICdTVEFUVVNfSUQnfHRyYW5zbGF0ZVwiPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93LnZhbGlkYXRvci5jb250cm9sc1snc3RhdHVzSWQnXS52YWx1ZSAmZ3Q7PTBcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHN0YXR1c0J5SWRbcm93LnZhbGlkYXRvci5jb250cm9sc1snc3RhdHVzSWQnXS52YWx1ZV0/LmxhYmVsIHwgdHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdC10cmlnZ2VyPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzdGF0dXNMaXN0XCIgW3ZhbHVlXT1cIml0ZW0uaWRcIj5cbiAgICAgICAgICAgICAgICA8aW9uLWljb24gW25hbWVdPVwiaXRlbS5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICB7eyBpdGVtLmxhYmVsIHx0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInJvdy52YWxpZGF0b3IuY29udHJvbHNbJ3N0YXR1c0lkJ10uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiB0cmFuc2xhdGU+RVJST1IuRklFTERfUkVRVUlSRUQ8L21hdC1lcnJvcj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgPCEtLSBDcmVhdGlvbiBkYXRlIGNvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwidXBkYXRlRGF0ZVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5cbiAgICAgICAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT5UQUJMRS5URVNUSU5HLlVQREFURV9EQVRFPC9pb24tbGFiZWw+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBjbGFzcz1cIm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkXCI+XG4gICAgICAgICAgPGlvbi10ZXh0IGNsYXNzPVwiaW9uLXRleHQtZW5kXCIgY29sb3I9XCJtZWRpdW1cIiAqbmdJZj1cInJvdy5pZCE9PS0xXCI+XG4gICAgICAgICAgICA8c21hbGwgW21hdFRvb2x0aXBdPVwiJ1RBQkxFLlRFU1RJTkcuQ1JFQVRJT05fREFURSd8dHJhbnNsYXRlXCIgKm5nSWY9XCJyb3cuY3VycmVudERhdGEuY3JlYXRpb25EYXRlOyBsZXQgY3JlYXRpb25EYXRlXCI+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2FsZW5kYXJcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICB7eyBjcmVhdGlvbkRhdGUgfCBkYXRlRm9ybWF0OiB7dGltZTogdHJ1ZX0gfX1cbiAgICAgICAgICAgIDwvc21hbGw+PGJyLz5cbiAgICAgICAgICAgIDxzbWFsbCBbbWF0VG9vbHRpcF09XCInVEFCTEUuVEVTVElORy5VUERBVEVfREFURSd8dHJhbnNsYXRlXCIgKm5nSWY9XCJyb3cuY3VycmVudERhdGEudXBkYXRlRGF0ZTsgbGV0IHVwZGF0ZURhdGVcIj5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJ0aW1lLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICB7eyB1cGRhdGVEYXRlIHwgZGF0ZUZvcm1hdDoge3RpbWU6IHRydWV9IH19XG4gICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBDb21tZW50IGNvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiY29tbWVudHNcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT5UQUJMRS5URVNUSU5HLkNPTU1FTlRTPC9pb24tbGFiZWw+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cIm5ldmVyXCIgKm5nSWY9XCJyb3cuZWRpdGluZzsgZWxzZSBpY29uQ29tbWVudFwiPlxuICAgICAgICAgICAgPCEtLTx0ZXh0YXJlYSBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwicm93LnZhbGlkYXRvcj8uY29udHJvbHMuY29tbWVudHNcIlxuICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInVEFCTEUuVEVTVElORy5DT01NRU5UUyd8dHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiIXJvdy5lZGl0aW5nXCI+PC90ZXh0YXJlYT4tLT5cblxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cInJvdy52YWxpZGF0b3I/LmNvbnRyb2xzLmNvbW1lbnRzXCJcbiAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1RBQkxFLlRFU1RJTkcuQ09NTUVOVFMnfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIiFyb3cuZWRpdGluZ1wiPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2ljb25Db21tZW50PlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29tbWVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyb3cudmFsaWRhdG9yPy5jb250cm9scy5jb21tZW50cy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cInJvdy52YWxpZGF0b3I/LmNvbnRyb2xzLmNvbW1lbnRzLnZhbHVlXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gQWN0aW9ucyBidXR0b25zIGNvbHVtbiAtLT5cbiAgICAgIDxhcHAtYWN0aW9ucy1jb2x1bW4gW3N0aWNreUVuZF09XCJ0cnVlXCIgW2NhbkNhbmNlbF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zQ2xpY2spPVwib3BlblNlbGVjdENvbHVtbnNNb2RhbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhbmNlbE9yRGVsZXRlQ2xpY2spPVwiY2FuY2VsT3JEZWxldGUoJGV2ZW50LmV2ZW50LCAkZXZlbnQucm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb25maXJtQW5kQWRkQ2xpY2spPVwiY29uZmlybUFuZEFkZCgkZXZlbnQuZXZlbnQsICRldmVudC5yb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhY2t3YXJkKT1cImNvbmZpcm1BbmRCYWNrd2FyZCgkZXZlbnQuZXZlbnQsICRldmVudC5yb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcndhcmQpPVwiY29uZmlybUFuZEZvcndhcmQoJGV2ZW50LmV2ZW50LCAkZXZlbnQucm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsVGVtcGxhdGVdPVwiY2VsbEluamVjdGlvblwiPlxuXG4gICAgICAgIDwhLS0gY2VsbCBpbmplY3Rpb24tLT5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsSW5qZWN0aW9uIGxldC1yb3c+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cuZWRpdGluZyAmJiAhcm93LnZhbGlkYXRvci5kaXJ0eVwiPi08L3NwYW4+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDwvYXBwLWFjdGlvbnMtY29sdW1uPlxuXG4gICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImdyb3VwQ29sdW1ucztcIiBjbGFzcz1cIm1hdC10b29sYmFyXCI+PC90cj5cbiAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uczsgc3RpY2t5OiB0cnVlXCI+PC90cj5cbiAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zO1wiXG4gICAgICAgICAgW2NsYXNzLm1hdC1yb3ctc2VsZWN0ZWRdPVwicm93LmVkaXRpbmdcIlxuICAgICAgICAgIFtjbGFzcy5tYXQtcm93LWVycm9yXT1cInJvdy52YWxpZGF0b3I/LmludmFsaWRcIlxuICAgICAgICAgIFtjbGFzcy5tYXQtcm93LWRpc2FibGVkXT1cIiFyb3cuZWRpdGluZ1wiXG4gICAgICAgICAgW2NsYXNzLm1hdC1yb3ctZGlydHldPVwicm93LnZhbGlkYXRvcj8uZGlydHlcIlxuICAgICAgICAgIChjbGljayk9XCJjbGlja1JvdygkZXZlbnQsIHJvdylcIlxuICAgICAgICAgIChrZXlkb3duLmVzY2FwZSk9XCJlc2NhcGVFZGl0aW5nUm93KCRldmVudClcIlxuICAgICAgICAgIFtjZGtUcmFwRm9jdXNdPVwicm93LnZhbGlkYXRvcj8uaW52YWxpZFwiPjwvdHI+XG4gICAgPC90YWJsZT5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkaW5nU3ViamVjdHxhc3luYzsgZWxzZSBub1Jlc3VsdFwiPlxuICAgICAgPGlvbi1pdGVtPlxuICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgYW5pbWF0ZWQ+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctdGVtcGxhdGUgI25vUmVzdWx0PlxuICAgICAgPGlvbi1pdGVtICpuZ0lmPVwidG90YWxSb3dDb3VudCA9PT0gMFwiPlxuICAgICAgICA8aW9uLXRleHQgY29sb3I9XCJkYW5nZXJcIiBjbGFzcz1cInRleHQtaXRhbGljXCIgdHJhbnNsYXRlPkNPTU1PTi5OT19SRVNVTFQ8L2lvbi10ZXh0PlxuICAgICAgPC9pb24taXRlbT5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPGlvbi1pbmZpbml0ZS1zY3JvbGwgKm5nSWY9XCJlbmFibGVJbmZpbml0ZVNjcm9sbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3RocmVzaG9sZF09XCJtb2JpbGUgPyAnMTAlJyA6ICcyJSdcIiBwb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGlvbkluZmluaXRlKT1cImZldGNoTW9yZSgkZXZlbnQpXCI+XG4gICAgICA8aW9uLWluZmluaXRlLXNjcm9sbC1jb250ZW50XG4gICAgICAgIGxvYWRpbmdTcGlubmVyPVwiY2lyY2xlc1wiXG4gICAgICAgIFtsb2FkaW5nVGV4dF09XCInQ09NTU9OLkxPQURJTkdfRE9UUyd8dHJhbnNsYXRlXCI+XG4gICAgICA8L2lvbi1pbmZpbml0ZS1zY3JvbGwtY29udGVudD5cbiAgICA8L2lvbi1pbmZpbml0ZS1zY3JvbGw+XG4gIDwvZGl2PlxuPC9pb24tY29udGVudD5cblxuPGlvbi1mb290ZXI+XG4gIDwhLS0gUGFnaW5hdG9yICAtLT5cbiAgPG1hdC1wYWdpbmF0b3IgKm5nSWY9XCIhZW5hYmxlSW5maW5pdGVTY3JvbGxcIlxuICAgICAgICAgICAgICAgICBbbGVuZ3RoXT1cInRvdGFsUm93Q291bnRcIiBbcGFnZVNpemVdPVwiZGVmYXVsdFBhZ2VTaXplXCIgW3BhZ2VTaXplT3B0aW9uc109XCJkZWZhdWx0UGFnZVNpemVPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXQtcGFnaW5hdG9yLWZvb3RlclwiXG4gICAgICAgICAgICAgICAgIHNob3dGaXJzdExhc3RCdXR0b25zPlxuICA8L21hdC1wYWdpbmF0b3I+XG5cbiAgPGFwcC1mb3JtLWJ1dHRvbnMtYmFyICpuZ0lmPVwiY2FuRWRpdCAmJiAhbW9iaWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvbkNhbmNlbCk9XCJsb2FkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2F2ZSk9XCJzYXZlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIihsb2FkaW5nU3ViamVjdHxhc3luYykgfHwgIWRpcnR5XCI+XG4gICAgPCEtLSBlcnJvciAtLT5cbiAgICA8aW9uLWl0ZW0gKm5nSWY9XCJlcnJvciR8YXN5bmNcIiBsaW5lcz1cIm5vbmVcIj5cbiAgICAgIDxpb24taWNvbiBjb2xvcj1cImRhbmdlclwiIHNsb3Q9XCJzdGFydFwiIG5hbWU9XCJhbGVydC1jaXJjbGVcIj48L2lvbi1pY29uPlxuICAgICAgPGlvbi1sYWJlbCBjb2xvcj1cImRhbmdlclwiIFtpbm5lckhUTUxdPVwiZXJyb3J8dHJhbnNsYXRlXCI+PC9pb24tbGFiZWw+XG4gICAgPC9pb24taXRlbT5cbiAgPC9hcHAtZm9ybS1idXR0b25zLWJhcj5cbjwvaW9uLWZvb3Rlcj5cblxuPGlvbi1mYWIgc2xvdD1cImZpeGVkXCIgdmVydGljYWw9XCJib3R0b21cIiBob3Jpem9udGFsPVwiZW5kXCJcbiAgICAgICAgICpuZ0lmPVwiY2FuRWRpdCAmJiBtb2JpbGVcIj5cbiAgPGlvbi1mYWItYnV0dG9uIGNvbG9yPVwidGVydGlhcnlcIiAoY2xpY2spPVwiYWRkUm93KCRldmVudClcIj5cbiAgICA8aW9uLWljb24gbmFtZT1cImFkZFwiPjwvaW9uLWljb24+XG4gIDwvaW9uLWZhYi1idXR0b24+XG48L2lvbi1mYWI+XG4iXX0=
|
|
@@ -8,16 +8,16 @@ import * as i0 from "@angular/core";
|
|
|
8
8
|
import * as i1 from "@ngx-translate/core";
|
|
9
9
|
export class TableTestingModule {
|
|
10
10
|
}
|
|
11
|
-
TableTestingModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.
|
|
12
|
-
TableTestingModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.2.
|
|
11
|
+
TableTestingModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: TableTestingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
12
|
+
TableTestingModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.2.8", ngImport: i0, type: TableTestingModule, declarations: [TableTestPage], imports: [CommonModule,
|
|
13
13
|
SharedModule,
|
|
14
14
|
CoreModule, i1.TranslateModule], exports: [TableTestPage,
|
|
15
15
|
TranslateModule] });
|
|
16
|
-
TableTestingModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.2.
|
|
16
|
+
TableTestingModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: TableTestingModule, imports: [CommonModule,
|
|
17
17
|
SharedModule,
|
|
18
18
|
CoreModule,
|
|
19
19
|
TranslateModule.forChild(), TranslateModule] });
|
|
20
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.
|
|
20
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: TableTestingModule, decorators: [{
|
|
21
21
|
type: NgModule,
|
|
22
22
|
args: [{
|
|
23
23
|
imports: [
|