tin-spa 2.13.15 → 9.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/bundles/tin-spa.umd.js +6694 -0
- package/bundles/tin-spa.umd.js.map +1 -0
- package/bundles/tin-spa.umd.min.js +16 -0
- package/bundles/tin-spa.umd.min.js.map +1 -0
- package/esm2015/lib/classes/Classes.js +254 -0
- package/esm2015/lib/classes/TinCore.js +137 -0
- package/esm2015/lib/components/activity/activity.component.js +92 -0
- package/esm2015/lib/components/attach/attach.component.js +181 -0
- package/esm2015/lib/components/change-password/change-password.component.js +179 -0
- package/esm2015/lib/components/check/check.component.js +69 -0
- package/esm2015/lib/components/chips/chips.component.js +107 -0
- package/esm2015/lib/components/create-account/create-account.component.js +160 -0
- package/esm2015/lib/components/date/date.component.js +66 -0
- package/esm2015/lib/components/datetime/datetime.component.js +57 -0
- package/esm2015/lib/components/filter/filter.component.js +64 -0
- package/esm2015/lib/components/html/html.component.js +102 -0
- package/esm2015/lib/components/label/label.component.js +117 -0
- package/esm2015/lib/components/loader/loader.component.js +53 -0
- package/esm2015/lib/components/login/login.component.js +240 -0
- package/esm2015/lib/components/logs/logs.component.js +195 -0
- package/esm2015/lib/components/message/messageDialog.component.js +142 -0
- package/esm2015/lib/components/money/currency-input-mask.directive.js +187 -0
- package/esm2015/lib/components/money/currency-input-mask.module.js +30 -0
- package/esm2015/lib/components/money/money.component.js +152 -0
- package/esm2015/lib/components/nav-menu/nav-menu.component.js +204 -0
- package/esm2015/lib/components/option/option.component.js +129 -0
- package/esm2015/lib/components/profile/profile.component.js +198 -0
- package/esm2015/lib/components/recover-account/recover-account.component.js +74 -0
- package/esm2015/lib/components/roles/addRoleDialog.component.js +132 -0
- package/esm2015/lib/components/roles/roles.component.js +211 -0
- package/esm2015/lib/components/select/select.component.js +133 -0
- package/esm2015/lib/components/settings/settings.component.js +118 -0
- package/esm2015/lib/components/signup/signup.component.js +139 -0
- package/esm2015/lib/components/steps/steps.component.js +114 -0
- package/esm2015/lib/components/table/table.component.js +375 -0
- package/esm2015/lib/components/text/text.component.js +240 -0
- package/esm2015/lib/components/tiles/tiles.component.js +95 -0
- package/esm2015/lib/components/timeout/timeout.component.js +133 -0
- package/esm2015/lib/components/tin-spa.component.js +26 -0
- package/esm2015/lib/components/users/users.component.js +373 -0
- package/esm2015/lib/components/viewer/viewer.component.js +92 -0
- package/esm2015/lib/components/viewer/viewerDialog.component.js +131 -0
- package/esm2015/lib/dnd.directive.js +56 -0
- package/esm2015/lib/modules/spa-admin.module.js +81 -0
- package/esm2015/lib/modules/spa-index.module.js +58 -0
- package/esm2015/lib/modules/spa-mat.module.js +68 -0
- package/esm2015/lib/modules/spa-user.module.js +55 -0
- package/esm2015/lib/services/auth.service.js +142 -0
- package/esm2015/lib/services/data.service.js +111 -0
- package/esm2015/lib/services/export.service.js +29 -0
- package/esm2015/lib/services/http.service.js +79 -0
- package/esm2015/lib/services/loader-interceptor.service.js +77 -0
- package/esm2015/lib/services/loader.service.js +17 -0
- package/esm2015/lib/services/log.service.js +76 -0
- package/esm2015/lib/services/message.service.js +52 -0
- package/esm2015/lib/services/storage.service.js +43 -0
- package/esm2015/lib/services/tin-spa.service.js +14 -0
- package/esm2015/lib/tin-spa.module.js +156 -0
- package/esm2015/public-api.js +56 -0
- package/esm2015/tin-spa.js +5 -0
- package/esm5/lib/classes/Classes.js +313 -0
- package/esm5/lib/classes/TinCore.js +164 -0
- package/esm5/lib/components/activity/activity.component.js +94 -0
- package/esm5/lib/components/attach/attach.component.js +195 -0
- package/esm5/lib/components/change-password/change-password.component.js +182 -0
- package/esm5/lib/components/check/check.component.js +71 -0
- package/esm5/lib/components/chips/chips.component.js +110 -0
- package/esm5/lib/components/create-account/create-account.component.js +163 -0
- package/esm5/lib/components/date/date.component.js +68 -0
- package/esm5/lib/components/datetime/datetime.component.js +59 -0
- package/esm5/lib/components/filter/filter.component.js +66 -0
- package/esm5/lib/components/html/html.component.js +104 -0
- package/esm5/lib/components/label/label.component.js +119 -0
- package/esm5/lib/components/loader/loader.component.js +56 -0
- package/esm5/lib/components/login/login.component.js +244 -0
- package/esm5/lib/components/logs/logs.component.js +198 -0
- package/esm5/lib/components/message/messageDialog.component.js +144 -0
- package/esm5/lib/components/money/currency-input-mask.directive.js +193 -0
- package/esm5/lib/components/money/currency-input-mask.module.js +34 -0
- package/esm5/lib/components/money/money.component.js +154 -0
- package/esm5/lib/components/nav-menu/nav-menu.component.js +207 -0
- package/esm5/lib/components/option/option.component.js +131 -0
- package/esm5/lib/components/profile/profile.component.js +203 -0
- package/esm5/lib/components/recover-account/recover-account.component.js +77 -0
- package/esm5/lib/components/roles/addRoleDialog.component.js +135 -0
- package/esm5/lib/components/roles/roles.component.js +218 -0
- package/esm5/lib/components/select/select.component.js +136 -0
- package/esm5/lib/components/settings/settings.component.js +122 -0
- package/esm5/lib/components/signup/signup.component.js +142 -0
- package/esm5/lib/components/steps/steps.component.js +128 -0
- package/esm5/lib/components/table/table.component.js +378 -0
- package/esm5/lib/components/text/text.component.js +244 -0
- package/esm5/lib/components/tiles/tiles.component.js +97 -0
- package/esm5/lib/components/timeout/timeout.component.js +136 -0
- package/esm5/lib/components/tin-spa.component.js +25 -0
- package/esm5/lib/components/users/users.component.js +380 -0
- package/esm5/lib/components/viewer/viewer.component.js +94 -0
- package/esm5/lib/components/viewer/viewerDialog.component.js +133 -0
- package/esm5/lib/dnd.directive.js +58 -0
- package/esm5/lib/modules/spa-admin.module.js +85 -0
- package/esm5/lib/modules/spa-index.module.js +62 -0
- package/esm5/lib/modules/spa-mat.module.js +72 -0
- package/esm5/lib/modules/spa-user.module.js +59 -0
- package/esm5/lib/services/auth.service.js +145 -0
- package/esm5/lib/services/data.service.js +113 -0
- package/esm5/lib/services/export.service.js +31 -0
- package/esm5/lib/services/http.service.js +81 -0
- package/esm5/lib/services/loader-interceptor.service.js +80 -0
- package/esm5/lib/services/loader.service.js +19 -0
- package/esm5/lib/services/log.service.js +114 -0
- package/esm5/lib/services/message.service.js +54 -0
- package/esm5/lib/services/storage.service.js +76 -0
- package/esm5/lib/services/tin-spa.service.js +17 -0
- package/esm5/lib/tin-spa.module.js +160 -0
- package/esm5/public-api.js +56 -0
- package/esm5/tin-spa.js +5 -0
- package/fesm2015/tin-spa.js +6204 -0
- package/fesm2015/tin-spa.js.map +1 -0
- package/fesm5/tin-spa.js +6453 -0
- package/fesm5/tin-spa.js.map +1 -0
- package/lib/classes/Classes.d.ts +228 -375
- package/lib/classes/TinCore.d.ts +11 -43
- package/lib/components/activity/activity.component.d.ts +2 -2
- package/lib/components/attach/attach.component.d.ts +27 -15
- package/lib/{pages → components}/change-password/change-password.component.d.ts +4 -4
- package/lib/components/check/check.component.d.ts +3 -8
- package/lib/components/chips/chips.component.d.ts +2 -2
- package/lib/{pages → components}/create-account/create-account.component.d.ts +4 -8
- package/lib/components/date/date.component.d.ts +12 -24
- package/lib/components/datetime/datetime.component.d.ts +2 -6
- package/lib/components/filter/filter.component.d.ts +2 -7
- package/lib/components/html/html.component.d.ts +10 -11
- package/lib/components/label/label.component.d.ts +2 -4
- package/lib/components/loader/loader.component.d.ts +2 -2
- package/lib/components/login/login.component.d.ts +32 -0
- package/lib/components/logs/logs.component.d.ts +18 -0
- package/lib/components/message/messageDialog.component.d.ts +2 -2
- package/lib/components/money/currency-input-mask.directive.d.ts +2 -2
- package/lib/components/money/currency-input-mask.module.d.ts +2 -3
- package/lib/components/money/money.component.d.ts +3 -13
- package/lib/components/nav-menu/nav-menu.component.d.ts +4 -22
- package/lib/components/option/option.component.d.ts +3 -14
- package/lib/{pages → components}/profile/profile.component.d.ts +4 -6
- package/lib/{pages → components}/recover-account/recover-account.component.d.ts +3 -3
- package/lib/components/roles/addRoleDialog.component.d.ts +22 -0
- package/lib/components/roles/roles.component.d.ts +30 -0
- package/lib/components/select/select.component.d.ts +20 -20
- package/lib/{pages → components}/settings/settings.component.d.ts +3 -3
- package/lib/{pages → components}/signup/signup.component.d.ts +4 -4
- package/lib/components/steps/steps.component.d.ts +10 -19
- package/lib/components/table/table.component.d.ts +21 -84
- package/lib/components/text/text.component.d.ts +14 -36
- package/lib/components/tiles/tiles.component.d.ts +7 -21
- package/lib/components/timeout/timeout.component.d.ts +24 -0
- package/lib/components/tin-spa.component.d.ts +6 -3
- package/lib/{pages → components}/users/users.component.d.ts +18 -11
- package/lib/components/viewer/viewer.component.d.ts +5 -11
- package/lib/components/viewer/viewerDialog.component.d.ts +4 -6
- package/lib/dnd.directive.d.ts +11 -0
- package/lib/modules/spa-admin.module.d.ts +10 -10
- package/lib/modules/spa-index.module.d.ts +7 -8
- package/lib/modules/spa-mat.module.d.ts +2 -8
- package/lib/modules/spa-user.module.d.ts +6 -6
- package/lib/services/auth.service.d.ts +4 -16
- package/lib/services/data.service.d.ts +38 -0
- package/lib/services/export.service.d.ts +6 -2
- package/lib/services/http.service.d.ts +2 -2
- package/lib/services/loader-interceptor.service.d.ts +3 -4
- package/lib/services/loader.service.d.ts +2 -2
- package/lib/services/log.service.d.ts +3 -3
- package/lib/services/message.service.d.ts +3 -4
- package/lib/services/storage.service.d.ts +2 -2
- package/lib/services/tin-spa.service.d.ts +2 -2
- package/lib/tin-spa.module.d.ts +34 -83
- package/package.json +16 -24
- package/public-api.d.ts +16 -47
- package/esm2020/lib/classes/Classes.mjs +0 -112
- package/esm2020/lib/classes/LibClasses.mjs +0 -180
- package/esm2020/lib/classes/TinCore.mjs +0 -568
- package/esm2020/lib/components/activity/activity.component.mjs +0 -24
- package/esm2020/lib/components/alert/alert.component.mjs +0 -43
- package/esm2020/lib/components/attach/attach.component.mjs +0 -102
- package/esm2020/lib/components/capsules/capsules.component.mjs +0 -63
- package/esm2020/lib/components/cards/cards.component.mjs +0 -103
- package/esm2020/lib/components/check/check.component.mjs +0 -67
- package/esm2020/lib/components/chips/chips.component.mjs +0 -58
- package/esm2020/lib/components/date/date.component.mjs +0 -103
- package/esm2020/lib/components/datetime/datetime.component.mjs +0 -55
- package/esm2020/lib/components/email/email.component.mjs +0 -133
- package/esm2020/lib/components/filter/filter.component.mjs +0 -58
- package/esm2020/lib/components/form/form.component.mjs +0 -296
- package/esm2020/lib/components/html/html.component.mjs +0 -34
- package/esm2020/lib/components/label/label.component.mjs +0 -31
- package/esm2020/lib/components/list-dialog/list-dialog.component.mjs +0 -68
- package/esm2020/lib/components/loader/loader.component.mjs +0 -25
- package/esm2020/lib/components/message/messageDialog.component.mjs +0 -33
- package/esm2020/lib/components/money/currency-input-mask.directive.mjs +0 -185
- package/esm2020/lib/components/money/currency-input-mask.module.mjs +0 -28
- package/esm2020/lib/components/money/money.component.mjs +0 -137
- package/esm2020/lib/components/multi-select/multi-select.component.mjs +0 -165
- package/esm2020/lib/components/multi-text/multi-text.component.mjs +0 -208
- package/esm2020/lib/components/nav-menu/nav-menu.component.mjs +0 -88
- package/esm2020/lib/components/notes/notes.component.mjs +0 -62
- package/esm2020/lib/components/number/number.component.mjs +0 -131
- package/esm2020/lib/components/option/option.component.mjs +0 -92
- package/esm2020/lib/components/page/page.component.mjs +0 -101
- package/esm2020/lib/components/search/search.component.mjs +0 -36
- package/esm2020/lib/components/select/select.component.mjs +0 -75
- package/esm2020/lib/components/select-bitwise/select-bitwise.component.mjs +0 -87
- package/esm2020/lib/components/select-common/select-common.component.mjs +0 -206
- package/esm2020/lib/components/select-internal/select-internal.component.mjs +0 -75
- package/esm2020/lib/components/select-lite/select-lite.component.mjs +0 -18
- package/esm2020/lib/components/statuses/statuses.component.mjs +0 -44
- package/esm2020/lib/components/steps/steps.component.mjs +0 -112
- package/esm2020/lib/components/suffix/suffix.component.mjs +0 -70
- package/esm2020/lib/components/table/detailsDialog.component.mjs +0 -406
- package/esm2020/lib/components/table/table.component.mjs +0 -440
- package/esm2020/lib/components/table-action/table-action.component.mjs +0 -80
- package/esm2020/lib/components/table-header/table-header.component.mjs +0 -148
- package/esm2020/lib/components/table-internal/detailsDialog-internal.component.mjs +0 -406
- package/esm2020/lib/components/table-internal/table-internal.component.mjs +0 -441
- package/esm2020/lib/components/table-lite/detailsDialog-lite.component.mjs +0 -404
- package/esm2020/lib/components/table-lite/table-lite.component.mjs +0 -441
- package/esm2020/lib/components/table-row/table-row.component.mjs +0 -93
- package/esm2020/lib/components/tabs/tabs.component.mjs +0 -74
- package/esm2020/lib/components/text/text.component.mjs +0 -255
- package/esm2020/lib/components/tiles/tiles.component.mjs +0 -99
- package/esm2020/lib/components/tin-spa.component.mjs +0 -19
- package/esm2020/lib/components/viewer/viewer.component.mjs +0 -83
- package/esm2020/lib/components/viewer/viewerDialog.component.mjs +0 -95
- package/esm2020/lib/modules/admin/admin-routing.module.mjs +0 -71
- package/esm2020/lib/modules/admin/admin.module.mjs +0 -26
- package/esm2020/lib/modules/index/index-routing.module.mjs +0 -27
- package/esm2020/lib/modules/index/index.module.mjs +0 -26
- package/esm2020/lib/modules/spa-admin.module.mjs +0 -71
- package/esm2020/lib/modules/spa-index.module.mjs +0 -54
- package/esm2020/lib/modules/spa-mat.module.mjs +0 -84
- package/esm2020/lib/modules/spa-user.module.mjs +0 -47
- package/esm2020/lib/modules/user/user-routing.module.mjs +0 -23
- package/esm2020/lib/modules/user/user.module.mjs +0 -26
- package/esm2020/lib/pages/accounts/accountDialog.component.mjs +0 -56
- package/esm2020/lib/pages/accounts/accounts.component.mjs +0 -70
- package/esm2020/lib/pages/app-models/app-models.component.mjs +0 -56
- package/esm2020/lib/pages/approvals/approvals.component.mjs +0 -19
- package/esm2020/lib/pages/approvals-config/approvals-config.component.mjs +0 -165
- package/esm2020/lib/pages/bug/bug.component.mjs +0 -14
- package/esm2020/lib/pages/change-password/change-password.component.mjs +0 -92
- package/esm2020/lib/pages/create-account/create-account.component.mjs +0 -110
- package/esm2020/lib/pages/customers/customers.component.mjs +0 -21
- package/esm2020/lib/pages/departments/departments.component.mjs +0 -22
- package/esm2020/lib/pages/employees/employees.component.mjs +0 -20
- package/esm2020/lib/pages/grades/grades.component.mjs +0 -14
- package/esm2020/lib/pages/inventory/inventory.component.mjs +0 -99
- package/esm2020/lib/pages/inventory/quantityDialog.component.mjs +0 -53
- package/esm2020/lib/pages/invitations-table/invitations-table.component.mjs +0 -71
- package/esm2020/lib/pages/login/login.component.mjs +0 -166
- package/esm2020/lib/pages/logs/logs.component.mjs +0 -42
- package/esm2020/lib/pages/membership/membership.component.mjs +0 -44
- package/esm2020/lib/pages/notifications/notifications.component.mjs +0 -90
- package/esm2020/lib/pages/notifications-config/notifications-config.component.mjs +0 -113
- package/esm2020/lib/pages/plans/plans.component.mjs +0 -44
- package/esm2020/lib/pages/positions/positions.component.mjs +0 -21
- package/esm2020/lib/pages/profile/profile.component.mjs +0 -94
- package/esm2020/lib/pages/recover-account/recover-account.component.mjs +0 -46
- package/esm2020/lib/pages/roles/addRoleDialog.component.mjs +0 -60
- package/esm2020/lib/pages/roles/roles.component.mjs +0 -151
- package/esm2020/lib/pages/settings/settings.component.mjs +0 -54
- package/esm2020/lib/pages/signup/signup.component.mjs +0 -50
- package/esm2020/lib/pages/suppliers/suppliers.component.mjs +0 -22
- package/esm2020/lib/pages/tasks/tasks.component.mjs +0 -86
- package/esm2020/lib/pages/tenant-settings/tenant-settings.component.mjs +0 -228
- package/esm2020/lib/pages/tenants/tenants.component.mjs +0 -47
- package/esm2020/lib/pages/transactions/transactDialog.component.mjs +0 -80
- package/esm2020/lib/pages/transactions/transactions.component.mjs +0 -101
- package/esm2020/lib/pages/users/users.component.mjs +0 -167
- package/esm2020/lib/pages/welcome/welcome.component.mjs +0 -86
- package/esm2020/lib/pipes/camelToWords.pipe.mjs +0 -17
- package/esm2020/lib/select-context.directive.mjs +0 -23
- package/esm2020/lib/services/auth.service.mjs +0 -175
- package/esm2020/lib/services/button.service.mjs +0 -162
- package/esm2020/lib/services/condition.service.mjs +0 -32
- package/esm2020/lib/services/csv.service.mjs +0 -49
- package/esm2020/lib/services/datalib.service.mjs +0 -860
- package/esm2020/lib/services/dialog.service.mjs +0 -125
- package/esm2020/lib/services/export.service.mjs +0 -16
- package/esm2020/lib/services/http.service.mjs +0 -79
- package/esm2020/lib/services/loader-interceptor.service.mjs +0 -86
- package/esm2020/lib/services/loader.service.mjs +0 -17
- package/esm2020/lib/services/log.service.mjs +0 -77
- package/esm2020/lib/services/message.service.mjs +0 -59
- package/esm2020/lib/services/notifications.service.mjs +0 -33
- package/esm2020/lib/services/storage.service.mjs +0 -34
- package/esm2020/lib/services/table-config.service.mjs +0 -78
- package/esm2020/lib/services/tin-spa.service.mjs +0 -14
- package/esm2020/lib/tin-spa.module.mjs +0 -225
- package/esm2020/public-api.mjs +0 -90
- package/esm2020/tin-spa.mjs +0 -5
- package/fesm2015/tin-spa.mjs +0 -11736
- package/fesm2015/tin-spa.mjs.map +0 -1
- package/fesm2020/tin-spa.mjs +0 -11738
- package/fesm2020/tin-spa.mjs.map +0 -1
- package/lib/classes/LibClasses.d.ts +0 -173
- package/lib/components/alert/alert.component.d.ts +0 -15
- package/lib/components/capsules/capsules.component.d.ts +0 -26
- package/lib/components/cards/cards.component.d.ts +0 -39
- package/lib/components/email/email.component.d.ts +0 -40
- package/lib/components/form/form.component.d.ts +0 -47
- package/lib/components/list-dialog/list-dialog.component.d.ts +0 -23
- package/lib/components/multi-select/multi-select.component.d.ts +0 -47
- package/lib/components/multi-text/multi-text.component.d.ts +0 -56
- package/lib/components/notes/notes.component.d.ts +0 -19
- package/lib/components/number/number.component.d.ts +0 -41
- package/lib/components/page/page.component.d.ts +0 -38
- package/lib/components/search/search.component.d.ts +0 -15
- package/lib/components/select-bitwise/select-bitwise.component.d.ts +0 -31
- package/lib/components/select-common/select-common.component.d.ts +0 -53
- package/lib/components/select-internal/select-internal.component.d.ts +0 -23
- package/lib/components/select-lite/select-lite.component.d.ts +0 -8
- package/lib/components/statuses/statuses.component.d.ts +0 -12
- package/lib/components/suffix/suffix.component.d.ts +0 -23
- package/lib/components/table/detailsDialog.component.d.ts +0 -86
- package/lib/components/table-action/table-action.component.d.ts +0 -25
- package/lib/components/table-header/table-header.component.d.ts +0 -46
- package/lib/components/table-internal/detailsDialog-internal.component.d.ts +0 -86
- package/lib/components/table-internal/table-internal.component.d.ts +0 -91
- package/lib/components/table-lite/detailsDialog-lite.component.d.ts +0 -86
- package/lib/components/table-lite/table-lite.component.d.ts +0 -91
- package/lib/components/table-row/table-row.component.d.ts +0 -31
- package/lib/components/tabs/tabs.component.d.ts +0 -32
- package/lib/modules/admin/admin-routing.module.d.ts +0 -7
- package/lib/modules/admin/admin.module.d.ts +0 -9
- package/lib/modules/index/index-routing.module.d.ts +0 -7
- package/lib/modules/index/index.module.d.ts +0 -9
- package/lib/modules/user/user-routing.module.d.ts +0 -7
- package/lib/modules/user/user.module.d.ts +0 -9
- package/lib/pages/accounts/accountDialog.component.d.ts +0 -27
- package/lib/pages/accounts/accounts.component.d.ts +0 -25
- package/lib/pages/app-models/app-models.component.d.ts +0 -15
- package/lib/pages/approvals/approvals.component.d.ts +0 -10
- package/lib/pages/approvals-config/approvals-config.component.d.ts +0 -24
- package/lib/pages/bug/bug.component.d.ts +0 -8
- package/lib/pages/customers/customers.component.d.ts +0 -12
- package/lib/pages/departments/departments.component.d.ts +0 -14
- package/lib/pages/employees/employees.component.d.ts +0 -12
- package/lib/pages/grades/grades.component.d.ts +0 -8
- package/lib/pages/inventory/inventory.component.d.ts +0 -25
- package/lib/pages/inventory/quantityDialog.component.d.ts +0 -23
- package/lib/pages/invitations-table/invitations-table.component.d.ts +0 -19
- package/lib/pages/login/login.component.d.ts +0 -46
- package/lib/pages/logs/logs.component.d.ts +0 -14
- package/lib/pages/membership/membership.component.d.ts +0 -13
- package/lib/pages/notifications/notifications.component.d.ts +0 -16
- package/lib/pages/notifications-config/notifications-config.component.d.ts +0 -17
- package/lib/pages/plans/plans.component.d.ts +0 -13
- package/lib/pages/positions/positions.component.d.ts +0 -12
- package/lib/pages/roles/addRoleDialog.component.d.ts +0 -24
- package/lib/pages/roles/roles.component.d.ts +0 -42
- package/lib/pages/suppliers/suppliers.component.d.ts +0 -14
- package/lib/pages/tasks/tasks.component.d.ts +0 -27
- package/lib/pages/tenant-settings/tenant-settings.component.d.ts +0 -47
- package/lib/pages/tenants/tenants.component.d.ts +0 -17
- package/lib/pages/transactions/transactDialog.component.d.ts +0 -26
- package/lib/pages/transactions/transactions.component.d.ts +0 -31
- package/lib/pages/welcome/welcome.component.d.ts +0 -25
- package/lib/pipes/camelToWords.pipe.d.ts +0 -7
- package/lib/select-context.directive.d.ts +0 -10
- package/lib/services/button.service.d.ts +0 -30
- package/lib/services/condition.service.d.ts +0 -10
- package/lib/services/csv.service.d.ts +0 -10
- package/lib/services/datalib.service.d.ts +0 -125
- package/lib/services/dialog.service.d.ts +0 -20
- package/lib/services/notifications.service.d.ts +0 -12
- package/lib/services/table-config.service.d.ts +0 -17
- /package/{index.d.ts → tin-spa.d.ts} +0 -0
|
@@ -1,404 +0,0 @@
|
|
|
1
|
-
import { Component, Inject, Output, EventEmitter } from '@angular/core';
|
|
2
|
-
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
3
|
-
import { Core, DetailsDialogProcessor } from '../../classes/TinCore';
|
|
4
|
-
import { interval, Subject } from 'rxjs';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/cdk/layout";
|
|
7
|
-
import * as i2 from "../../services/loader.service";
|
|
8
|
-
import * as i3 from "../../services/datalib.service";
|
|
9
|
-
import * as i4 from "../../services/message.service";
|
|
10
|
-
import * as i5 from "@angular/material/dialog";
|
|
11
|
-
import * as i6 from "../../services/button.service";
|
|
12
|
-
import * as i7 from "../../services/dialog.service";
|
|
13
|
-
import * as i8 from "../../services/auth.service";
|
|
14
|
-
import * as i9 from "../../services/table-config.service";
|
|
15
|
-
import * as i10 from "@angular/common";
|
|
16
|
-
import * as i11 from "@angular/material/button";
|
|
17
|
-
import * as i12 from "@angular/material/icon";
|
|
18
|
-
import * as i13 from "@angular/material/tooltip";
|
|
19
|
-
import * as i14 from "@angular/material/progress-bar";
|
|
20
|
-
import * as i15 from "../check/check.component";
|
|
21
|
-
import * as i16 from "../steps/steps.component";
|
|
22
|
-
import * as i17 from "../form/form.component";
|
|
23
|
-
import * as i18 from "../alert/alert.component";
|
|
24
|
-
import * as i19 from "../select-lite/select-lite.component";
|
|
25
|
-
import * as i20 from "../statuses/statuses.component";
|
|
26
|
-
import * as i21 from "../../pipes/camelToWords.pipe";
|
|
27
|
-
import * as i22 from "../../classes/Classes";
|
|
28
|
-
export class DetailsDialogLite {
|
|
29
|
-
constructor(breakpointObserver, loaderService, dataService, messageService, dialogRef, detailsConfig, buttonService, dialogService, authService, tableConfigService) {
|
|
30
|
-
this.breakpointObserver = breakpointObserver;
|
|
31
|
-
this.loaderService = loaderService;
|
|
32
|
-
this.dataService = dataService;
|
|
33
|
-
this.messageService = messageService;
|
|
34
|
-
this.dialogRef = dialogRef;
|
|
35
|
-
this.detailsConfig = detailsConfig;
|
|
36
|
-
this.buttonService = buttonService;
|
|
37
|
-
this.dialogService = dialogService;
|
|
38
|
-
this.authService = authService;
|
|
39
|
-
this.tableConfigService = tableConfigService;
|
|
40
|
-
this.autoRefreshEnabled = false;
|
|
41
|
-
this.titleAction = "View";
|
|
42
|
-
this.loadByAction = false;
|
|
43
|
-
this.files = [];
|
|
44
|
-
this.tableReload = new Subject();
|
|
45
|
-
this.smallScreen = false;
|
|
46
|
-
this.isLoadComplete = false;
|
|
47
|
-
this.isProcessing = false;
|
|
48
|
-
this.inputChange = new EventEmitter();
|
|
49
|
-
this.selectedTabIndex = 0;
|
|
50
|
-
// detect screen size changes
|
|
51
|
-
this.breakpointObserver.observe(["(max-width: 600px)"]).subscribe((result) => {
|
|
52
|
-
if (result.matches) {
|
|
53
|
-
this.smallScreen = true;
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
this.smallScreen = false;
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
ngOnInit() {
|
|
61
|
-
const { tableConfig, tableConfigs, formConfig, stepConfig, statusConfig, buttons } = DetailsDialogProcessor.initializeConfigs(this.detailsConfig);
|
|
62
|
-
this.tableConfig = tableConfig;
|
|
63
|
-
this.tableConfigs = tableConfigs;
|
|
64
|
-
this.formConfig = formConfig;
|
|
65
|
-
this.stepConfig = stepConfig;
|
|
66
|
-
this.statusConfig = statusConfig;
|
|
67
|
-
this.buttons = buttons;
|
|
68
|
-
let resp = DetailsDialogProcessor.handleFormMode(this.detailsConfig, this.formConfig);
|
|
69
|
-
if (resp.loadByAction) {
|
|
70
|
-
this.loadByAction = true;
|
|
71
|
-
formConfig.loadAction = resp.action;
|
|
72
|
-
this.loadData(resp.action, false);
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
this.details = resp.details;
|
|
76
|
-
DetailsDialogProcessor.setHeroValue(this.detailsConfig, this.details);
|
|
77
|
-
this.loadByAction = false;
|
|
78
|
-
this.isLoadComplete = true;
|
|
79
|
-
}
|
|
80
|
-
this.fileField = DetailsDialogProcessor.setFileField(this.formConfig);
|
|
81
|
-
this.loaderService.isLoading.subscribe(x => this.isProcessing = x);
|
|
82
|
-
const { extraButtons, createButton, editButton, deleteButton } = DetailsDialogProcessor.setupButtons(this.buttons);
|
|
83
|
-
this.extraButtons = extraButtons;
|
|
84
|
-
this.createButton = createButton;
|
|
85
|
-
this.editButton = editButton;
|
|
86
|
-
this.deleteButton = deleteButton;
|
|
87
|
-
this.setTitleAction();
|
|
88
|
-
this.initAutoRefresh();
|
|
89
|
-
}
|
|
90
|
-
ngOnDestroy() {
|
|
91
|
-
// Cleanup subscription on component destroy
|
|
92
|
-
this.stopAutoRefresh();
|
|
93
|
-
}
|
|
94
|
-
onTabChange(event) {
|
|
95
|
-
this.selectedTabIndex = event.index;
|
|
96
|
-
}
|
|
97
|
-
initAutoRefresh() {
|
|
98
|
-
const config = this.detailsConfig.autoRefreshConfig;
|
|
99
|
-
if (!config)
|
|
100
|
-
return;
|
|
101
|
-
// Set initial state based on defaultOn configuration
|
|
102
|
-
this.autoRefreshEnabled = config.defaultOn || false;
|
|
103
|
-
// Start auto-refresh if enabled by default
|
|
104
|
-
if (this.autoRefreshEnabled) {
|
|
105
|
-
this.startAutoRefresh();
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
startAutoRefresh() {
|
|
109
|
-
if (!this.detailsConfig.autoRefreshConfig)
|
|
110
|
-
return;
|
|
111
|
-
const refreshInterval = this.detailsConfig.autoRefreshConfig.interval || 5000; // Default to 5 seconds
|
|
112
|
-
// Clear any existing subscription
|
|
113
|
-
this.stopAutoRefresh();
|
|
114
|
-
// Create new subscription
|
|
115
|
-
this.refreshSubscription = interval(refreshInterval).subscribe(() => {
|
|
116
|
-
if (this.isLoadComplete && !this.isProcessing) {
|
|
117
|
-
this.refreshData();
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
stopAutoRefresh() {
|
|
122
|
-
if (this.refreshSubscription) {
|
|
123
|
-
this.refreshSubscription.unsubscribe();
|
|
124
|
-
this.refreshSubscription = null;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
toggleAutoRefresh() {
|
|
128
|
-
// this.autoRefreshEnabled = !this.autoRefreshEnabled;
|
|
129
|
-
if (this.autoRefreshEnabled) {
|
|
130
|
-
this.startAutoRefresh();
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
this.stopAutoRefresh();
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
loadData(action, causeTablesReload) {
|
|
137
|
-
if (action && this.loadByAction) {
|
|
138
|
-
this.dataService.CallApi(action).subscribe((apiResponse) => {
|
|
139
|
-
if (apiResponse.success) {
|
|
140
|
-
this.details = apiResponse.data;
|
|
141
|
-
this.isLoadComplete = true;
|
|
142
|
-
// DetailsDialogProcessor.setHeroValue(this.detailsConfig, this.details);
|
|
143
|
-
if (causeTablesReload)
|
|
144
|
-
this.tableReload.next(true);
|
|
145
|
-
const config = this.detailsConfig.autoRefreshConfig;
|
|
146
|
-
if (this.autoRefreshEnabled && config?.stopCondition && config.stopCondition(this.details)) {
|
|
147
|
-
this.autoRefreshEnabled = false;
|
|
148
|
-
this.stopAutoRefresh();
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
else {
|
|
152
|
-
this.messageService.toast("Error: " + apiResponse.message);
|
|
153
|
-
if (this.autoRefreshEnabled) {
|
|
154
|
-
this.autoRefreshEnabled = false;
|
|
155
|
-
this.stopAutoRefresh();
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
inputChanged(event) {
|
|
162
|
-
this.inputChange.emit({ field: event.field, value: event.value });
|
|
163
|
-
}
|
|
164
|
-
setMode(newMode) {
|
|
165
|
-
this.formConfig.mode = newMode;
|
|
166
|
-
this.setTitleAction();
|
|
167
|
-
}
|
|
168
|
-
setTitleAction() {
|
|
169
|
-
if (this.formConfig.fixedTitle) {
|
|
170
|
-
this.titleAction = "";
|
|
171
|
-
return;
|
|
172
|
-
}
|
|
173
|
-
this.titleAction = this.buttonService.getTitleAction(this.formConfig.mode, this.buttons);
|
|
174
|
-
}
|
|
175
|
-
getButton(name) {
|
|
176
|
-
return this.buttonService.getButton(this.buttons, name);
|
|
177
|
-
}
|
|
178
|
-
testDisabled(row, buttonName) {
|
|
179
|
-
const button = this.getButton(buttonName);
|
|
180
|
-
if (!button)
|
|
181
|
-
return false;
|
|
182
|
-
// Create a copy of the button with component's detailsConfig
|
|
183
|
-
const buttonWithConfig = {
|
|
184
|
-
...button,
|
|
185
|
-
detailsConfig: button.detailsConfig ? { ...button.detailsConfig } : this.detailsConfig
|
|
186
|
-
};
|
|
187
|
-
return this.buttonService.testDisabled(buttonWithConfig, row);
|
|
188
|
-
}
|
|
189
|
-
testVisible(row, buttonName) {
|
|
190
|
-
const button = this.getButton(buttonName);
|
|
191
|
-
if (!button)
|
|
192
|
-
return false;
|
|
193
|
-
// Create a copy of the button with component's detailsConfig
|
|
194
|
-
const buttonWithConfig = {
|
|
195
|
-
...button,
|
|
196
|
-
detailsConfig: button.detailsConfig ? { ...button.detailsConfig } : this.detailsConfig
|
|
197
|
-
};
|
|
198
|
-
return this.buttonService.testVisible(buttonWithConfig, row);
|
|
199
|
-
}
|
|
200
|
-
testVisibleTab(tblConfig) {
|
|
201
|
-
if (!this.tableConfigService.hasTableAccess(tblConfig)) {
|
|
202
|
-
return false;
|
|
203
|
-
}
|
|
204
|
-
return this.buttonService.isTabVisible(tblConfig, this.details);
|
|
205
|
-
}
|
|
206
|
-
getButtonColor(button, row) {
|
|
207
|
-
return this.buttonService.getButtonColor(button, row);
|
|
208
|
-
}
|
|
209
|
-
getVisibleFields() {
|
|
210
|
-
return this.formConfig.fields?.filter(x => Core.testVisible(this.formConfig, this.details, x, this.authService.currentRoleSource.value));
|
|
211
|
-
}
|
|
212
|
-
create() {
|
|
213
|
-
this.handleButtonAction('create');
|
|
214
|
-
}
|
|
215
|
-
edit() {
|
|
216
|
-
this.handleButtonAction('edit');
|
|
217
|
-
}
|
|
218
|
-
delete() {
|
|
219
|
-
const button = this.buttonService.getButton(this.buttons, 'delete');
|
|
220
|
-
if (!button)
|
|
221
|
-
return;
|
|
222
|
-
let confirmMessage = this.buttonService.getConfirmMessage(button, this.details);
|
|
223
|
-
if (!confirmMessage) {
|
|
224
|
-
confirmMessage = `Are you sure you want to delete ?`;
|
|
225
|
-
}
|
|
226
|
-
this.messageService.confirm(confirmMessage).subscribe((result) => {
|
|
227
|
-
if (result == "yes") {
|
|
228
|
-
this.handleButtonAction('delete');
|
|
229
|
-
}
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
custom(button) {
|
|
233
|
-
if (button.dialog && button.detailsConfig) {
|
|
234
|
-
this.openNestedDetailsDialog(button);
|
|
235
|
-
}
|
|
236
|
-
else {
|
|
237
|
-
this.handleButtonAction(button.name);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
openNestedDetailsDialog(button) {
|
|
241
|
-
this.dialogService.openConfiguredDetailsDialog(button, this.details, DetailsDialogLite).subscribe(result => {
|
|
242
|
-
if (result.action === 'inputChange') {
|
|
243
|
-
this.inputChanged(result.change);
|
|
244
|
-
}
|
|
245
|
-
else if (result && result.message === 'success') {
|
|
246
|
-
this.refreshData();
|
|
247
|
-
}
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
refreshData() {
|
|
251
|
-
if (this.formConfig.loadAction) {
|
|
252
|
-
this.loadData(this.formConfig.loadAction, true);
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
handleButtonAction(buttonName) {
|
|
256
|
-
const button = this.getButton(buttonName);
|
|
257
|
-
if (!button)
|
|
258
|
-
return;
|
|
259
|
-
if (button.onClick) {
|
|
260
|
-
button.onClick(this.details);
|
|
261
|
-
}
|
|
262
|
-
this.processButtonAction(button);
|
|
263
|
-
}
|
|
264
|
-
processButtonAction(button) {
|
|
265
|
-
if (!button.action) {
|
|
266
|
-
if (!button.keepOpen) {
|
|
267
|
-
this.dialogRef.close({ message: 'emit', data: this.details });
|
|
268
|
-
}
|
|
269
|
-
return;
|
|
270
|
-
}
|
|
271
|
-
if (button.skipValidation || this.validateForm()) {
|
|
272
|
-
this.executeAction(button, this.details);
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
validateForm() {
|
|
276
|
-
let validationResult = Core.validateObject(this.getVisibleFields(), this.details);
|
|
277
|
-
if (validationResult !== '') {
|
|
278
|
-
this.messageService.toast(validationResult);
|
|
279
|
-
return false;
|
|
280
|
-
}
|
|
281
|
-
if (this.files.length < 1 && this.fileField?.required && this.formConfig.mode === 'create') {
|
|
282
|
-
this.messageService.toast("Please attach file(s)");
|
|
283
|
-
return false;
|
|
284
|
-
}
|
|
285
|
-
// Validate composite fields
|
|
286
|
-
for (const field of this.getVisibleFields()) {
|
|
287
|
-
if (field.type === 'composite') {
|
|
288
|
-
validationResult = Core.validateObject(Core.getVisibleSubfields(this.formConfig, this.details, field, this.authService.currentRoleSource.value), this.details);
|
|
289
|
-
if (validationResult !== '') {
|
|
290
|
-
this.messageService.toast(validationResult);
|
|
291
|
-
return false;
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
return true;
|
|
296
|
-
}
|
|
297
|
-
prepareActionData(button, data) {
|
|
298
|
-
if (this.buttonService.isFormButton(button)) {
|
|
299
|
-
const formData = new FormData();
|
|
300
|
-
for (let i = 0; i < this.files.length; i++) {
|
|
301
|
-
formData.append(`uploadFile${i}`, this.files[i], this.files[i].name);
|
|
302
|
-
}
|
|
303
|
-
formData.append("data", JSON.stringify(data));
|
|
304
|
-
return formData;
|
|
305
|
-
}
|
|
306
|
-
return data;
|
|
307
|
-
}
|
|
308
|
-
executeAction(button, data) {
|
|
309
|
-
const actionData = this.prepareActionData(button, data);
|
|
310
|
-
if (button.confirm) {
|
|
311
|
-
let confirmMessage = this.buttonService.getConfirmMessage(button, this.details);
|
|
312
|
-
if (!confirmMessage && button.name == 'delete') {
|
|
313
|
-
confirmMessage = `Are you sure you want to delete ?`;
|
|
314
|
-
}
|
|
315
|
-
this.messageService.confirm(confirmMessage).subscribe((result) => {
|
|
316
|
-
if (result == "yes") {
|
|
317
|
-
this.performApiCall(button, actionData);
|
|
318
|
-
}
|
|
319
|
-
});
|
|
320
|
-
}
|
|
321
|
-
else {
|
|
322
|
-
this.performApiCall(button, actionData);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
performApiCall(button, data) {
|
|
326
|
-
this.dataService.CallApi(button.action, data).subscribe((apiResponse) => {
|
|
327
|
-
if (apiResponse.data) {
|
|
328
|
-
this.details = apiResponse.data;
|
|
329
|
-
}
|
|
330
|
-
if (apiResponse.success) {
|
|
331
|
-
if (apiResponse.message.includes("approval") || apiResponse.message.includes("approve") || apiResponse.message.includes("decline")) {
|
|
332
|
-
this.messageService.toast(apiResponse.message);
|
|
333
|
-
}
|
|
334
|
-
else if (button.action.successMessage) {
|
|
335
|
-
this.messageService.toast(button.action.successMessage);
|
|
336
|
-
}
|
|
337
|
-
else if (apiResponse.message != "success" && apiResponse.message != "") {
|
|
338
|
-
this.messageService.toast(apiResponse.message);
|
|
339
|
-
}
|
|
340
|
-
else {
|
|
341
|
-
this.messageService.toast("Updated");
|
|
342
|
-
}
|
|
343
|
-
if (button.onSuccess) {
|
|
344
|
-
button.onSuccess(apiResponse.data, this.details);
|
|
345
|
-
}
|
|
346
|
-
if (button.keepOpen) {
|
|
347
|
-
if (button.name === 'create' && apiResponse.data) {
|
|
348
|
-
this.details = apiResponse.data;
|
|
349
|
-
if (this.detailsConfig.heroField && apiResponse.data[this.detailsConfig.heroField]) {
|
|
350
|
-
this.detailsConfig.heroValue = apiResponse.data[this.detailsConfig.heroField];
|
|
351
|
-
this.formConfig.heroField = this.detailsConfig.heroField;
|
|
352
|
-
this.formConfig.heroValue = this.detailsConfig.heroValue;
|
|
353
|
-
}
|
|
354
|
-
this.formConfig.mode = 'edit';
|
|
355
|
-
this.setTitleAction();
|
|
356
|
-
this.isLoadComplete = true;
|
|
357
|
-
}
|
|
358
|
-
else {
|
|
359
|
-
this.refreshData();
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
else {
|
|
363
|
-
this.dialogRef.close({ message: 'success', data: { ...apiResponse, data: button.name == 'create' ? apiResponse.data : this.details } });
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
else {
|
|
367
|
-
this.messageService.toast("Error: " + apiResponse.message);
|
|
368
|
-
}
|
|
369
|
-
});
|
|
370
|
-
}
|
|
371
|
-
getClosePosition() {
|
|
372
|
-
return this.detailsConfig.closeOptions?.position || 'bottom';
|
|
373
|
-
}
|
|
374
|
-
getCloseText() {
|
|
375
|
-
return this.detailsConfig.closeOptions?.text || 'Cancel';
|
|
376
|
-
}
|
|
377
|
-
shouldShowTopClose() {
|
|
378
|
-
return this.getClosePosition() === 'top';
|
|
379
|
-
}
|
|
380
|
-
shouldShowBottomClose() {
|
|
381
|
-
return this.getClosePosition() === 'bottom';
|
|
382
|
-
}
|
|
383
|
-
close() {
|
|
384
|
-
if (this.detailsConfig.refreshOnClose) {
|
|
385
|
-
this.dialogRef.close({ message: 'success', data: this.details });
|
|
386
|
-
}
|
|
387
|
-
else {
|
|
388
|
-
this.dialogRef.close({ message: 'emit', data: this.details });
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
DetailsDialogLite.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DetailsDialogLite, deps: [{ token: i1.BreakpointObserver }, { token: i2.LoaderService }, { token: i3.DataServiceLib }, { token: i4.MessageService }, { token: i5.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i6.ButtonService }, { token: i7.DialogService }, { token: i8.AuthService }, { token: i9.TableConfigService }], target: i0.ɵɵFactoryTarget.Component });
|
|
393
|
-
DetailsDialogLite.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: DetailsDialogLite, selector: "spa-detailsDialog-lite", outputs: { inputChange: "inputChange" }, ngImport: i0, template: "<div class=\"dialog-container\">\r\n\r\n <div class=\"dialog-content\">\r\n\r\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isProcessing && dataService.appConfig.progressLine\"></mat-progress-bar>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-2\">\r\n\r\n <div>\r\n <label style=\"font-size: 20px; font-weight:500;margin-bottom: 10px;\">{{titleAction | titlecase}} {{formConfig?.title}}</label>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n\r\n <spa-check *ngIf=\"detailsConfig.autoRefreshConfig\" display=\"Auto Refresh\" [(value)]=\"autoRefreshEnabled\" (valueChange)=\"toggleAutoRefresh()\"></spa-check>\r\n\r\n <div *ngIf=\"formConfig.mode=='view' && editButton && testVisible(details,editButton.name)\">\r\n <button mat-icon-button matTooltipPosition=\"above\" matTooltip=\"Edit\" color=\"primary\" (click)=\"setMode('edit')\" [disabled]=\"testDisabled(details,editButton.name)\"><mat-icon>edit</mat-icon></button>\r\n </div>\r\n\r\n <button [disabled]=\"isProcessing\" *ngIf=\"loadByAction\" mat-icon-button matTooltipPosition=\"above\" matTooltip=\"Refresh\" color=\"primary\" (click)=\"loadData(formConfig.loadAction, detailsConfig.causeTableRefresh)\"><mat-icon class=\"refreshIcon\">cached</mat-icon></button>\r\n \r\n <!-- Added: Top close button when position is 'top' -->\r\n <button *ngIf=\"shouldShowTopClose()\" [disabled]=\"isProcessing\" mat-icon-button matTooltipPosition=\"above\" matTooltip=\"Close\" (click)=\"close()\"><mat-icon>close</mat-icon></button>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n <div>\r\n <spa-steps *ngIf=\"stepConfig && details && stepConfig.sticky\" [config]=\"stepConfig\" [data]=\"details\"></spa-steps>\r\n <spa-statuses *ngIf=\"statusConfig && details && statusConfig?.sticky\" [config]=\"statusConfig\" [data]=\"details\"></spa-statuses>\r\n <spa-alert *ngIf=\"formConfig.alertConfig && formConfig.alertConfig?.sticky\" [config]=\"formConfig.alertConfig\" [data]=\"details\"></spa-alert>\r\n </div>\r\n\r\n <mat-dialog-content class=\"mat-typography dialog-scroll-content\">\r\n\r\n <spa-steps *ngIf=\"stepConfig && details && !stepConfig.sticky\" [config]=\"stepConfig\" [data]=\"details\"></spa-steps>\r\n <spa-statuses *ngIf=\"statusConfig && details && !statusConfig?.sticky\" [config]=\"statusConfig\" [data]=\"details\"></spa-statuses>\r\n <spa-alert *ngIf=\"formConfig.alertConfig && !formConfig.alertConfig?.sticky\" [config]=\"formConfig.alertConfig\" [data]=\"details\"></spa-alert>\r\n\r\n <div class=\"tin-input\" style=\"font-size:14px\">\r\n\r\n <p *ngIf=\"formConfig && !details\"><em>Loading...</em></p>\r\n\r\n <spa-form *ngIf=\"formConfig && details\" [files]=\"files\" [data]=\"details\" [config]=\"formConfig\" (inputChange)=\"inputChanged($event)\">\r\n <ng-template #dynamicSelect let-field=\"field\" let-data=\"data\" let-testReadOnly=\"testReadOnly\" let-testRequired=\"testRequired\" let-selectChanged=\"selectChanged\">\r\n <spa-select-lite\r\n [display]=\"field.alias ?? field.name | camelToWords\"\r\n [width]=\"field.width\"\r\n [nullable]=\"field.nullable\"\r\n [options]=\"field.options\"\r\n [masterOptions]=\"field.masterOptions\"\r\n [masterField]=\"field.masterField\"\r\n [optionDisplay]=\"field.optionDisplay ?? 'name'\"\r\n [optionValue]=\"field.optionValue ?? 'value'\"\r\n [(value)]=\"data[field.name]\"\r\n [defaultFirstValue]=\"field.defaultFirstValue\"\r\n [required]=\"testRequired(field)\"\r\n [readonly]=\"testReadOnly(field)\"\r\n [hint]=\"field.hint\"\r\n [loadAction]=\"field.loadAction\"\r\n [loadIDField]=\"field.loadIDField\"\r\n [field]=\"field\"\r\n [data]=\"data\"\r\n [infoMessage]=\"field.infoMessage\"\r\n [copyContent]=\"field.copyContent\"\r\n (valueChange)=\"selectChanged(field)\"\r\n ></spa-select-lite>\r\n </ng-template>\r\n </spa-form>\r\n\r\n\r\n <!-- <mat-tab-group *ngIf=\"tableConfigs\">\r\n\r\n <ng-container *ngFor=\"let tbl of tableConfigService.getVisibleTableConfigs(tableConfigs)\">\r\n <mat-tab *ngIf=\"testVisibleTab(tbl)\">\r\n\r\n <ng-template matTabLabel>\r\n <span>{{tbl.tabTitle ?? 'Untitled'}}</span>\r\n </ng-template>\r\n\r\n <spa-table-internal [config]=\"tbl\" [reload]=\"tableReload\" (dataLoad)=\"loadData(formConfig.loadAction, false)\"></spa-table-internal>\r\n\r\n </mat-tab>\r\n </ng-container>\r\n\r\n </mat-tab-group> -->\r\n\r\n </div>\r\n\r\n </mat-dialog-content>\r\n\r\n\r\n </div>\r\n\r\n <mat-dialog-actions>\r\n\r\n <div>\r\n\r\n <button mat-raised-button [disabled]=\"isProcessing\" *ngIf=\"formConfig.mode=='create' && createButton\" color=\"primary\" (click)=\"create()\" cdkFocusInitial>{{createButton.display ?? 'Submit'}}\r\n </button>\r\n\r\n <button mat-raised-button [disabled]=\"isProcessing\" *ngIf=\"formConfig.mode=='edit' && editButton\" color=\"primary\" (click)=\"edit()\" cdkFocusInitial>{{editButton.display ?? 'Submit'}}\r\n </button>\r\n\r\n <ng-container *ngFor=\"let btn of extraButtons\">\r\n <button *ngIf=\"formConfig.mode !== 'create' && testVisible(details,btn.name)\" mat-stroked-button [disabled]=\"isProcessing || testDisabled(details,btn.name)\" [ngStyle]=\"{'color': getButtonColor(btn, details)}\" (click)=\"custom(btn)\" cdkFocusInitial>\r\n <mat-icon *ngIf=\"btn.icon\" [ngStyle]=\"{'color': getButtonColor(btn, details)}\">{{btn.icon.name}}</mat-icon>\r\n {{btn.display ?? btn.name | titlecase}}\r\n </button>\r\n </ng-container>\r\n\r\n <!-- Changed: Bottom close button now uses conditional display and custom text -->\r\n <button *ngIf=\"shouldShowBottomClose()\" mat-stroked-button color=\"primary\" (click)=\"close()\">{{getCloseText()}}</button>\r\n\r\n </div>\r\n\r\n <div class=\"col d-flex justify-content-end\" *ngIf=\"smallScreen\">\r\n <button mat-icon-button matTooltipPosition=\"above\" matTooltip=\"Delete\" [disabled]=\"isProcessing\" style=\"color: red;\" (click)=\"delete()\" *ngIf=\"formConfig.mode!='create' && deleteButton\"><mat-icon>delete</mat-icon></button>\r\n </div>\r\n\r\n\r\n </mat-dialog-actions>\r\n\r\n\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i11.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: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i5.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i13.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i14.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i15.CheckComponent, selector: "spa-check", inputs: ["readonly", "display", "value", "infoMessage"], outputs: ["valueChange", "click", "check", "uncheck", "infoClick"] }, { kind: "component", type: i16.StepsComponent, selector: "spa-steps", inputs: ["value", "config", "data"] }, { kind: "component", type: i17.FormComponent, selector: "spa-form", inputs: ["files", "data", "config"], outputs: ["buttonClick", "inputChange"] }, { kind: "component", type: i18.AlertComponent, selector: "spa-alert", inputs: ["config", "data"] }, { kind: "component", type: i19.SelectLiteComponent, selector: "spa-select-lite" }, { kind: "component", type: i20.StatusesComponent, selector: "spa-statuses", inputs: ["config", "data"] }, { kind: "pipe", type: i10.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i21.CamelToWordsPipe, name: "camelToWords" }] });
|
|
394
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DetailsDialogLite, decorators: [{
|
|
395
|
-
type: Component,
|
|
396
|
-
args: [{ selector: 'spa-detailsDialog-lite', template: "<div class=\"dialog-container\">\r\n\r\n <div class=\"dialog-content\">\r\n\r\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isProcessing && dataService.appConfig.progressLine\"></mat-progress-bar>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-2\">\r\n\r\n <div>\r\n <label style=\"font-size: 20px; font-weight:500;margin-bottom: 10px;\">{{titleAction | titlecase}} {{formConfig?.title}}</label>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n\r\n <spa-check *ngIf=\"detailsConfig.autoRefreshConfig\" display=\"Auto Refresh\" [(value)]=\"autoRefreshEnabled\" (valueChange)=\"toggleAutoRefresh()\"></spa-check>\r\n\r\n <div *ngIf=\"formConfig.mode=='view' && editButton && testVisible(details,editButton.name)\">\r\n <button mat-icon-button matTooltipPosition=\"above\" matTooltip=\"Edit\" color=\"primary\" (click)=\"setMode('edit')\" [disabled]=\"testDisabled(details,editButton.name)\"><mat-icon>edit</mat-icon></button>\r\n </div>\r\n\r\n <button [disabled]=\"isProcessing\" *ngIf=\"loadByAction\" mat-icon-button matTooltipPosition=\"above\" matTooltip=\"Refresh\" color=\"primary\" (click)=\"loadData(formConfig.loadAction, detailsConfig.causeTableRefresh)\"><mat-icon class=\"refreshIcon\">cached</mat-icon></button>\r\n \r\n <!-- Added: Top close button when position is 'top' -->\r\n <button *ngIf=\"shouldShowTopClose()\" [disabled]=\"isProcessing\" mat-icon-button matTooltipPosition=\"above\" matTooltip=\"Close\" (click)=\"close()\"><mat-icon>close</mat-icon></button>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n <div>\r\n <spa-steps *ngIf=\"stepConfig && details && stepConfig.sticky\" [config]=\"stepConfig\" [data]=\"details\"></spa-steps>\r\n <spa-statuses *ngIf=\"statusConfig && details && statusConfig?.sticky\" [config]=\"statusConfig\" [data]=\"details\"></spa-statuses>\r\n <spa-alert *ngIf=\"formConfig.alertConfig && formConfig.alertConfig?.sticky\" [config]=\"formConfig.alertConfig\" [data]=\"details\"></spa-alert>\r\n </div>\r\n\r\n <mat-dialog-content class=\"mat-typography dialog-scroll-content\">\r\n\r\n <spa-steps *ngIf=\"stepConfig && details && !stepConfig.sticky\" [config]=\"stepConfig\" [data]=\"details\"></spa-steps>\r\n <spa-statuses *ngIf=\"statusConfig && details && !statusConfig?.sticky\" [config]=\"statusConfig\" [data]=\"details\"></spa-statuses>\r\n <spa-alert *ngIf=\"formConfig.alertConfig && !formConfig.alertConfig?.sticky\" [config]=\"formConfig.alertConfig\" [data]=\"details\"></spa-alert>\r\n\r\n <div class=\"tin-input\" style=\"font-size:14px\">\r\n\r\n <p *ngIf=\"formConfig && !details\"><em>Loading...</em></p>\r\n\r\n <spa-form *ngIf=\"formConfig && details\" [files]=\"files\" [data]=\"details\" [config]=\"formConfig\" (inputChange)=\"inputChanged($event)\">\r\n <ng-template #dynamicSelect let-field=\"field\" let-data=\"data\" let-testReadOnly=\"testReadOnly\" let-testRequired=\"testRequired\" let-selectChanged=\"selectChanged\">\r\n <spa-select-lite\r\n [display]=\"field.alias ?? field.name | camelToWords\"\r\n [width]=\"field.width\"\r\n [nullable]=\"field.nullable\"\r\n [options]=\"field.options\"\r\n [masterOptions]=\"field.masterOptions\"\r\n [masterField]=\"field.masterField\"\r\n [optionDisplay]=\"field.optionDisplay ?? 'name'\"\r\n [optionValue]=\"field.optionValue ?? 'value'\"\r\n [(value)]=\"data[field.name]\"\r\n [defaultFirstValue]=\"field.defaultFirstValue\"\r\n [required]=\"testRequired(field)\"\r\n [readonly]=\"testReadOnly(field)\"\r\n [hint]=\"field.hint\"\r\n [loadAction]=\"field.loadAction\"\r\n [loadIDField]=\"field.loadIDField\"\r\n [field]=\"field\"\r\n [data]=\"data\"\r\n [infoMessage]=\"field.infoMessage\"\r\n [copyContent]=\"field.copyContent\"\r\n (valueChange)=\"selectChanged(field)\"\r\n ></spa-select-lite>\r\n </ng-template>\r\n </spa-form>\r\n\r\n\r\n <!-- <mat-tab-group *ngIf=\"tableConfigs\">\r\n\r\n <ng-container *ngFor=\"let tbl of tableConfigService.getVisibleTableConfigs(tableConfigs)\">\r\n <mat-tab *ngIf=\"testVisibleTab(tbl)\">\r\n\r\n <ng-template matTabLabel>\r\n <span>{{tbl.tabTitle ?? 'Untitled'}}</span>\r\n </ng-template>\r\n\r\n <spa-table-internal [config]=\"tbl\" [reload]=\"tableReload\" (dataLoad)=\"loadData(formConfig.loadAction, false)\"></spa-table-internal>\r\n\r\n </mat-tab>\r\n </ng-container>\r\n\r\n </mat-tab-group> -->\r\n\r\n </div>\r\n\r\n </mat-dialog-content>\r\n\r\n\r\n </div>\r\n\r\n <mat-dialog-actions>\r\n\r\n <div>\r\n\r\n <button mat-raised-button [disabled]=\"isProcessing\" *ngIf=\"formConfig.mode=='create' && createButton\" color=\"primary\" (click)=\"create()\" cdkFocusInitial>{{createButton.display ?? 'Submit'}}\r\n </button>\r\n\r\n <button mat-raised-button [disabled]=\"isProcessing\" *ngIf=\"formConfig.mode=='edit' && editButton\" color=\"primary\" (click)=\"edit()\" cdkFocusInitial>{{editButton.display ?? 'Submit'}}\r\n </button>\r\n\r\n <ng-container *ngFor=\"let btn of extraButtons\">\r\n <button *ngIf=\"formConfig.mode !== 'create' && testVisible(details,btn.name)\" mat-stroked-button [disabled]=\"isProcessing || testDisabled(details,btn.name)\" [ngStyle]=\"{'color': getButtonColor(btn, details)}\" (click)=\"custom(btn)\" cdkFocusInitial>\r\n <mat-icon *ngIf=\"btn.icon\" [ngStyle]=\"{'color': getButtonColor(btn, details)}\">{{btn.icon.name}}</mat-icon>\r\n {{btn.display ?? btn.name | titlecase}}\r\n </button>\r\n </ng-container>\r\n\r\n <!-- Changed: Bottom close button now uses conditional display and custom text -->\r\n <button *ngIf=\"shouldShowBottomClose()\" mat-stroked-button color=\"primary\" (click)=\"close()\">{{getCloseText()}}</button>\r\n\r\n </div>\r\n\r\n <div class=\"col d-flex justify-content-end\" *ngIf=\"smallScreen\">\r\n <button mat-icon-button matTooltipPosition=\"above\" matTooltip=\"Delete\" [disabled]=\"isProcessing\" style=\"color: red;\" (click)=\"delete()\" *ngIf=\"formConfig.mode!='create' && deleteButton\"><mat-icon>delete</mat-icon></button>\r\n </div>\r\n\r\n\r\n </mat-dialog-actions>\r\n\r\n\r\n</div>\r\n" }]
|
|
397
|
-
}], ctorParameters: function () { return [{ type: i1.BreakpointObserver }, { type: i2.LoaderService }, { type: i3.DataServiceLib }, { type: i4.MessageService }, { type: i5.MatDialogRef }, { type: i22.DetailsDialogConfig, decorators: [{
|
|
398
|
-
type: Inject,
|
|
399
|
-
args: [MAT_DIALOG_DATA]
|
|
400
|
-
}] }, { type: i6.ButtonService }, { type: i7.DialogService }, { type: i8.AuthService }, { type: i9.TableConfigService }]; }, propDecorators: { inputChange: [{
|
|
401
|
-
type: Output
|
|
402
|
-
}] } });
|
|
403
|
-
;
|
|
404
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsc0RpYWxvZy1saXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rpbi1zcGEvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlLWxpdGUvZGV0YWlsc0RpYWxvZy1saXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rpbi1zcGEvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlLWxpdGUvZGV0YWlsc0RpYWxvZy1saXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsTUFBTSwwQkFBMEIsQ0FBQztBQU16RSxPQUFPLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHckUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVdkQsTUFBTSxPQUFPLGlCQUFpQjtJQUU1QixZQUFvQixrQkFBc0MsRUFBUyxhQUE0QixFQUFRLFdBQTJCLEVBQVMsY0FBOEIsRUFDL0osU0FBMEMsRUFBa0MsYUFBa0MsRUFBVSxhQUE0QixFQUNwSixhQUE0QixFQUFVLFdBQXdCLEVBQVMsa0JBQXNDO1FBRm5HLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFBUyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFRLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUFTLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUMvSixjQUFTLEdBQVQsU0FBUyxDQUFpQztRQUFrQyxrQkFBYSxHQUFiLGFBQWEsQ0FBcUI7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUNwSixrQkFBYSxH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UUFDSCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFDO1lBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDbEU7YUFBSTtZQUNILElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDL0Q7SUFDSCxDQUFDOzs4R0F2Y1UsaUJBQWlCLHlLQUdrQyxlQUFlO2tHQUhsRSxpQkFBaUIsdUdDckI5Qix5aE5BK0hBOzJGRDFHYSxpQkFBaUI7a0JBTDdCLFNBQVM7K0JBQ0Usd0JBQXdCOzswQkFPcUIsTUFBTTsyQkFBQyxlQUFlOytKQXVGbkUsV0FBVztzQkFBcEIsTUFBTTs7QUErV1IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5qZWN0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgRm9ybUNvbmZpZywgRmllbGQsIFRhYmxlQ29uZmlnLCBCdXR0b24sIERldGFpbHNEaWFsb2dDb25maWcsIEFjdGlvbiwgQXBpUmVzcG9uc2UsIFN0ZXBDb25maWcsIFN0YXR1c0NvbmZpZywgQ2xvc2VPcHRpb25zIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9DbGFzc2VzJztcclxuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tZXNzYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEYXRhU2VydmljZUxpYiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGFsaWIuc2VydmljZSc7XHJcbmltcG9ydCB7IExvYWRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sb2FkZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEJyZWFrcG9pbnRPYnNlcnZlciwgQnJlYWtwb2ludFN0YXRlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2xheW91dCc7XHJcbmltcG9ydCB7IENvcmUsIERldGFpbHNEaWFsb2dQcm9jZXNzb3IgfSBmcm9tICcuLi8uLi9jbGFzc2VzL1RpbkNvcmUnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGlhbG9nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCdXR0b25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYnV0dG9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBpbnRlcnZhbCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVGFibGVDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGFibGUtY29uZmlnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYXRUYWJDaGFuZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYnMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzcGEtZGV0YWlsc0RpYWxvZy1saXRlJywgLy91bmlxIHRvIGxpdGVcclxuICB0ZW1wbGF0ZVVybDogJy4vZGV0YWlsc0RpYWxvZy1saXRlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90YWJsZS1saXRlLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGV0YWlsc0RpYWxvZ0xpdGUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYnJlYWtwb2ludE9ic2VydmVyOiBCcmVha3BvaW50T2JzZXJ2ZXIscHJpdmF0ZSBsb2FkZXJTZXJ2aWNlOiBMb2FkZXJTZXJ2aWNlLHB1YmxpYyBkYXRhU2VydmljZTogRGF0YVNlcnZpY2VMaWIscHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPERldGFpbHNEaWFsb2dMaXRlPiwgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkZXRhaWxzQ29uZmlnOiBEZXRhaWxzRGlhbG9nQ29uZmlnLCBwcml2YXRlIGJ1dHRvblNlcnZpY2U6IEJ1dHRvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLCBwdWJsaWMgdGFibGVDb25maWdTZXJ2aWNlOiBUYWJsZUNvbmZpZ1NlcnZpY2UpXHJcbiAge1xyXG4gICAgLy8gZGV0ZWN0IHNjcmVlbiBzaXplIGNoYW5nZXNcclxuICAgIHRoaXMuYnJlYWtwb2ludE9ic2VydmVyLm9ic2VydmUoW1wiKG1heC13aWR0aDogNjAwcHgpXCJdKS5zdWJzY3JpYmUoKHJlc3VsdDogQnJlYWtwb2ludFN0YXRlKSA9PiB7XHJcblxyXG4gICAgICBpZiAocmVzdWx0Lm1hdGNoZXMpIHtcclxuICAgICAgICB0aGlzLnNtYWxsU2NyZWVuID0gdHJ1ZVxyXG4gICAgICB9ZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zbWFsbFNjcmVlbiA9IGZhbHNlXHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG5cclxuICAgIGNvbnN0IHsgdGFibGVDb25maWcsIHRhYmxlQ29uZmlncywgZm9ybUNvbmZpZywgc3RlcENvbmZpZywgc3RhdHVzQ29uZmlnLCBidXR0b25zIH0gPSBEZXRhaWxzRGlhbG9nUHJvY2Vzc29yLmluaXRpYWxpemVDb25maWdzKHRoaXMuZGV0YWlsc0NvbmZpZyk7XHJcbiAgICB0aGlzLnRhYmxlQ29uZmlnID0gdGFibGVDb25maWc7XHJcbiAgICB0aGlzLnRhYmxlQ29uZmlncyA9IHRhYmxlQ29uZmlncztcclxuICAgIHRoaXMuZm9ybUNvbmZpZyA9IGZvcm1Db25maWc7XHJcbiAgICB0aGlzLnN0ZXBDb25maWcgPSBzdGVwQ29uZmlnO1xyXG4gICAgdGhpcy5zdGF0dXNDb25maWcgPSBzdGF0dXNDb25maWc7XHJcbiAgICB0aGlzLmJ1dHRvbnMgPSBidXR0b25zO1xyXG5cclxuICAgIGxldCByZXNwID0gRGV0YWlsc0RpYWxvZ1Byb2Nlc3Nvci5oYW5kbGVGb3JtTW9kZSh0aGlzLmRldGFpbHNDb25maWcsIHRoaXMuZm9ybUNvbmZpZywpO1xyXG5cclxuICAgIGlmIChyZXNwLmxvYWRCeUFjdGlvbikge1xyXG4gICAgICB0aGlzLmxvYWRCeUFjdGlvbiA9IHRydWU7XHJcbiAgICAgIGZvcm1Db25maWcubG9hZEFjdGlvbiA9IHJlc3AuYWN0aW9uO1xyXG4gICAgICB0aGlzLmxvYWREYXRhKHJlc3AuYWN0aW9uLCBmYWxzZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRldGFpbHMgPSByZXNwLmRldGFpbHM7XHJcbiAgICAgIERldGFpbHNEaWFsb2dQcm9jZXNzb3Iuc2V0SGVyb1ZhbHVlKHRoaXMuZGV0YWlsc0NvbmZpZywgdGhpcy5kZXRhaWxzKTtcclxuICAgICAgdGhpcy5sb2FkQnlBY3Rpb24gPSBmYWxzZTtcclxuICAgICAgdGhpcy5pc0xvYWRDb21wbGV0ZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5maWxlRmllbGQgPSBEZXRhaWxzRGlhbG9nUHJvY2Vzc29yLnNldEZpbGVGaWVsZCh0aGlzLmZvcm1Db25maWcpO1xyXG5cclxuICAgIHRoaXMubG9hZGVyU2VydmljZS5pc0xvYWRpbmcuc3Vic2NyaWJlKHggPT4gdGhpcy5pc1Byb2Nlc3NpbmcgPSB4KTtcclxuXHJcbiAgICBjb25zdCB7IGV4dHJhQnV0dG9ucywgY3JlYXRlQnV0dG9uLCBlZGl0QnV0dG9uLCBkZWxldGVCdXR0b24gfSA9IERldGFpbHNEaWFsb2dQcm9jZXNzb3Iuc2V0dXBCdXR0b25zKHRoaXMuYnV0dG9ucyk7XHJcbiAgICB0aGlzLmV4dHJhQnV0dG9ucyA9IGV4dHJhQnV0dG9ucztcclxuICAgIHRoaXMuY3JlYXRlQnV0dG9uID0gY3JlYXRlQnV0dG9uO1xyXG4gICAgdGhpcy5lZGl0QnV0dG9uID0gZWRpdEJ1dHRvbjtcclxuICAgIHRoaXMuZGVsZXRlQnV0dG9uID0gZGVsZXRlQnV0dG9uO1xyXG5cclxuICAgIHRoaXMuc2V0VGl0bGVBY3Rpb24oKVxyXG4gICAgdGhpcy5pbml0QXV0b1JlZnJlc2goKTtcclxuXHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIC8vIENsZWFudXAgc3Vic2NyaXB0aW9uIG9uIGNvbXBvbmVudCBkZXN0cm95XHJcbiAgICB0aGlzLnN0b3BBdXRvUmVmcmVzaCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWZyZXNoU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgYXV0b1JlZnJlc2hFbmFibGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHRpdGxlQWN0aW9uID0gXCJWaWV3XCI7XHJcbiAgbG9hZEJ5QWN0aW9uID0gZmFsc2U7XHJcblxyXG4gIGV4dHJhQnV0dG9uczogQnV0dG9uW107XHJcbiAgYnV0dG9uczogQnV0dG9uW107XHJcbiAgY3JlYXRlQnV0dG9uOiBCdXR0b247XHJcbiAgZWRpdEJ1dHRvbjogQnV0dG9uO1xyXG4gIGRlbGV0ZUJ1dHRvbjogQnV0dG9uO1xyXG5cclxuICAvLyBtb2RlQnV0dG9uIDogQnV0dG9uXHJcbiAgZmlsZUZpZWxkOiBGaWVsZDtcclxuICBmaWxlczogYW55W10gPSBbXTtcclxuXHJcbiAgdGFibGVSZWxvYWQ6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICB0YWJsZUNvbmZpZzogVGFibGVDb25maWdcclxuICB0YWJsZUNvbmZpZ3MgOiBUYWJsZUNvbmZpZ1tdXHJcbiAgZGV0YWlsczogYW55XHJcbiAgZm9ybUNvbmZpZzogRm9ybUNvbmZpZztcclxuICBzdGVwQ29uZmlnOiBTdGVwQ29uZmlnO1xyXG4gIHN0YXR1c0NvbmZpZyA6IFN0YXR1c0NvbmZpZztcclxuICBzbWFsbFNjcmVlbiA9IGZhbHNlO1xyXG5cclxuICBpc0xvYWRDb21wbGV0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzUHJvY2Vzc2luZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBAT3V0cHV0KCkgaW5wdXRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgc2VsZWN0ZWRUYWJJbmRleCA9IDA7XHJcbiAgICBvblRhYkNoYW5nZShldmVudDogTWF0VGFiQ2hhbmdlRXZlbnQpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFRhYkluZGV4ID0gZXZlbnQuaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdEF1dG9SZWZyZXNoKCkge1xyXG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5kZXRhaWxzQ29uZmlnLmF1dG9SZWZyZXNoQ29uZmlnO1xyXG4gICAgaWYgKCFjb25maWcpIHJldHVybjtcclxuXHJcbiAgICAvLyBTZXQgaW5pdGlhbCBzdGF0ZSBiYXNlZCBvbiBkZWZhdWx0T24gY29uZmlndXJhdGlvblxyXG4gICAgdGhpcy5hdXRvUmVmcmVzaEVuYWJsZWQgPSBjb25maWcuZGVmYXVsdE9uIHx8IGZhbHNlO1xyXG5cclxuICAgIC8vIFN0YXJ0IGF1dG8tcmVmcmVzaCBpZiBlbmFibGVkIGJ5IGRlZmF1bHRcclxuICAgIGlmICh0aGlzLmF1dG9SZWZyZXNoRW5hYmxlZCkge1xyXG4gICAgICB0aGlzLnN0YXJ0QXV0b1JlZnJlc2goKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhcnRBdXRvUmVmcmVzaCgpIHtcclxuXHJcbiAgICBpZiAoIXRoaXMuZGV0YWlsc0NvbmZpZy5hdXRvUmVmcmVzaENvbmZpZykgcmV0dXJuO1xyXG4gICAgXHJcbiAgICBjb25zdCByZWZyZXNoSW50ZXJ2YWwgPSB0aGlzLmRldGFpbHNDb25maWcuYXV0b1JlZnJlc2hDb25maWcuaW50ZXJ2YWwgfHwgNTAwMDsgLy8gRGVmYXVsdCB0byA1IHNlY29uZHNcclxuICAgIFxyXG4gICAgLy8gQ2xlYXIgYW55IGV4aXN0aW5nIHN1YnNjcmlwdGlvblxyXG4gICAgdGhpcy5zdG9wQXV0b1JlZnJlc2goKTtcclxuICAgIFxyXG4gICAgLy8gQ3JlYXRlIG5ldyBzdWJzY3JpcHRpb25cclxuICAgIHRoaXMucmVmcmVzaFN1YnNjcmlwdGlvbiA9IGludGVydmFsKHJlZnJlc2hJbnRlcnZhbCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuaXNMb2FkQ29tcGxldGUgJiYgIXRoaXMuaXNQcm9jZXNzaW5nKSB7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoRGF0YSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RvcEF1dG9SZWZyZXNoKCkge1xyXG4gICAgaWYgKHRoaXMucmVmcmVzaFN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLnJlZnJlc2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgdGhpcy5yZWZyZXNoU3Vic2NyaXB0aW9uID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZUF1dG9SZWZyZXNoKCkge1xyXG4gICAgLy8gdGhpcy5hdXRvUmVmcmVzaEVuYWJsZWQgPSAhdGhpcy5hdXRvUmVmcmVzaEVuYWJsZWQ7XHJcbiAgICBcclxuICAgIGlmICh0aGlzLmF1dG9SZWZyZXNoRW5hYmxlZCkge1xyXG4gICAgICB0aGlzLnN0YXJ0QXV0b1JlZnJlc2goKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RvcEF1dG9SZWZyZXNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsb2FkRGF0YShhY3Rpb246IEFjdGlvbiwgY2F1c2VUYWJsZXNSZWxvYWQpIHtcclxuXHJcbiAgICBpZiAoYWN0aW9uICYmIHRoaXMubG9hZEJ5QWN0aW9uKSB7XHJcblxyXG4gICAgICB0aGlzLmRhdGFTZXJ2aWNlLkNhbGxBcGkoYWN0aW9uKS5zdWJzY3JpYmUoKGFwaVJlc3BvbnNlOiBBcGlSZXNwb25zZSkgPT4ge1xyXG5cclxuICAgICAgICBpZiAoYXBpUmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgICAgdGhpcy5kZXRhaWxzID0gYXBpUmVzcG9uc2UuZGF0YVxyXG4gICAgICAgICAgdGhpcy5pc0xvYWRDb21wbGV0ZSA9IHRydWU7XHJcbiAgICAgICAgICAvLyBEZXRhaWxzRGlhbG9nUHJvY2Vzc29yLnNldEhlcm9WYWx1ZSh0aGlzLmRldGFpbHNDb25maWcsIHRoaXMuZGV0YWlscyk7XHJcbiAgICAgICAgICBpZihjYXVzZVRhYmxlc1JlbG9hZCkgdGhpcy50YWJsZVJlbG9hZC5uZXh0KHRydWUpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZGV0YWlsc0NvbmZpZy5hdXRvUmVmcmVzaENvbmZpZztcclxuICAgICAgICAgIGlmICh0aGlzLmF1dG9SZWZyZXNoRW5hYmxlZCAmJiBjb25maWc/LnN0b3BDb25kaXRpb24gJiYgY29uZmlnLnN0b3BDb25kaXRpb24odGhpcy5kZXRhaWxzKSkge1xyXG4gICAgICAgICAgICB0aGlzLmF1dG9SZWZyZXNoRW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3BBdXRvUmVmcmVzaCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIkVycm9yOiBcIiArIGFwaVJlc3BvbnNlLm1lc3NhZ2UpO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmF1dG9SZWZyZXNoRW5hYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmF1dG9SZWZyZXNoRW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3BBdXRvUmVmcmVzaCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGlucHV0Q2hhbmdlZChldmVudCkge1xyXG4gICAgdGhpcy5pbnB1dENoYW5nZS5lbWl0KHsgZmllbGQ6IGV2ZW50LmZpZWxkLCB2YWx1ZTogZXZlbnQudmFsdWUgfSlcclxuICB9XHJcblxyXG5cclxuICBzZXRNb2RlKG5ld01vZGUpIHtcclxuICAgIHRoaXMuZm9ybUNvbmZpZy5tb2RlID0gbmV3TW9kZVxyXG4gICAgdGhpcy5zZXRUaXRsZUFjdGlvbigpXHJcbiAgfVxyXG5cclxuICBzZXRUaXRsZUFjdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmZvcm1Db25maWcuZml4ZWRUaXRsZSkge1xyXG4gICAgICB0aGlzLnRpdGxlQWN0aW9uID0gXCJcIjtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGl0bGVBY3Rpb24gPSB0aGlzLmJ1dHRvblNlcnZpY2UuZ2V0VGl0bGVBY3Rpb24odGhpcy5mb3JtQ29uZmlnLm1vZGUsIHRoaXMuYnV0dG9ucyk7XHJcbiAgfVxyXG5cclxuICBnZXRCdXR0b24obmFtZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5idXR0b25TZXJ2aWNlLmdldEJ1dHRvbih0aGlzLmJ1dHRvbnMsIG5hbWUpO1xyXG4gIH1cclxuXHJcbiAgdGVzdERpc2FibGVkKHJvdywgYnV0dG9uTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbihidXR0b25OYW1lKTtcclxuXHJcbiAgICBpZiAoIWJ1dHRvbikgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGJ1dHRvbiB3aXRoIGNvbXBvbmVudCdzIGRldGFpbHNDb25maWdcclxuICAgIGNvbnN0IGJ1dHRvbldpdGhDb25maWcgPSB7XHJcbiAgICAgIC4uLmJ1dHRvbixcclxuICAgICAgZGV0YWlsc0NvbmZpZzogYnV0dG9uLmRldGFpbHNDb25maWcgPyB7IC4uLmJ1dHRvbi5kZXRhaWxzQ29uZmlnIH0gOiB0aGlzLmRldGFpbHNDb25maWdcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuYnV0dG9uU2VydmljZS50ZXN0RGlzYWJsZWQoYnV0dG9uV2l0aENvbmZpZywgcm93KTtcclxuICB9XHJcblxyXG5cclxuICB0ZXN0VmlzaWJsZShyb3csIGJ1dHRvbk5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYnV0dG9uID0gdGhpcy5nZXRCdXR0b24oYnV0dG9uTmFtZSk7XHJcbiAgICBpZiAoIWJ1dHRvbikgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGJ1dHRvbiB3aXRoIGNvbXBvbmVudCdzIGRldGFpbHNDb25maWdcclxuICAgIGNvbnN0IGJ1dHRvbldpdGhDb25maWcgPSB7XHJcbiAgICAgIC4uLmJ1dHRvbixcclxuICAgICAgZGV0YWlsc0NvbmZpZzogYnV0dG9uLmRldGFpbHNDb25maWcgPyB7IC4uLmJ1dHRvbi5kZXRhaWxzQ29uZmlnIH0gOiB0aGlzLmRldGFpbHNDb25maWdcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuYnV0dG9uU2VydmljZS50ZXN0VmlzaWJsZShidXR0b25XaXRoQ29uZmlnLCByb3cpXHJcbiAgfVxyXG5cclxuICB0ZXN0VmlzaWJsZVRhYih0YmxDb25maWc6IFRhYmxlQ29uZmlnKTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKCF0aGlzLnRhYmxlQ29uZmlnU2VydmljZS5oYXNUYWJsZUFjY2Vzcyh0YmxDb25maWcpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5idXR0b25TZXJ2aWNlLmlzVGFiVmlzaWJsZSh0YmxDb25maWcsIHRoaXMuZGV0YWlscyk7XHJcbiAgfVxyXG5cclxuICBnZXRCdXR0b25Db2xvcihidXR0b246IEJ1dHRvbiwgcm93KSB7XHJcbiAgICByZXR1cm4gdGhpcy5idXR0b25TZXJ2aWNlLmdldEJ1dHRvbkNvbG9yKGJ1dHRvbiwgcm93KTtcclxuICB9XHJcblxyXG4gIGdldFZpc2libGVGaWVsZHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29uZmlnLmZpZWxkcz8uZmlsdGVyKHggPT4gQ29yZS50ZXN0VmlzaWJsZSh0aGlzLmZvcm1Db25maWcsIHRoaXMuZGV0YWlscywgeCwgdGhpcy5hdXRoU2VydmljZS5jdXJyZW50Um9sZVNvdXJjZS52YWx1ZSkpXHJcbiAgfVxyXG5cclxuXHJcbiAgY3JlYXRlKCkge1xyXG4gICAgdGhpcy5oYW5kbGVCdXR0b25BY3Rpb24oJ2NyZWF0ZScpO1xyXG4gIH1cclxuXHJcbiAgZWRpdCgpIHtcclxuICAgIHRoaXMuaGFuZGxlQnV0dG9uQWN0aW9uKCdlZGl0Jyk7XHJcbiAgfVxyXG5cclxuICBkZWxldGUoKSB7XHJcbiAgICBjb25zdCBidXR0b24gPSB0aGlzLmJ1dHRvblNlcnZpY2UuZ2V0QnV0dG9uKHRoaXMuYnV0dG9ucywgJ2RlbGV0ZScpO1xyXG4gICAgaWYgKCFidXR0b24pIHJldHVybjtcclxuXHJcbiAgICBsZXQgY29uZmlybU1lc3NhZ2UgPSB0aGlzLmJ1dHRvblNlcnZpY2UuZ2V0Q29uZmlybU1lc3NhZ2UoYnV0dG9uLCB0aGlzLmRldGFpbHMpO1xyXG4gICAgaWYgKCFjb25maXJtTWVzc2FnZSkge1xyXG4gICAgICBjb25maXJtTWVzc2FnZSA9IGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlID9gO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuY29uZmlybShjb25maXJtTWVzc2FnZSkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdCA9PSBcInllc1wiKSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVCdXR0b25BY3Rpb24oJ2RlbGV0ZScpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBjdXN0b20oYnV0dG9uOiBCdXR0b24pIHtcclxuICAgIGlmIChidXR0b24uZGlhbG9nICYmIGJ1dHRvbi5kZXRhaWxzQ29uZmlnKSB7XHJcbiAgICAgIHRoaXMub3Blbk5lc3RlZERldGFpbHNEaWFsb2coYnV0dG9uKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlQnV0dG9uQWN0aW9uKGJ1dHRvbi5uYW1lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3Blbk5lc3RlZERldGFpbHNEaWFsb2coYnV0dG9uOiBCdXR0b24pOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbkNvbmZpZ3VyZWREZXRhaWxzRGlhbG9nKGJ1dHRvbiwgdGhpcy5kZXRhaWxzLCBEZXRhaWxzRGlhbG9nTGl0ZSkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcblxyXG4gICAgICBpZiAocmVzdWx0LmFjdGlvbiA9PT0gJ2lucHV0Q2hhbmdlJykge1xyXG4gICAgICAgIHRoaXMuaW5wdXRDaGFuZ2VkKHJlc3VsdC5jaGFuZ2UpO1xyXG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdCAmJiByZXN1bHQubWVzc2FnZSA9PT0gJ3N1Y2Nlc3MnKSB7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoRGF0YSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZnJlc2hEYXRhKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZm9ybUNvbmZpZy5sb2FkQWN0aW9uKSB7XHJcbiAgICAgIHRoaXMubG9hZERhdGEodGhpcy5mb3JtQ29uZmlnLmxvYWRBY3Rpb24sIHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlQnV0dG9uQWN0aW9uKGJ1dHRvbk5hbWU6IHN0cmluZykge1xyXG4gICAgXHJcbiAgICBjb25zdCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbihidXR0b25OYW1lKTtcclxuICAgIGlmICghYnV0dG9uKSByZXR1cm47XHJcbiAgIFxyXG5cclxuICAgIGlmIChidXR0b24ub25DbGljaykge1xyXG4gICAgICBidXR0b24ub25DbGljayh0aGlzLmRldGFpbHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucHJvY2Vzc0J1dHRvbkFjdGlvbihidXR0b24pO1xyXG4gIH1cclxuXHJcbiAgcHJvY2Vzc0J1dHRvbkFjdGlvbihidXR0b24gOiBCdXR0b24pIHtcclxuICAgIGlmICghYnV0dG9uLmFjdGlvbikge1xyXG4gICAgICBpZiAoIWJ1dHRvbi5rZWVwT3Blbikge1xyXG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHsgbWVzc2FnZTogJ2VtaXQnLCBkYXRhOiB0aGlzLmRldGFpbHMgfSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChidXR0b24uc2tpcFZhbGlkYXRpb24gfHwgdGhpcy52YWxpZGF0ZUZvcm0oKSkge1xyXG4gICAgICB0aGlzLmV4ZWN1dGVBY3Rpb24oYnV0dG9uLCB0aGlzLmRldGFpbHMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB2YWxpZGF0ZUZvcm0oKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdmFsaWRhdGlvblJlc3VsdCA9IENvcmUudmFsaWRhdGVPYmplY3QodGhpcy5nZXRWaXNpYmxlRmllbGRzKCksIHRoaXMuZGV0YWlscyk7XHJcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdCAhPT0gJycpIHtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdCh2YWxpZGF0aW9uUmVzdWx0KTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpbGVzLmxlbmd0aCA8IDEgJiYgdGhpcy5maWxlRmllbGQ/LnJlcXVpcmVkICYmIHRoaXMuZm9ybUNvbmZpZy5tb2RlID09PSAnY3JlYXRlJykge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiUGxlYXNlIGF0dGFjaCBmaWxlKHMpXCIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVmFsaWRhdGUgY29tcG9zaXRlIGZpZWxkc1xyXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiB0aGlzLmdldFZpc2libGVGaWVsZHMoKSkge1xyXG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2NvbXBvc2l0ZScpIHtcclxuICAgICAgICB2YWxpZGF0aW9uUmVzdWx0ID0gQ29yZS52YWxpZGF0ZU9iamVjdChDb3JlLmdldFZpc2libGVTdWJmaWVsZHModGhpcy5mb3JtQ29uZmlnLCB0aGlzLmRldGFpbHMsIGZpZWxkLCB0aGlzLmF1dGhTZXJ2aWNlLmN1cnJlbnRSb2xlU291cmNlLnZhbHVlKSwgdGhpcy5kZXRhaWxzLCApO1xyXG4gICAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0ICE9PSAnJykge1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdCh2YWxpZGF0aW9uUmVzdWx0KTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZUFjdGlvbkRhdGEoYnV0dG9uOiBCdXR0b24sIGRhdGE6IGFueSk6IGFueSB7XHJcbiAgICBpZiAodGhpcy5idXR0b25TZXJ2aWNlLmlzRm9ybUJ1dHRvbihidXR0b24pKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChgdXBsb2FkRmlsZSR7aX1gLCB0aGlzLmZpbGVzW2ldLCB0aGlzLmZpbGVzW2ldLm5hbWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGZvcm1EYXRhLmFwcGVuZChcImRhdGFcIiwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICByZXR1cm4gZm9ybURhdGE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXhlY3V0ZUFjdGlvbihidXR0b246IEJ1dHRvbiwgZGF0YTogYW55KSB7XHJcbiAgICBjb25zdCBhY3Rpb25EYXRhID0gdGhpcy5wcmVwYXJlQWN0aW9uRGF0YShidXR0b24sIGRhdGEpO1xyXG5cclxuICAgIGlmIChidXR0b24uY29uZmlybSkge1xyXG4gICAgICBsZXQgY29uZmlybU1lc3NhZ2UgPSB0aGlzLmJ1dHRvblNlcnZpY2UuZ2V0Q29uZmlybU1lc3NhZ2UoYnV0dG9uLCB0aGlzLmRldGFpbHMpO1xyXG5cclxuICAgICAgaWYgKCFjb25maXJtTWVzc2FnZSAmJiBidXR0b24ubmFtZSA9PSAnZGVsZXRlJykge1xyXG4gICAgICAgIGNvbmZpcm1NZXNzYWdlID0gYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgP2A7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuY29uZmlybShjb25maXJtTWVzc2FnZSkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0ID09IFwieWVzXCIpIHtcclxuICAgICAgICAgIHRoaXMucGVyZm9ybUFwaUNhbGwoYnV0dG9uLCBhY3Rpb25EYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucGVyZm9ybUFwaUNhbGwoYnV0dG9uLCBhY3Rpb25EYXRhKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBlcmZvcm1BcGlDYWxsKGJ1dHRvbjogQnV0dG9uLCBkYXRhOiBhbnkpIHtcclxuICAgIHRoaXMuZGF0YVNlcnZpY2UuQ2FsbEFwaShidXR0b24uYWN0aW9uLCBkYXRhKS5zdWJzY3JpYmUoKGFwaVJlc3BvbnNlOiBBcGlSZXNwb25zZSkgPT4ge1xyXG5cclxuICAgICAgaWYgKGFwaVJlc3BvbnNlLmRhdGEpe1xyXG4gICAgICAgIHRoaXMuZGV0YWlscyA9IGFwaVJlc3BvbnNlLmRhdGE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChhcGlSZXNwb25zZS5zdWNjZXNzKSB7XHJcblxyXG4gICAgICAgIGlmIChhcGlSZXNwb25zZS5tZXNzYWdlLmluY2x1ZGVzKFwiYXBwcm92YWxcIikgfHwgYXBpUmVzcG9uc2UubWVzc2FnZS5pbmNsdWRlcyhcImFwcHJvdmVcIikgfHwgYXBpUmVzcG9uc2UubWVzc2FnZS5pbmNsdWRlcyhcImRlY2xpbmVcIikpIHtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoYXBpUmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChidXR0b24uYWN0aW9uLnN1Y2Nlc3NNZXNzYWdlKSB7XHJcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KGJ1dHRvbi5hY3Rpb24uc3VjY2Vzc01lc3NhZ2UpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoYXBpUmVzcG9uc2UubWVzc2FnZSAhPSBcInN1Y2Nlc3NcIiAmJiBhcGlSZXNwb25zZS5tZXNzYWdlICE9IFwiXCIpIHtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoYXBpUmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoXCJVcGRhdGVkXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGJ1dHRvbi5vblN1Y2Nlc3MpIHtcclxuICAgICAgICAgIGJ1dHRvbi5vblN1Y2Nlc3MoYXBpUmVzcG9uc2UuZGF0YSwgdGhpcy5kZXRhaWxzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChidXR0b24ua2VlcE9wZW4pIHtcclxuICAgICAgICAgIGlmIChidXR0b24ubmFtZSA9PT0gJ2NyZWF0ZScgJiYgYXBpUmVzcG9uc2UuZGF0YSkge1xyXG4gICAgICAgICAgICB0aGlzLmRldGFpbHMgPSBhcGlSZXNwb25zZS5kYXRhO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHRoaXMuZGV0YWlsc0NvbmZpZy5oZXJvRmllbGQgJiYgYXBpUmVzcG9uc2UuZGF0YVt0aGlzLmRldGFpbHNDb25maWcuaGVyb0ZpZWxkXSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuZGV0YWlsc0NvbmZpZy5oZXJvVmFsdWUgPSBhcGlSZXNwb25zZS5kYXRhW3RoaXMuZGV0YWlsc0NvbmZpZy5oZXJvRmllbGRdO1xyXG4gICAgICAgICAgICAgIHRoaXMuZm9ybUNvbmZpZy5oZXJvRmllbGQgPSB0aGlzLmRldGFpbHNDb25maWcuaGVyb0ZpZWxkO1xyXG4gICAgICAgICAgICAgIHRoaXMuZm9ybUNvbmZpZy5oZXJvVmFsdWUgPSB0aGlzLmRldGFpbHNDb25maWcuaGVyb1ZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLmZvcm1Db25maWcubW9kZSA9ICdlZGl0JztcclxuICAgICAgICAgICAgdGhpcy5zZXRUaXRsZUFjdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmlzTG9hZENvbXBsZXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh7IG1lc3NhZ2U6ICdzdWNjZXNzJywgZGF0YTogeyAuLi5hcGlSZXNwb25zZSwgZGF0YTogYnV0dG9uLm5hbWUgPT0gJ2NyZWF0ZScgPyBhcGlSZXNwb25zZS5kYXRhIDogdGhpcy5kZXRhaWxzICB9IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiRXJyb3I6IFwiICsgYXBpUmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2xvc2VQb3NpdGlvbigpOiAndG9wJyB8ICdib3R0b20nIHtcclxuICAgIHJldHVybiB0aGlzLmRldGFpbHNDb25maWcuY2xvc2VPcHRpb25zPy5wb3NpdGlvbiB8fCAnYm90dG9tJztcclxuICB9XHJcblxyXG4gIGdldENsb3NlVGV4dCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZGV0YWlsc0NvbmZpZy5jbG9zZU9wdGlvbnM/LnRleHQgfHwgJ0NhbmNlbCc7XHJcbiAgfVxyXG5cclxuICBzaG91bGRTaG93VG9wQ2xvc2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRDbG9zZVBvc2l0aW9uKCkgPT09ICd0b3AnO1xyXG4gIH1cclxuXHJcbiAgc2hvdWxkU2hvd0JvdHRvbUNsb3NlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2xvc2VQb3NpdGlvbigpID09PSAnYm90dG9tJztcclxuICB9XHJcblxyXG4gIGNsb3NlKCl7XHJcbiAgICBpZiAodGhpcy5kZXRhaWxzQ29uZmlnLnJlZnJlc2hPbkNsb3NlKXtcclxuICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoeyBtZXNzYWdlOiAnc3VjY2VzcycsIGRhdGE6IHRoaXMuZGV0YWlscyB9KTtcclxuICAgIH1lbHNle1xyXG4gICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh7IG1lc3NhZ2U6ICdlbWl0JywgZGF0YTogdGhpcy5kZXRhaWxzIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn07XHJcblxyXG5cclxuXHJcbiIsIjxkaXYgY2xhc3M9XCJkaWFsb2ctY29udGFpbmVyXCI+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJkaWFsb2ctY29udGVudFwiPlxyXG5cclxuICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJpbmRldGVybWluYXRlXCIgKm5nSWY9XCJpc1Byb2Nlc3NpbmcgJiYgZGF0YVNlcnZpY2UuYXBwQ29uZmlnLnByb2dyZXNzTGluZVwiPjwvbWF0LXByb2dyZXNzLWJhcj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yXCI+XHJcblxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMjBweDsgZm9udC13ZWlnaHQ6NTAwO21hcmdpbi1ib3R0b206IDEwcHg7XCI+e3t0aXRsZUFjdGlvbiB8IHRpdGxlY2FzZX19IHt7Zm9ybUNvbmZpZz8udGl0bGV9fTwvbGFiZWw+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuXHJcbiAgICAgICAgPHNwYS1jaGVjayAqbmdJZj1cImRldGFpbHNDb25maWcuYXV0b1JlZnJlc2hDb25maWdcIiBkaXNwbGF5PVwiQXV0byBSZWZyZXNoXCIgWyh2YWx1ZSldPVwiYXV0b1JlZnJlc2hFbmFibGVkXCIgKHZhbHVlQ2hhbmdlKT1cInRvZ2dsZUF1dG9SZWZyZXNoKClcIj48L3NwYS1jaGVjaz5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImZvcm1Db25maWcubW9kZT09J3ZpZXcnICYmIGVkaXRCdXR0b24gJiYgdGVzdFZpc2libGUoZGV0YWlscyxlZGl0QnV0dG9uLm5hbWUpXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIG1hdFRvb2x0aXA9XCJFZGl0XCIgY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cInNldE1vZGUoJ2VkaXQnKVwiIFtkaXNhYmxlZF09XCJ0ZXN0RGlzYWJsZWQoZGV0YWlscyxlZGl0QnV0dG9uLm5hbWUpXCI+PG1hdC1pY29uPmVkaXQ8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJpc1Byb2Nlc3NpbmdcIiAqbmdJZj1cImxvYWRCeUFjdGlvblwiIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIG1hdFRvb2x0aXA9XCJSZWZyZXNoXCIgY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImxvYWREYXRhKGZvcm1Db25maWcubG9hZEFjdGlvbiwgZGV0YWlsc0NvbmZpZy5jYXVzZVRhYmxlUmVmcmVzaClcIj48bWF0LWljb24gY2xhc3M9XCJyZWZyZXNoSWNvblwiPmNhY2hlZDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgXHJcbiAgICAgICAgPCEtLSBBZGRlZDogVG9wIGNsb3NlIGJ1dHRvbiB3aGVuIHBvc2l0aW9uIGlzICd0b3AnIC0tPlxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJzaG91bGRTaG93VG9wQ2xvc2UoKVwiIFtkaXNhYmxlZF09XCJpc1Byb2Nlc3NpbmdcIiBtYXQtaWNvbi1idXR0b24gbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiBtYXRUb29sdGlwPVwiQ2xvc2VcIiAoY2xpY2spPVwiY2xvc2UoKVwiPjxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+PC9idXR0b24+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2PlxyXG4gICAgICA8c3BhLXN0ZXBzICpuZ0lmPVwic3RlcENvbmZpZyAmJiBkZXRhaWxzICYmIHN0ZXBDb25maWcuc3RpY2t5XCIgW2NvbmZpZ109XCJzdGVwQ29uZmlnXCIgW2RhdGFdPVwiZGV0YWlsc1wiPjwvc3BhLXN0ZXBzPlxyXG4gICAgICA8c3BhLXN0YXR1c2VzICpuZ0lmPVwic3RhdHVzQ29uZmlnICYmIGRldGFpbHMgJiYgc3RhdHVzQ29uZmlnPy5zdGlja3lcIiBbY29uZmlnXT1cInN0YXR1c0NvbmZpZ1wiIFtkYXRhXT1cImRldGFpbHNcIj48L3NwYS1zdGF0dXNlcz5cclxuICAgICAgPHNwYS1hbGVydCAqbmdJZj1cImZvcm1Db25maWcuYWxlcnRDb25maWcgJiYgZm9ybUNvbmZpZy5hbGVydENvbmZpZz8uc3RpY2t5XCIgW2NvbmZpZ109XCJmb3JtQ29uZmlnLmFsZXJ0Q29uZmlnXCIgW2RhdGFdPVwiZGV0YWlsc1wiPjwvc3BhLWFsZXJ0PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG1hdC1kaWFsb2ctY29udGVudCBjbGFzcz1cIm1hdC10eXBvZ3JhcGh5IGRpYWxvZy1zY3JvbGwtY29udGVudFwiPlxyXG5cclxuICAgICAgPHNwYS1zdGVwcyAqbmdJZj1cInN0ZXBDb25maWcgJiYgZGV0YWlscyAmJiAhc3RlcENvbmZpZy5zdGlja3lcIiBbY29uZmlnXT1cInN0ZXBDb25maWdcIiBbZGF0YV09XCJkZXRhaWxzXCI+PC9zcGEtc3RlcHM+XHJcbiAgICAgIDxzcGEtc3RhdHVzZXMgKm5nSWY9XCJzdGF0dXNDb25maWcgJiYgZGV0YWlscyAmJiAhc3RhdHVzQ29uZmlnPy5zdGlja3lcIiBbY29uZmlnXT1cInN0YXR1c0NvbmZpZ1wiIFtkYXRhXT1cImRldGFpbHNcIj48L3NwYS1zdGF0dXNlcz5cclxuICAgICAgPHNwYS1hbGVydCAqbmdJZj1cImZvcm1Db25maWcuYWxlcnRDb25maWcgJiYgIWZvcm1Db25maWcuYWxlcnRDb25maWc/LnN0aWNreVwiIFtjb25maWddPVwiZm9ybUNvbmZpZy5hbGVydENvbmZpZ1wiIFtkYXRhXT1cImRldGFpbHNcIj48L3NwYS1hbGVydD5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0aW4taW5wdXRcIiBzdHlsZT1cImZvbnQtc2l6ZToxNHB4XCI+XHJcblxyXG4gICAgICAgICA8cCAqbmdJZj1cImZvcm1Db25maWcgJiYgIWRldGFpbHNcIj48ZW0+TG9hZGluZy4uLjwvZW0+PC9wPlxyXG5cclxuICAgICAgICA8c3BhLWZvcm0gKm5nSWY9XCJmb3JtQ29uZmlnICYmIGRldGFpbHNcIiBbZmlsZXNdPVwiZmlsZXNcIiBbZGF0YV09XCJkZXRhaWxzXCIgW2NvbmZpZ109XCJmb3JtQ29uZmlnXCIgKGlucHV0Q2hhbmdlKT1cImlucHV0Q2hhbmdlZCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2R5bmFtaWNTZWxlY3QgbGV0LWZpZWxkPVwiZmllbGRcIiBsZXQtZGF0YT1cImRhdGFcIiBsZXQtdGVzdFJlYWRPbmx5PVwidGVzdFJlYWRPbmx5XCIgbGV0LXRlc3RSZXF1aXJlZD1cInRlc3RSZXF1aXJlZFwiIGxldC1zZWxlY3RDaGFuZ2VkPVwic2VsZWN0Q2hhbmdlZFwiPlxyXG4gICAgICAgICAgICA8c3BhLXNlbGVjdC1saXRlXHJcbiAgICAgICAgICAgICAgW2Rpc3BsYXldPVwiZmllbGQuYWxpYXMgPz8gZmllbGQubmFtZSB8IGNhbWVsVG9Xb3Jkc1wiXHJcbiAgICAgICAgICAgICAgW3dpZHRoXT1cImZpZWxkLndpZHRoXCJcclxuICAgICAgICAgICAgICBbbnVsbGFibGVdPVwiZmllbGQubnVsbGFibGVcIlxyXG4gICAgICAgICAgICAgIFtvcHRpb25zXT1cImZpZWxkLm9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgIFttYXN0ZXJPcHRpb25zXT1cImZpZWxkLm1hc3Rlck9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgIFttYXN0ZXJGaWVsZF09XCJmaWVsZC5tYXN0ZXJGaWVsZFwiXHJcbiAgICAgICAgICAgICAgW29wdGlvbkRpc3BsYXldPVwiZmllbGQub3B0aW9uRGlzcGxheSA/PyAnbmFtZSdcIlxyXG4gICAgICAgICAgICAgIFtvcHRpb25WYWx1ZV09XCJmaWVsZC5vcHRpb25WYWx1ZSA/PyAndmFsdWUnXCJcclxuICAgICAgICAgICAgICBbKHZhbHVlKV09XCJkYXRhW2ZpZWxkLm5hbWVdXCJcclxuICAgICAgICAgICAgICBbZGVmYXVsdEZpcnN0VmFsdWVdPVwiZmllbGQuZGVmYXVsdEZpcnN0VmFsdWVcIlxyXG4gICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJ0ZXN0UmVxdWlyZWQoZmllbGQpXCJcclxuICAgICAgICAgICAgICBbcmVhZG9ubHldPVwidGVzdFJlYWRPbmx5KGZpZWxkKVwiXHJcbiAgICAgICAgICAgICAgW2hpbnRdPVwiZmllbGQuaGludFwiXHJcbiAgICAgICAgICAgICAgW2xvYWRBY3Rpb25dPVwiZmllbGQubG9hZEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgW2xvYWRJREZpZWxkXT1cImZpZWxkLmxvYWRJREZpZWxkXCJcclxuICAgICAgICAgICAgICBbZmllbGRdPVwiZmllbGRcIlxyXG4gICAgICAgICAgICAgIFtkYXRhXT1cImRhdGFcIlxyXG4gICAgICAgICAgICAgIFtpbmZvTWVzc2FnZV09XCJmaWVsZC5pbmZvTWVzc2FnZVwiXHJcbiAgICAgICAgICAgICAgW2NvcHlDb250ZW50XT1cImZpZWxkLmNvcHlDb250ZW50XCJcclxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwic2VsZWN0Q2hhbmdlZChmaWVsZClcIlxyXG4gICAgICAgICAgICA+PC9zcGEtc2VsZWN0LWxpdGU+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvc3BhLWZvcm0+XHJcblxyXG5cclxuICAgICAgICA8IS0tIDxtYXQtdGFiLWdyb3VwICpuZ0lmPVwidGFibGVDb25maWdzXCI+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGJsIG9mIHRhYmxlQ29uZmlnU2VydmljZS5nZXRWaXNpYmxlVGFibGVDb25maWdzKHRhYmxlQ29uZmlncylcIj5cclxuICAgICAgICAgICAgPG1hdC10YWIgKm5nSWY9XCJ0ZXN0VmlzaWJsZVRhYih0YmwpXCI+XHJcblxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRUYWJMYWJlbD5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7dGJsLnRhYlRpdGxlID8/ICdVbnRpdGxlZCd9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICA8c3BhLXRhYmxlLWludGVybmFsIFtjb25maWddPVwidGJsXCIgW3JlbG9hZF09XCJ0YWJsZVJlbG9hZFwiIChkYXRhTG9hZCk9XCJsb2FkRGF0YShmb3JtQ29uZmlnLmxvYWRBY3Rpb24sIGZhbHNlKVwiPjwvc3BhLXRhYmxlLWludGVybmFsPlxyXG5cclxuICAgICAgICAgICAgPC9tYXQtdGFiPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwvbWF0LXRhYi1ncm91cD4gLS0+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L21hdC1kaWFsb2ctY29udGVudD5cclxuXHJcblxyXG4gIDwvZGl2PlxyXG5cclxuICA8bWF0LWRpYWxvZy1hY3Rpb25zPlxyXG5cclxuICAgIDxkaXY+XHJcblxyXG4gICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIFtkaXNhYmxlZF09XCJpc1Byb2Nlc3NpbmdcIiAqbmdJZj1cImZvcm1Db25maWcubW9kZT09J2NyZWF0ZScgJiYgY3JlYXRlQnV0dG9uXCIgY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImNyZWF0ZSgpXCIgY2RrRm9jdXNJbml0aWFsPnt7Y3JlYXRlQnV0dG9uLmRpc3BsYXkgPz8gJ1N1Ym1pdCd9fVxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gW2Rpc2FibGVkXT1cImlzUHJvY2Vzc2luZ1wiICpuZ0lmPVwiZm9ybUNvbmZpZy5tb2RlPT0nZWRpdCcgJiYgZWRpdEJ1dHRvblwiIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJlZGl0KClcIiBjZGtGb2N1c0luaXRpYWw+e3tlZGl0QnV0dG9uLmRpc3BsYXkgPz8gJ1N1Ym1pdCd9fVxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ0biBvZiBleHRyYUJ1dHRvbnNcIj5cclxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZm9ybUNvbmZpZy5tb2RlICE9PSAnY3JlYXRlJyAmJiB0ZXN0VmlzaWJsZShkZXRhaWxzLGJ0bi5uYW1lKVwiIG1hdC1zdHJva2VkLWJ1dHRvbiBbZGlzYWJsZWRdPVwiaXNQcm9jZXNzaW5nIHx8IHRlc3REaXNhYmxlZChkZXRhaWxzLGJ0bi5uYW1lKVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOiBnZXRCdXR0b25Db2xvcihidG4sIGRldGFpbHMpfVwiIChjbGljayk9XCJjdXN0b20oYnRuKVwiIGNka0ZvY3VzSW5pdGlhbD5cclxuICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImJ0bi5pY29uXCIgW25nU3R5bGVdPVwieydjb2xvcic6IGdldEJ1dHRvbkNvbG9yKGJ0biwgZGV0YWlscyl9XCI+e3tidG4uaWNvbi5uYW1lfX08L21hdC1pY29uPlxyXG4gICAgICAgICAge3tidG4uZGlzcGxheSA/PyBidG4ubmFtZSB8IHRpdGxlY2FzZX19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPCEtLSBDaGFuZ2VkOiBCb3R0b20gY2xvc2UgYnV0dG9uIG5vdyB1c2VzIGNvbmRpdGlvbmFsIGRpc3BsYXkgYW5kIGN1c3RvbSB0ZXh0IC0tPlxyXG4gICAgICA8YnV0dG9uICpuZ0lmPVwic2hvdWxkU2hvd0JvdHRvbUNsb3NlKClcIiBtYXQtc3Ryb2tlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImNsb3NlKClcIj57e2dldENsb3NlVGV4dCgpfX08L2J1dHRvbj5cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCIgKm5nSWY9XCJzbWFsbFNjcmVlblwiPlxyXG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIG1hdFRvb2x0aXA9XCJEZWxldGVcIiBbZGlzYWJsZWRdPVwiaXNQcm9jZXNzaW5nXCIgc3R5bGU9XCJjb2xvcjogcmVkO1wiIChjbGljayk9XCJkZWxldGUoKVwiICpuZ0lmPVwiZm9ybUNvbmZpZy5tb2RlIT0nY3JlYXRlJyAgJiYgZGVsZXRlQnV0dG9uXCI+PG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG4gIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxyXG5cclxuXHJcbjwvZGl2PlxyXG4iXX0=
|