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,568 +0,0 @@
|
|
|
1
|
-
import { DetailsSource, RoleAccess } from "./Classes";
|
|
2
|
-
export class Core {
|
|
3
|
-
static deepClone(obj) {
|
|
4
|
-
if (obj === null || typeof obj !== 'object') {
|
|
5
|
-
return obj;
|
|
6
|
-
}
|
|
7
|
-
if (Array.isArray(obj)) {
|
|
8
|
-
const arrCopy = [];
|
|
9
|
-
obj.forEach((item, index) => {
|
|
10
|
-
arrCopy[index] = this.deepClone(item);
|
|
11
|
-
});
|
|
12
|
-
return arrCopy;
|
|
13
|
-
}
|
|
14
|
-
const objCopy = {};
|
|
15
|
-
Object.keys(obj).forEach(key => {
|
|
16
|
-
objCopy[key] = this.deepClone(obj[key]);
|
|
17
|
-
});
|
|
18
|
-
return objCopy;
|
|
19
|
-
}
|
|
20
|
-
static deepClone2(obj) {
|
|
21
|
-
// Create new WeakMap for each clone operation
|
|
22
|
-
const cloneVisited = new WeakMap();
|
|
23
|
-
// Inner function that has access to the cloneVisited map
|
|
24
|
-
const clone = (value) => {
|
|
25
|
-
// Handle null, undefined and primitives
|
|
26
|
-
if (value === null || typeof value !== 'object') {
|
|
27
|
-
return value;
|
|
28
|
-
}
|
|
29
|
-
// Check if object was already cloned
|
|
30
|
-
if (cloneVisited.has(value)) {
|
|
31
|
-
return cloneVisited.get(value);
|
|
32
|
-
}
|
|
33
|
-
// Handle arrays
|
|
34
|
-
if (Array.isArray(value)) {
|
|
35
|
-
const arrCopy = [];
|
|
36
|
-
cloneVisited.set(value, arrCopy);
|
|
37
|
-
value.forEach((item, index) => {
|
|
38
|
-
arrCopy[index] = clone(item);
|
|
39
|
-
});
|
|
40
|
-
return arrCopy;
|
|
41
|
-
}
|
|
42
|
-
// Handle dates
|
|
43
|
-
if (value instanceof Date) {
|
|
44
|
-
return new Date(value);
|
|
45
|
-
}
|
|
46
|
-
// Handle regular objects
|
|
47
|
-
const objCopy = Object.create(Object.getPrototypeOf(value));
|
|
48
|
-
cloneVisited.set(value, objCopy);
|
|
49
|
-
Object.entries(value).forEach(([key, val]) => {
|
|
50
|
-
if (Object.prototype.hasOwnProperty.call(value, key)) {
|
|
51
|
-
objCopy[key] = clone(val);
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
return objCopy;
|
|
55
|
-
};
|
|
56
|
-
// Start the clone operation with a fresh WeakMap
|
|
57
|
-
return clone(obj);
|
|
58
|
-
}
|
|
59
|
-
static camelToWords(value) {
|
|
60
|
-
if (!value)
|
|
61
|
-
return value;
|
|
62
|
-
if (typeof value !== 'string')
|
|
63
|
-
return value;
|
|
64
|
-
if (value.length == 0)
|
|
65
|
-
return value;
|
|
66
|
-
let v = value.charAt(0).toUpperCase() + value.substring(1);
|
|
67
|
-
return v.replace(/([A-Z]+)*([A-Z][a-z])/g, "$1 $2");
|
|
68
|
-
}
|
|
69
|
-
static generateObject(fields) {
|
|
70
|
-
let data = {};
|
|
71
|
-
fields.forEach(field => {
|
|
72
|
-
if (field.type != 'section' && field.type != 'blank') {
|
|
73
|
-
data[field.name] = this.getInitialValue(field);
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
// console.log(data)
|
|
77
|
-
return data;
|
|
78
|
-
}
|
|
79
|
-
static resetObject(fields, data) {
|
|
80
|
-
fields.forEach(field => {
|
|
81
|
-
if (field.type != 'section' && field.type != 'blank') {
|
|
82
|
-
data[field.name] = this.getInitialValue(field);
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
static checkSecurity(security, currentRole) {
|
|
87
|
-
if (!security) {
|
|
88
|
-
return true;
|
|
89
|
-
}
|
|
90
|
-
if (security.deny?.some(role => currentRole[role.name])) {
|
|
91
|
-
return false;
|
|
92
|
-
}
|
|
93
|
-
if (!security.allow || security.allow.length === 0) {
|
|
94
|
-
return true;
|
|
95
|
-
}
|
|
96
|
-
return security.allow.some(role => currentRole[role.name]);
|
|
97
|
-
}
|
|
98
|
-
static hasFormAccess(formConfig, currentRole) {
|
|
99
|
-
return this.getFormAccess(formConfig, currentRole) > RoleAccess.None;
|
|
100
|
-
}
|
|
101
|
-
static getFormAccess(formConfig, currentRole) {
|
|
102
|
-
if (!formConfig?.security?.allow) {
|
|
103
|
-
return RoleAccess.Full; // Full access if no restrictions
|
|
104
|
-
}
|
|
105
|
-
// Check deny first
|
|
106
|
-
if (formConfig.security.deny?.some(role => this.getRoleAccess(currentRole, role.name) > RoleAccess.None)) {
|
|
107
|
-
return RoleAccess.None;
|
|
108
|
-
}
|
|
109
|
-
// Get highest level of access from allowed capabilities
|
|
110
|
-
let maxAccess = RoleAccess.None;
|
|
111
|
-
formConfig.security.allow.forEach(role => {
|
|
112
|
-
const access = this.getRoleAccess(currentRole, role.name);
|
|
113
|
-
if (access > maxAccess) {
|
|
114
|
-
maxAccess = access;
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
return maxAccess;
|
|
118
|
-
}
|
|
119
|
-
static getRoleAccess(role, capName) {
|
|
120
|
-
if (!role || !capName)
|
|
121
|
-
return RoleAccess.None;
|
|
122
|
-
return role[capName] ?? RoleAccess.None;
|
|
123
|
-
}
|
|
124
|
-
static testVisible(config, data, field, currentRole) {
|
|
125
|
-
if ((field.type == 'section' || field.type == 'blank') && field.hidden)
|
|
126
|
-
return false;
|
|
127
|
-
// First check form level security if exists
|
|
128
|
-
if (config.security && !this.hasFormAccess(config, currentRole)) {
|
|
129
|
-
return false;
|
|
130
|
-
}
|
|
131
|
-
if (field.section) {
|
|
132
|
-
const sectionField = config.fields.find(f => f.type === 'section' && f.name === field.section);
|
|
133
|
-
if (sectionField) {
|
|
134
|
-
// Inherit section's conditions
|
|
135
|
-
if (!this.checkSecurity(sectionField.securityConfig, currentRole)) {
|
|
136
|
-
return false;
|
|
137
|
-
}
|
|
138
|
-
// if (sectionField.hidden) return false;
|
|
139
|
-
if (sectionField.hideOnCreate && config.mode == 'create')
|
|
140
|
-
return false;
|
|
141
|
-
if (sectionField.hideOnExists && config.mode != 'create')
|
|
142
|
-
return false;
|
|
143
|
-
if (sectionField.hiddenCondition && sectionField.hiddenCondition(data))
|
|
144
|
-
return false;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
// Then check field level security if exists
|
|
148
|
-
if (!this.checkSecurity(field.securityConfig, currentRole)) {
|
|
149
|
-
return false;
|
|
150
|
-
}
|
|
151
|
-
if (field.hidden)
|
|
152
|
-
return false;
|
|
153
|
-
if (config.mode == 'create' && field.hideOnCreate) {
|
|
154
|
-
return false;
|
|
155
|
-
}
|
|
156
|
-
if (config.mode != 'create' && field.hideOnExists) {
|
|
157
|
-
return false;
|
|
158
|
-
}
|
|
159
|
-
if (field.hiddenCondition) {
|
|
160
|
-
return !field.hiddenCondition(data);
|
|
161
|
-
}
|
|
162
|
-
return true;
|
|
163
|
-
}
|
|
164
|
-
static testReadOnly(config, data, field) {
|
|
165
|
-
// Default readonly conditions
|
|
166
|
-
if (config.mode == 'create') {
|
|
167
|
-
return false;
|
|
168
|
-
}
|
|
169
|
-
if (field.readonly) {
|
|
170
|
-
return true;
|
|
171
|
-
}
|
|
172
|
-
if (config.mode == 'view') {
|
|
173
|
-
return true;
|
|
174
|
-
}
|
|
175
|
-
// Check section readonly condition first
|
|
176
|
-
if (field.section) {
|
|
177
|
-
const sectionField = config.fields.find(f => f.type === 'section' && f.name === field.section);
|
|
178
|
-
if (sectionField?.readonlyCondition && sectionField.readonlyCondition(data)) {
|
|
179
|
-
return true;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
// Check field level readonly condition last
|
|
183
|
-
if (field.readonlyCondition) {
|
|
184
|
-
return field.readonlyCondition(data);
|
|
185
|
-
}
|
|
186
|
-
return false;
|
|
187
|
-
}
|
|
188
|
-
static testVisibleHeaderButton(data, btn) {
|
|
189
|
-
if (btn.hiddenCondition) {
|
|
190
|
-
return !btn.hiddenCondition(data);
|
|
191
|
-
}
|
|
192
|
-
return true;
|
|
193
|
-
}
|
|
194
|
-
static getVisibleSubfields(config, data, field, currentRole) {
|
|
195
|
-
return field.subfields?.filter(subfield => Core.testVisible(config, data, subfield, currentRole)) || [];
|
|
196
|
-
}
|
|
197
|
-
static validateObject(fields, data) {
|
|
198
|
-
console.log("Validations");
|
|
199
|
-
for (let field of fields) {
|
|
200
|
-
if (field.type == 'file' || field.type == 'file-view' || field.type == 'blank' || field.type == 'section')
|
|
201
|
-
continue;
|
|
202
|
-
let name = field.alias ?? this.camelToWords(field.name);
|
|
203
|
-
let d = data[field.name];
|
|
204
|
-
let isRequired = field.required;
|
|
205
|
-
if (!isRequired && field.requiredCondition) {
|
|
206
|
-
isRequired = field.requiredCondition(data);
|
|
207
|
-
}
|
|
208
|
-
console.log(name + ' ' + d);
|
|
209
|
-
if (isRequired) {
|
|
210
|
-
if (d == undefined || d == null)
|
|
211
|
-
return `${name} is required`;
|
|
212
|
-
if (field.type == 'text') {
|
|
213
|
-
if (d == '')
|
|
214
|
-
return `Please enter ${name}`;
|
|
215
|
-
if (field.min && d.length < field.min)
|
|
216
|
-
return `Minimum ${name} length is ${field.min}`;
|
|
217
|
-
if (field.max && d.length > field.max)
|
|
218
|
-
return `Maximum ${name} length is ${field.max}`;
|
|
219
|
-
}
|
|
220
|
-
else if (field.type == 'number' || field.type == 'money' || field.type == 'date') {
|
|
221
|
-
if (field.min && d < field.min)
|
|
222
|
-
return `Minimum ${name} is ${field.min}`;
|
|
223
|
-
if (field.max && d > field.max)
|
|
224
|
-
return `Maximum ${name} is ${field.max}`;
|
|
225
|
-
}
|
|
226
|
-
else if (field.type == 'select') {
|
|
227
|
-
if (typeof (d) == 'string' && d == '')
|
|
228
|
-
return `Please select ${name}`;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
if (field.type == 'text' && field.regex && d && d.toString().trim() !== '') {
|
|
232
|
-
const regexPattern = new RegExp(field.regex.pattern);
|
|
233
|
-
if (!regexPattern.test(d)) {
|
|
234
|
-
return field.regex.message;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
;
|
|
239
|
-
return '';
|
|
240
|
-
}
|
|
241
|
-
static testRequired(config, data, field) {
|
|
242
|
-
if (field.required) {
|
|
243
|
-
return true;
|
|
244
|
-
}
|
|
245
|
-
if (field.requiredCondition) {
|
|
246
|
-
return field.requiredCondition(data);
|
|
247
|
-
}
|
|
248
|
-
return false;
|
|
249
|
-
}
|
|
250
|
-
static getInitialValue(field) {
|
|
251
|
-
if (field.defaultValue) {
|
|
252
|
-
if ((field.type == 'date' || field.type == 'datetime') && field.defaultValue == 'now')
|
|
253
|
-
return this.nowDate(true);
|
|
254
|
-
return field.defaultValue;
|
|
255
|
-
}
|
|
256
|
-
if (field.type == 'select' && (field.hidden || field.hideOnCreate))
|
|
257
|
-
return 0;
|
|
258
|
-
switch (field.type) {
|
|
259
|
-
case 'text':
|
|
260
|
-
return '';
|
|
261
|
-
case 'money':
|
|
262
|
-
return 0;
|
|
263
|
-
case 'number':
|
|
264
|
-
return 0;
|
|
265
|
-
case 'date':
|
|
266
|
-
return this.nowDate(true);
|
|
267
|
-
case 'checkbox':
|
|
268
|
-
return false;
|
|
269
|
-
case 'select':
|
|
270
|
-
return null;
|
|
271
|
-
default:
|
|
272
|
-
return null;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
static getClone(x) {
|
|
276
|
-
return this.deepClone2(x);
|
|
277
|
-
}
|
|
278
|
-
static getNumber(value) {
|
|
279
|
-
if (value == null || value == "") {
|
|
280
|
-
return 0;
|
|
281
|
-
}
|
|
282
|
-
const onlyNumbers = value.replace(/[^\d.-]/g, '');
|
|
283
|
-
return onlyNumbers;
|
|
284
|
-
}
|
|
285
|
-
static getFirstDayOfMonth() {
|
|
286
|
-
const date = new Date();
|
|
287
|
-
return new Date(date.getFullYear(), date.getMonth(), 1);
|
|
288
|
-
}
|
|
289
|
-
static emailIsValid(email) {
|
|
290
|
-
// return /\S+@\S+\.\S+/.test(email)
|
|
291
|
-
return false;
|
|
292
|
-
}
|
|
293
|
-
static isValidUNCPath(path) {
|
|
294
|
-
// return /\\\\([a-zA-Z0-9_.$●-]+)\\([a-zA-Z0-9_.$●-]+).*/.test(path)
|
|
295
|
-
return false;
|
|
296
|
-
}
|
|
297
|
-
static isValidDate(date) {
|
|
298
|
-
var parsedDate = Date.parse(date);
|
|
299
|
-
if (isNaN(date) && !isNaN(parsedDate)) {
|
|
300
|
-
return true;
|
|
301
|
-
}
|
|
302
|
-
else {
|
|
303
|
-
return false;
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
static isValidEmailList(list) {
|
|
307
|
-
if (list.includes(";")) {
|
|
308
|
-
let emails = list.split(";");
|
|
309
|
-
for (var email of emails) {
|
|
310
|
-
if (this.emailIsValid(email) == false) {
|
|
311
|
-
return false;
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
else {
|
|
316
|
-
if (this.emailIsValid(list) == false) {
|
|
317
|
-
return false;
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
return true;
|
|
321
|
-
}
|
|
322
|
-
static isNumber(value) {
|
|
323
|
-
return ((value != null) &&
|
|
324
|
-
(value !== '') &&
|
|
325
|
-
!isNaN(Number(value.toString())));
|
|
326
|
-
}
|
|
327
|
-
static getDiff(startDate, endDate = Date()) {
|
|
328
|
-
var eventStartTime = new Date(startDate);
|
|
329
|
-
var eventEndTime = new Date(endDate);
|
|
330
|
-
var milliseconds = eventEndTime.valueOf() - eventStartTime.valueOf();
|
|
331
|
-
function numberEnding(number) {
|
|
332
|
-
if (number.toFixed() == '1') {
|
|
333
|
-
return '';
|
|
334
|
-
}
|
|
335
|
-
else {
|
|
336
|
-
return 's';
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
var minutes = (milliseconds / (1000 * 60));
|
|
340
|
-
var hours = (milliseconds / (1000 * 60 * 60));
|
|
341
|
-
var days = (milliseconds / (1000 * 60 * 60 * 24));
|
|
342
|
-
var weeks = (milliseconds / (1000 * 60 * 60 * 24 * 7));
|
|
343
|
-
var months = (milliseconds / (1000 * 60 * 60 * 24 * 7 * 4));
|
|
344
|
-
var years = (milliseconds / (1000 * 60 * 60 * 24 * 365));
|
|
345
|
-
if (years >= 1) {
|
|
346
|
-
return years.toFixed() + ' year' + numberEnding(years);
|
|
347
|
-
}
|
|
348
|
-
else if (months >= 1) {
|
|
349
|
-
return months.toFixed() + ' month' + numberEnding(months);
|
|
350
|
-
}
|
|
351
|
-
else if (weeks >= 1) {
|
|
352
|
-
return weeks.toFixed() + ' week' + numberEnding(weeks);
|
|
353
|
-
}
|
|
354
|
-
else if (days >= 1) {
|
|
355
|
-
return days.toFixed() + ' day' + numberEnding(days);
|
|
356
|
-
}
|
|
357
|
-
else if (hours >= 1) {
|
|
358
|
-
return hours.toFixed() + ' hour' + numberEnding(hours);
|
|
359
|
-
}
|
|
360
|
-
else if (minutes >= 1) {
|
|
361
|
-
return minutes.toFixed() + ' minute' + numberEnding(minutes);
|
|
362
|
-
}
|
|
363
|
-
else if (milliseconds >= (-1000 * 60)) {
|
|
364
|
-
return 'a minute';
|
|
365
|
-
}
|
|
366
|
-
else {
|
|
367
|
-
return 'N/A';
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
static nowDate(NoTime = false) {
|
|
371
|
-
if (NoTime) {
|
|
372
|
-
return this.getFormatedDate(Date(), true);
|
|
373
|
-
}
|
|
374
|
-
else {
|
|
375
|
-
return this.getFormatedDate(Date());
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
static getFormatedDate(dateString, NoTime = false) {
|
|
379
|
-
let d = new Date(dateString);
|
|
380
|
-
d.setHours(d.getHours() + 2);
|
|
381
|
-
if (NoTime == true) {
|
|
382
|
-
return d.toISOString().split('T')[0];
|
|
383
|
-
}
|
|
384
|
-
else {
|
|
385
|
-
return d.toISOString().split('.')[0];
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
static getFormatedDate2(d, NoTime = false) {
|
|
389
|
-
d.setHours(d.getHours() + 2);
|
|
390
|
-
if (NoTime == true) {
|
|
391
|
-
return d.toISOString().split('T')[0];
|
|
392
|
-
}
|
|
393
|
-
else {
|
|
394
|
-
return d.toISOString().split('.')[0];
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
static getBusinessDatesCount(startDate, endDate) {
|
|
398
|
-
var count = 0;
|
|
399
|
-
var _startDate = new Date(startDate);
|
|
400
|
-
var _endDate = new Date(endDate);
|
|
401
|
-
var curDate = _startDate;
|
|
402
|
-
while (curDate < _endDate) {
|
|
403
|
-
var dayOfWeek = curDate.getDay();
|
|
404
|
-
if (!(dayOfWeek == 6 || dayOfWeek == 0))
|
|
405
|
-
count++;
|
|
406
|
-
curDate.setDate(curDate.getDate() + 1);
|
|
407
|
-
}
|
|
408
|
-
return count;
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
Core.nullDate = "01 Jan 1969";
|
|
412
|
-
export class DetailsDialogProcessor {
|
|
413
|
-
static processDetailsConfig(detailsConfig, row) {
|
|
414
|
-
const updatedDetailsConfig = Core.getClone(detailsConfig); //{...detailsConfig}
|
|
415
|
-
updatedDetailsConfig.details = row;
|
|
416
|
-
//Form Config
|
|
417
|
-
updatedDetailsConfig.formConfig.mode = updatedDetailsConfig.mode ?? "view";
|
|
418
|
-
if (updatedDetailsConfig.heroField && row) {
|
|
419
|
-
updatedDetailsConfig.heroValue = row[updatedDetailsConfig.heroField];
|
|
420
|
-
}
|
|
421
|
-
//Table configs
|
|
422
|
-
if (updatedDetailsConfig.tableConfig) {
|
|
423
|
-
updateTableConfig(updatedDetailsConfig.tableConfig);
|
|
424
|
-
}
|
|
425
|
-
if (updatedDetailsConfig.tableConfigs) {
|
|
426
|
-
updatedDetailsConfig.tableConfigs.forEach(updateTableConfig);
|
|
427
|
-
}
|
|
428
|
-
function updateTableConfig(tableConfig) {
|
|
429
|
-
tableConfig.heroField = updatedDetailsConfig?.heroField;
|
|
430
|
-
tableConfig.heroValue = updatedDetailsConfig?.heroValue;
|
|
431
|
-
// tableConfig.setHero = updatedDetailsConfig.setHero;
|
|
432
|
-
tableConfig.searchConfig = null;
|
|
433
|
-
tableConfig.tileConfig = null;
|
|
434
|
-
tableConfig.parentData = updatedDetailsConfig.details;
|
|
435
|
-
tableConfig.elevation = 'none';
|
|
436
|
-
}
|
|
437
|
-
//URL
|
|
438
|
-
if (updatedDetailsConfig.tableConfig) {
|
|
439
|
-
transformLoadUrl(updatedDetailsConfig.tableConfig);
|
|
440
|
-
}
|
|
441
|
-
if (updatedDetailsConfig.tableConfigs) {
|
|
442
|
-
updatedDetailsConfig.tableConfigs.forEach(transformLoadUrl);
|
|
443
|
-
}
|
|
444
|
-
if (updatedDetailsConfig.stepConfig?.loadAction) {
|
|
445
|
-
transformStepUrl(updatedDetailsConfig.stepConfig);
|
|
446
|
-
}
|
|
447
|
-
function transformLoadUrl(tableConfig) {
|
|
448
|
-
if (tableConfig.loadAction && tableConfig.loadCriteria && tableConfig.loadIDField) {
|
|
449
|
-
tableConfig.loadAction.url = `${tableConfig.loadAction.url.split('/')[0]}/${tableConfig.loadCriteria}/${updatedDetailsConfig.details[tableConfig.loadIDField]}`;
|
|
450
|
-
console.log("Transformed", tableConfig.loadAction.url);
|
|
451
|
-
}
|
|
452
|
-
else {
|
|
453
|
-
console.log("NOT Transformed");
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
function transformStepUrl(stepConfig) {
|
|
457
|
-
if (stepConfig.loadAction && stepConfig.loadIDField) {
|
|
458
|
-
// let heroId = updatedDetailsConfig.details[updatedDetailsConfig.heroField];
|
|
459
|
-
stepConfig.loadAction.url = `${stepConfig.loadAction.url.replace('{id}', updatedDetailsConfig.details[stepConfig.loadIDField])}`;
|
|
460
|
-
// console.log("Transformed step URL", stepConfig.loadAction.url);
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
return updatedDetailsConfig;
|
|
464
|
-
}
|
|
465
|
-
static initializeConfigs(detailsConfig) {
|
|
466
|
-
const tableConfig = detailsConfig.tableConfig;
|
|
467
|
-
const tableConfigs = detailsConfig.tableConfigs;
|
|
468
|
-
const formConfig = detailsConfig.formConfig;
|
|
469
|
-
const stepConfig = detailsConfig.stepConfig;
|
|
470
|
-
const statusConfig = detailsConfig.statusConfig;
|
|
471
|
-
const buttons = detailsConfig.buttons;
|
|
472
|
-
formConfig.mode = formConfig.mode ?? "view";
|
|
473
|
-
return { tableConfig, tableConfigs, formConfig, stepConfig, statusConfig, buttons };
|
|
474
|
-
}
|
|
475
|
-
static setHeroValue(detailsConfig, details) {
|
|
476
|
-
if ((detailsConfig.formConfig.mode == "create") && detailsConfig.heroField && detailsConfig.heroValue) {
|
|
477
|
-
details[detailsConfig.heroField] = detailsConfig.heroValue;
|
|
478
|
-
// Ensure hero values are set in form config
|
|
479
|
-
detailsConfig.formConfig.heroField = detailsConfig.heroField;
|
|
480
|
-
detailsConfig.formConfig.heroValue = detailsConfig.heroValue;
|
|
481
|
-
return;
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
static handleFormMode(detailsConfig, formConfig) {
|
|
485
|
-
let details;
|
|
486
|
-
let action;
|
|
487
|
-
let loadByAction = false;
|
|
488
|
-
if (formConfig.mode === "create") {
|
|
489
|
-
details = Core.generateObject(formConfig.fields);
|
|
490
|
-
}
|
|
491
|
-
else {
|
|
492
|
-
let resp = this.loadDetailsData(detailsConfig, formConfig);
|
|
493
|
-
details = resp.details;
|
|
494
|
-
action = resp.action;
|
|
495
|
-
loadByAction = resp.loadByAction;
|
|
496
|
-
}
|
|
497
|
-
return { details, loadByAction, action };
|
|
498
|
-
}
|
|
499
|
-
static loadDetailsData(detailsConfig, formConfig) {
|
|
500
|
-
let details;
|
|
501
|
-
let action;
|
|
502
|
-
let loadByAction = false;
|
|
503
|
-
//Choose source
|
|
504
|
-
if (detailsConfig.detailsSource == DetailsSource.Row) {
|
|
505
|
-
console.log("Data from Details - Row option");
|
|
506
|
-
details = detailsConfig.details;
|
|
507
|
-
}
|
|
508
|
-
else if (detailsConfig.detailsSource == DetailsSource.Url) {
|
|
509
|
-
console.log("Data from Url option");
|
|
510
|
-
action = this.loadDetailsFromUrl(detailsConfig, formConfig);
|
|
511
|
-
loadByAction = true;
|
|
512
|
-
}
|
|
513
|
-
else {
|
|
514
|
-
//new logic
|
|
515
|
-
if (formConfig.loadAction) {
|
|
516
|
-
console.log("Data from Url - Guessed");
|
|
517
|
-
action = this.loadDetailsFromUrl(detailsConfig, formConfig);
|
|
518
|
-
loadByAction = true;
|
|
519
|
-
}
|
|
520
|
-
else {
|
|
521
|
-
console.log("Data from Details - Guessed");
|
|
522
|
-
details = detailsConfig.details;
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
return { details, loadByAction, action };
|
|
526
|
-
}
|
|
527
|
-
static loadDetailsFromUrl(detailsConfig, formConfig) {
|
|
528
|
-
let action;
|
|
529
|
-
if (formConfig.loadAction) {
|
|
530
|
-
if (detailsConfig.heroField && detailsConfig.details) {
|
|
531
|
-
console.log("DetailsConfig Hero ID Field " + detailsConfig.heroField);
|
|
532
|
-
action = { url: `${formConfig.loadAction.url}/${detailsConfig.details[detailsConfig.heroField]}` };
|
|
533
|
-
}
|
|
534
|
-
else if (formConfig.heroField && detailsConfig.details) {
|
|
535
|
-
console.log("FormConfig Hero ID Field " + formConfig.heroField);
|
|
536
|
-
action = { url: `${formConfig.loadAction.url}/${detailsConfig.details[formConfig.heroField]}` };
|
|
537
|
-
}
|
|
538
|
-
else if (detailsConfig.heroValue) {
|
|
539
|
-
console.log("Defined Hero Value " + detailsConfig.heroValue);
|
|
540
|
-
action = { url: `${formConfig.loadAction.url}/${detailsConfig.heroValue}` };
|
|
541
|
-
}
|
|
542
|
-
else {
|
|
543
|
-
console.log("url source failed : setup hero field or hero value");
|
|
544
|
-
}
|
|
545
|
-
action.cacheDurationMinutes = formConfig.loadAction.cacheDurationMinutes ?? 0;
|
|
546
|
-
action.skipCache = formConfig.loadAction.skipCache ?? false;
|
|
547
|
-
action.successMessage = formConfig.loadAction.successMessage ?? null;
|
|
548
|
-
}
|
|
549
|
-
else {
|
|
550
|
-
console.log("No load action set");
|
|
551
|
-
}
|
|
552
|
-
return action;
|
|
553
|
-
}
|
|
554
|
-
static setFileField(formConfig) {
|
|
555
|
-
return formConfig.fields.find(x => x.type === 'file');
|
|
556
|
-
}
|
|
557
|
-
static setupButtons(buttons) {
|
|
558
|
-
let extraButtons, createButton, editButton, deleteButton;
|
|
559
|
-
if (buttons) {
|
|
560
|
-
extraButtons = buttons.filter(x => x.name !== "create" && x.name !== "edit" && x.name !== "delete" && x.name !== "view" && x.inDialog);
|
|
561
|
-
createButton = buttons.find(x => x.name === "create");
|
|
562
|
-
editButton = buttons.find(x => x.name === "edit");
|
|
563
|
-
deleteButton = buttons.find(x => x.name === "delete");
|
|
564
|
-
}
|
|
565
|
-
return { extraButtons, createButton, editButton, deleteButton };
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGluQ29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rpbi1zcGEvc3JjL2xpYi9jbGFzc2VzL1RpbkNvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUErQixhQUFhLEVBQXFCLFVBQVUsRUFBa0IsTUFBTSxXQUFXLENBQUM7QUFFdEgsTUFBTSxPQUFPLElBQUk7SUFHUixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUc7UUFDekIsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRTtZQUMzQyxPQUFPLEdBQUcsQ0FBQztTQUNaO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3RCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNuQixHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sT0FBTyxDQUFDO1NBQ2hCO1FBRUQsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBUTtRQUMvQiw4Q0FBOEM7UUFDOUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUVuQyx5REFB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YWlsc0RpYWxvZ0NvbmZpZywgRGV0YWlsc1NvdXJjZSwgRmllbGQsIEZvcm1Db25maWcsIFJvbGVBY2Nlc3MsIFNlY3VyaXR5Q29uZmlnIH0gZnJvbSBcIi4vQ2xhc3Nlc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvcmUge1xyXG5cclxuXHJcbiAgcHVibGljIHN0YXRpYyBkZWVwQ2xvbmUob2JqKSB7XHJcbiAgICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XHJcbiAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xyXG4gICAgICBjb25zdCBhcnJDb3B5ID0gW107XHJcbiAgICAgIG9iai5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGFyckNvcHlbaW5kZXhdID0gdGhpcy5kZWVwQ2xvbmUoaXRlbSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gYXJyQ29weTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvYmpDb3B5ID0ge307XHJcbiAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgb2JqQ29weVtrZXldID0gdGhpcy5kZWVwQ2xvbmUob2JqW2tleV0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gb2JqQ29weTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZGVlcENsb25lMihvYmo6IGFueSk6IGFueSB7XHJcbiAgICAvLyBDcmVhdGUgbmV3IFdlYWtNYXAgZm9yIGVhY2ggY2xvbmUgb3BlcmF0aW9uXHJcbiAgICBjb25zdCBjbG9uZVZpc2l0ZWQgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuICAgIC8vIElubmVyIGZ1bmN0aW9uIHRoYXQgaGFzIGFjY2VzcyB0byB0aGUgY2xvbmVWaXNpdGVkIG1hcFxyXG4gICAgY29uc3QgY2xvbmUgPSAodmFsdWU6IGFueSk6IGFueSA9PiB7XHJcbiAgICAgIC8vIEhhbmRsZSBudWxsLCB1bmRlZmluZWQgYW5kIHByaW1pdGl2ZXNcclxuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIENoZWNrIGlmIG9iamVjdCB3YXMgYWxyZWFkeSBjbG9uZWRcclxuICAgICAgaWYgKGNsb25lVmlzaXRlZC5oYXModmFsdWUpKSB7XHJcbiAgICAgICAgcmV0dXJuIGNsb25lVmlzaXRlZC5nZXQodmFsdWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBIYW5kbGUgYXJyYXlzXHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgIGNvbnN0IGFyckNvcHkgPSBbXTtcclxuICAgICAgICBjbG9uZVZpc2l0ZWQuc2V0KHZhbHVlLCBhcnJDb3B5KTtcclxuICAgICAgICB2YWx1ZS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgYXJyQ29weVtpbmRleF0gPSBjbG9uZShpdGVtKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gYXJyQ29weTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gSGFuZGxlIGRhdGVzXHJcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBIYW5kbGUgcmVndWxhciBvYmplY3RzXHJcbiAgICAgIGNvbnN0IG9iakNvcHkgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkpO1xyXG4gICAgICBjbG9uZVZpc2l0ZWQuc2V0KHZhbHVlLCBvYmpDb3B5KTtcclxuXHJcbiAgICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XHJcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkge1xyXG4gICAgICAgICAgb2JqQ29weVtrZXldID0gY2xvbmUodmFsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIG9iakNvcHk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIFN0YXJ0IHRoZSBjbG9uZSBvcGVyYXRpb24gd2l0aCBhIGZyZXNoIFdlYWtNYXBcclxuICAgIHJldHVybiBjbG9uZShvYmopO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNhbWVsVG9Xb3Jkcyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghdmFsdWUpIHJldHVybiB2YWx1ZTtcclxuXHJcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xyXG5cclxuICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMCkgcmV0dXJuIHZhbHVlO1xyXG5cclxuICAgIGxldCB2ID0gdmFsdWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zdWJzdHJpbmcoMSlcclxuICAgIHJldHVybiB2LnJlcGxhY2UoLyhbQS1aXSspKihbQS1aXVthLXpdKS9nLCBcIiQxICQyXCIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZU9iamVjdChmaWVsZHM6IEZpZWxkW10pIHtcclxuXHJcbiAgICBsZXQgZGF0YSA9IHt9O1xyXG4gICAgZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xyXG5cclxuICAgICAgaWYgKGZpZWxkLnR5cGUgIT0gJ3NlY3Rpb24nICYmIGZpZWxkLnR5cGUgIT0gJ2JsYW5rJyApe1xyXG4gICAgICAgIGRhdGFbZmllbGQubmFtZV0gPSB0aGlzLmdldEluaXRpYWxWYWx1ZShmaWVsZCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBjb25zb2xlLmxvZyhkYXRhKVxyXG5cclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyByZXNldE9iamVjdChmaWVsZHM6IEZpZWxkW10sIGRhdGEpIHtcclxuXHJcbiAgICBmaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgIGlmIChmaWVsZC50eXBlICE9ICdzZWN0aW9uJyAmJiBmaWVsZC50eXBlICE9ICdibGFuaycpIHtcclxuICAgICAgICBkYXRhW2ZpZWxkLm5hbWVdID0gdGhpcy5nZXRJbml0aWFsVmFsdWUoZmllbGQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNoZWNrU2VjdXJpdHkoc2VjdXJpdHk6IFNlY3VyaXR5Q29uZmlnLCBjdXJyZW50Um9sZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXNlY3VyaXR5KSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZWN1cml0eS5kZW55Py5zb21lKHJvbGUgPT4gY3VycmVudFJvbGVbcm9sZS5uYW1lXSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghc2VjdXJpdHkuYWxsb3cgfHwgc2VjdXJpdHkuYWxsb3cubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzZWN1cml0eS5hbGxvdy5zb21lKHJvbGUgPT4gY3VycmVudFJvbGVbcm9sZS5uYW1lXSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGhhc0Zvcm1BY2Nlc3MoZm9ybUNvbmZpZzogRm9ybUNvbmZpZywgY3VycmVudFJvbGU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybUFjY2Vzcyhmb3JtQ29uZmlnLCBjdXJyZW50Um9sZSkgPiBSb2xlQWNjZXNzLk5vbmU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldEZvcm1BY2Nlc3MoZm9ybUNvbmZpZzogRm9ybUNvbmZpZywgY3VycmVudFJvbGU6IGFueSk6IFJvbGVBY2Nlc3Mge1xyXG4gICAgaWYgKCFmb3JtQ29uZmlnPy5zZWN1cml0eT8uYWxsb3cpIHtcclxuICAgICAgcmV0dXJuIFJvbGVBY2Nlc3MuRnVsbDsgLy8gRnVsbCBhY2Nlc3MgaWYgbm8gcmVzdHJpY3Rpb25zXHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgZGVueSBmaXJzdFxyXG4gICAgaWYgKGZvcm1Db25maWcuc2VjdXJpdHkuZGVueT8uc29tZShyb2xlID0+IHRoaXMuZ2V0Um9sZUFjY2VzcyhjdXJyZW50Um9sZSwgcm9sZS5uYW1lKSA+IFJvbGVBY2Nlc3MuTm9uZSkpIHtcclxuICAgICAgcmV0dXJuIFJvbGVBY2Nlc3MuTm9uZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBHZXQgaGlnaGVzdCBsZXZlbCBvZiBhY2Nlc3MgZnJvbSBhbGxvd2VkIGNhcGFiaWxpdGllc1xyXG4gICAgbGV0IG1heEFjY2VzcyA9IFJvbGVBY2Nlc3MuTm9uZTtcclxuICAgIGZvcm1Db25maWcuc2VjdXJpdHkuYWxsb3cuZm9yRWFjaChyb2xlID0+IHtcclxuICAgICAgY29uc3QgYWNjZXNzID0gdGhpcy5nZXRSb2xlQWNjZXNzKGN1cnJlbnRSb2xlLCByb2xlLm5hbWUpO1xyXG4gICAgICBpZiAoYWNjZXNzID4gbWF4QWNjZXNzKSB7XHJcbiAgICAgICAgbWF4QWNjZXNzID0gYWNjZXNzO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gbWF4QWNjZXNzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Um9sZUFjY2Vzcyhyb2xlOiBhbnksIGNhcE5hbWU6IHN0cmluZyk6IFJvbGVBY2Nlc3Mge1xyXG4gICAgaWYgKCFyb2xlIHx8ICFjYXBOYW1lKSByZXR1cm4gUm9sZUFjY2Vzcy5Ob25lO1xyXG4gICAgcmV0dXJuIHJvbGVbY2FwTmFtZV0gPz8gUm9sZUFjY2Vzcy5Ob25lO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyB0ZXN0VmlzaWJsZShjb25maWc6IEZvcm1Db25maWcsIGRhdGEsIGZpZWxkOiBGaWVsZCwgY3VycmVudFJvbGU6IGFueSk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmICgoZmllbGQudHlwZSA9PSAnc2VjdGlvbicgfHwgZmllbGQudHlwZSA9PSAnYmxhbmsnKSAmJiBmaWVsZC5oaWRkZW4pIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBGaXJzdCBjaGVjayBmb3JtIGxldmVsIHNlY3VyaXR5IGlmIGV4aXN0c1xyXG4gICAgaWYgKGNvbmZpZy5zZWN1cml0eSAmJiAhdGhpcy5oYXNGb3JtQWNjZXNzKGNvbmZpZywgY3VycmVudFJvbGUpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZmllbGQuc2VjdGlvbikge1xyXG4gICAgICBjb25zdCBzZWN0aW9uRmllbGQgPSBjb25maWcuZmllbGRzLmZpbmQoZiA9PiBmLnR5cGUgPT09ICdzZWN0aW9uJyAmJiBmLm5hbWUgPT09IGZpZWxkLnNlY3Rpb24pO1xyXG4gICAgICBpZiAoc2VjdGlvbkZpZWxkKSB7XHJcbiAgICAgICAgLy8gSW5oZXJpdCBzZWN0aW9uJ3MgY29uZGl0aW9uc1xyXG4gICAgICAgIGlmICghdGhpcy5jaGVja1NlY3VyaXR5KHNlY3Rpb25GaWVsZC5zZWN1cml0eUNvbmZpZywgY3VycmVudFJvbGUpKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIChzZWN0aW9uRmllbGQuaGlkZGVuKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKHNlY3Rpb25GaWVsZC5oaWRlT25DcmVhdGUgJiYgY29uZmlnLm1vZGUgPT0gJ2NyZWF0ZScpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAoc2VjdGlvbkZpZWxkLmhpZGVPbkV4aXN0cyAmJiBjb25maWcubW9kZSAhPSAnY3JlYXRlJykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmIChzZWN0aW9uRmllbGQuaGlkZGVuQ29uZGl0aW9uICYmIHNlY3Rpb25GaWVsZC5oaWRkZW5Db25kaXRpb24oZGF0YSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoZW4gY2hlY2sgZmllbGQgbGV2ZWwgc2VjdXJpdHkgaWYgZXhpc3RzXHJcbiAgICBpZiAoIXRoaXMuY2hlY2tTZWN1cml0eShmaWVsZC5zZWN1cml0eUNvbmZpZywgY3VycmVudFJvbGUpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZmllbGQuaGlkZGVuKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKGNvbmZpZy5tb2RlID09ICdjcmVhdGUnICYmIGZpZWxkLmhpZGVPbkNyZWF0ZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGlmIChjb25maWcubW9kZSAhPSAnY3JlYXRlJyAmJiBmaWVsZC5oaWRlT25FeGlzdHMpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgaWYgKGZpZWxkLmhpZGRlbkNvbmRpdGlvbikge1xyXG4gICAgICByZXR1cm4gIWZpZWxkLmhpZGRlbkNvbmRpdGlvbihkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgdGVzdFJlYWRPbmx5KGNvbmZpZzogRm9ybUNvbmZpZywgZGF0YSwgZmllbGQ6IEZpZWxkKTogYm9vbGVhbiB7XHJcbiAgICAvLyBEZWZhdWx0IHJlYWRvbmx5IGNvbmRpdGlvbnNcclxuICAgIGlmIChjb25maWcubW9kZSA9PSAnY3JlYXRlJykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZpZWxkLnJlYWRvbmx5KSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb25maWcubW9kZSA9PSAndmlldycpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgc2VjdGlvbiByZWFkb25seSBjb25kaXRpb24gZmlyc3RcclxuICAgIGlmIChmaWVsZC5zZWN0aW9uKSB7XHJcbiAgICAgIGNvbnN0IHNlY3Rpb25GaWVsZCA9IGNvbmZpZy5maWVsZHMuZmluZChmID0+IGYudHlwZSA9PT0gJ3NlY3Rpb24nICYmIGYubmFtZSA9PT0gZmllbGQuc2VjdGlvbik7XHJcbiAgICAgIGlmIChzZWN0aW9uRmllbGQ/LnJlYWRvbmx5Q29uZGl0aW9uICYmIHNlY3Rpb25GaWVsZC5yZWFkb25seUNvbmRpdGlvbihkYXRhKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgZmllbGQgbGV2ZWwgcmVhZG9ubHkgY29uZGl0aW9uIGxhc3RcclxuICAgIGlmIChmaWVsZC5yZWFkb25seUNvbmRpdGlvbikge1xyXG4gICAgICByZXR1cm4gZmllbGQucmVhZG9ubHlDb25kaXRpb24oZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyB0ZXN0VmlzaWJsZUhlYWRlckJ1dHRvbihkYXRhLCBidG4pOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAoYnRuLmhpZGRlbkNvbmRpdGlvbikge1xyXG4gICAgICByZXR1cm4gIWJ0bi5oaWRkZW5Db25kaXRpb24oZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldFZpc2libGVTdWJmaWVsZHMoY29uZmlnOiBGb3JtQ29uZmlnLCBkYXRhLCBmaWVsZDogRmllbGQsIGN1cnJlbnRSb2xlOiBhbnkgKTogRmllbGRbXSB7XHJcbiAgICByZXR1cm4gZmllbGQuc3ViZmllbGRzPy5maWx0ZXIoc3ViZmllbGQgPT4gQ29yZS50ZXN0VmlzaWJsZShjb25maWcsIGRhdGEsIHN1YmZpZWxkLGN1cnJlbnRSb2xlICkpIHx8IFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyB2YWxpZGF0ZU9iamVjdChmaWVsZHM6IEZpZWxkW10sIGRhdGEpOiBzdHJpbmcge1xyXG5cclxuICAgIGNvbnNvbGUubG9nKFwiVmFsaWRhdGlvbnNcIilcclxuXHJcbiAgICBmb3IgKGxldCBmaWVsZCBvZiBmaWVsZHMpIHtcclxuXHJcbiAgICAgIGlmIChmaWVsZC50eXBlID09ICdmaWxlJyB8fCBmaWVsZC50eXBlID09ICdmaWxlLXZpZXcnIHx8IGZpZWxkLnR5cGUgPT0gJ2JsYW5rJyB8fCBmaWVsZC50eXBlID09ICdzZWN0aW9uJyApIGNvbnRpbnVlXHJcblxyXG5cclxuXHJcbiAgICAgIGxldCBuYW1lID0gZmllbGQuYWxpYXMgPz8gdGhpcy5jYW1lbFRvV29yZHMoZmllbGQubmFtZSk7XHJcbiAgICAgIGxldCBkID0gZGF0YVtmaWVsZC5uYW1lXTtcclxuXHJcbiAgICAgIGxldCBpc1JlcXVpcmVkID0gZmllbGQucmVxdWlyZWQ7XHJcblxyXG4gICAgICBpZiAoIWlzUmVxdWlyZWQgJiYgZmllbGQucmVxdWlyZWRDb25kaXRpb24pIHtcclxuICAgICAgICBpc1JlcXVpcmVkID0gZmllbGQucmVxdWlyZWRDb25kaXRpb24oZGF0YSk7XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgICBjb25zb2xlLmxvZyhuYW1lICsgJyAnICsgZClcclxuXHJcbiAgICAgIGlmIChpc1JlcXVpcmVkKXtcclxuXHJcbiAgICAgICAgaWYgKGQgPT0gdW5kZWZpbmVkIHx8IGQgPT0gbnVsbCkgcmV0dXJuIGAke25hbWV9IGlzIHJlcXVpcmVkYDtcclxuXHJcbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gJ3RleHQnKXtcclxuXHJcbiAgICAgICAgICBpZiAoZCA9PSAnJykgcmV0dXJuIGBQbGVhc2UgZW50ZXIgJHtuYW1lfWA7XHJcblxyXG4gICAgICAgICAgaWYgKGZpZWxkLm1pbiAmJiBkLmxlbmd0aCA8IGZpZWxkLm1pbikgcmV0dXJuIGBNaW5pbXVtICAke25hbWV9IGxlbmd0aCBpcyAke2ZpZWxkLm1pbn1gXHJcblxyXG4gICAgICAgICAgaWYgKGZpZWxkLm1heCAmJiBkLmxlbmd0aCA+IGZpZWxkLm1heCkgcmV0dXJuIGBNYXhpbXVtICR7bmFtZX0gbGVuZ3RoIGlzICR7ZmllbGQubWF4fWBcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGZpZWxkLnR5cGUgPT0gJ251bWJlcicgfHwgZmllbGQudHlwZSA9PSAnbW9uZXknIHx8IGZpZWxkLnR5cGUgPT0gJ2RhdGUnKXtcclxuXHJcbiAgICAgICAgICBpZiAoZmllbGQubWluICYmIGQgPCBmaWVsZC5taW4pIHJldHVybiBgTWluaW11bSAgJHtuYW1lfSBpcyAke2ZpZWxkLm1pbn1gXHJcblxyXG4gICAgICAgICAgaWYgKGZpZWxkLm1heCAmJiBkID4gZmllbGQubWF4KSByZXR1cm4gYE1heGltdW0gJHtuYW1lfSBpcyAke2ZpZWxkLm1heH1gXHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChmaWVsZC50eXBlID09ICdzZWxlY3QnKSB7XHJcblxyXG4gICAgICAgICAgaWYgKHR5cGVvZihkKSA9PSAnc3RyaW5nJyAmJiBkID09ICcnKSByZXR1cm4gYFBsZWFzZSBzZWxlY3QgJHtuYW1lfWA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG5cclxuXHJcblxyXG4gICAgICBpZiAoZmllbGQudHlwZSA9PSAndGV4dCcgJiYgZmllbGQucmVnZXggJiYgZCAmJiBkLnRvU3RyaW5nKCkudHJpbSgpICE9PSAnJykge1xyXG4gICAgICAgIGNvbnN0IHJlZ2V4UGF0dGVybiA9IG5ldyBSZWdFeHAoZmllbGQucmVnZXgucGF0dGVybik7XHJcbiAgICAgICAgaWYgKCFyZWdleFBhdHRlcm4udGVzdChkKSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZpZWxkLnJlZ2V4Lm1lc3NhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHRlc3RSZXF1aXJlZChjb25maWc6IEZvcm1Db25maWcsIGRhdGEsIGZpZWxkOiBGaWVsZCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGZpZWxkLnJlcXVpcmVkKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZiAoZmllbGQucmVxdWlyZWRDb25kaXRpb24pIHtcclxuICAgICAgcmV0dXJuIGZpZWxkLnJlcXVpcmVkQ29uZGl0aW9uKGRhdGEpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldEluaXRpYWxWYWx1ZShmaWVsZDogRmllbGQpIHtcclxuXHJcbiAgICBpZiAoZmllbGQuZGVmYXVsdFZhbHVlKXtcclxuXHJcbiAgICAgIGlmICgoZmllbGQudHlwZSA9PSAnZGF0ZScgfHwgZmllbGQudHlwZSA9PSAnZGF0ZXRpbWUnKSAmJiBmaWVsZC5kZWZhdWx0VmFsdWUgPT0gJ25vdycpIHJldHVybiB0aGlzLm5vd0RhdGUodHJ1ZSk7XHJcblxyXG4gICAgICByZXR1cm4gZmllbGQuZGVmYXVsdFZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWVsZC50eXBlID09ICdzZWxlY3QnICYmIChmaWVsZC5oaWRkZW4gfHwgZmllbGQuaGlkZU9uQ3JlYXRlKSkgcmV0dXJuIDA7XHJcblxyXG4gICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ3RleHQnOlxyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgICAgY2FzZSAnbW9uZXknOlxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICBjYXNlICdudW1iZXInOlxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICBjYXNlICdkYXRlJzpcclxuICAgICAgICByZXR1cm4gdGhpcy5ub3dEYXRlKHRydWUpO1xyXG4gICAgICBjYXNlICdjaGVja2JveCc6XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBjYXNlICdzZWxlY3QnOlxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldENsb25lKHgpIHtcclxuICAgIHJldHVybiB0aGlzLmRlZXBDbG9uZTIoeCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldE51bWJlcih2YWx1ZTogc3RyaW5nKSB7XHJcblxyXG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT0gXCJcIikge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvbmx5TnVtYmVycyA9IHZhbHVlLnJlcGxhY2UoL1teXFxkLi1dL2csICcnKTtcclxuICAgIHJldHVybiBvbmx5TnVtYmVyc1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBnZXRGaXJzdERheU9mTW9udGgoKSB7XHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgMSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGVtYWlsSXNWYWxpZChlbWFpbCkge1xyXG4gICAgLy8gcmV0dXJuIC9cXFMrQFxcUytcXC5cXFMrLy50ZXN0KGVtYWlsKVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBpc1ZhbGlkVU5DUGF0aChwYXRoOiBzdHJpbmcpIHtcclxuICAgIC8vIHJldHVybiAvXFxcXFxcXFwoW2EtekEtWjAtOV8uJOKXjy1dKylcXFxcKFthLXpBLVowLTlfLiTil48tXSspLiovLnRlc3QocGF0aClcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgaXNWYWxpZERhdGUoZGF0ZSkge1xyXG5cclxuICAgIHZhciBwYXJzZWREYXRlID0gRGF0ZS5wYXJzZShkYXRlKTtcclxuXHJcblxyXG4gICAgaWYgKGlzTmFOKGRhdGUpICYmICFpc05hTihwYXJzZWREYXRlKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGlzVmFsaWRFbWFpbExpc3QobGlzdDogc3RyaW5nKSB7XHJcblxyXG4gICAgaWYgKGxpc3QuaW5jbHVkZXMoXCI7XCIpKSB7XHJcblxyXG4gICAgICBsZXQgZW1haWxzID0gbGlzdC5zcGxpdChcIjtcIilcclxuXHJcbiAgICAgIGZvciAodmFyIGVtYWlsIG9mIGVtYWlscykge1xyXG4gICAgICAgIGlmICh0aGlzLmVtYWlsSXNWYWxpZChlbWFpbCkgPT0gZmFsc2UpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIGlmICh0aGlzLmVtYWlsSXNWYWxpZChsaXN0KSA9PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIG51bGxEYXRlID0gXCIwMSBKYW4gMTk2OVwiXHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgaXNOdW1iZXIodmFsdWU6IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICgodmFsdWUgIT0gbnVsbCkgJiZcclxuICAgICAgKHZhbHVlICE9PSAnJykgJiZcclxuICAgICAgIWlzTmFOKE51bWJlcih2YWx1ZS50b1N0cmluZygpKSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBnZXREaWZmKHN0YXJ0RGF0ZSwgZW5kRGF0ZSA9IERhdGUoKSkge1xyXG5cclxuICAgIHZhciBldmVudFN0YXJ0VGltZSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZSk7XHJcbiAgICB2YXIgZXZlbnRFbmRUaW1lID0gbmV3IERhdGUoZW5kRGF0ZSk7XHJcbiAgICB2YXIgbWlsbGlzZWNvbmRzID0gZXZlbnRFbmRUaW1lLnZhbHVlT2YoKSAtIGV2ZW50U3RhcnRUaW1lLnZhbHVlT2YoKTtcclxuXHJcbiAgICBmdW5jdGlvbiBudW1iZXJFbmRpbmcobnVtYmVyOiBudW1iZXIpIHtcclxuXHJcbiAgICAgIGlmIChudW1iZXIudG9GaXhlZCgpID09ICcxJykge1xyXG4gICAgICAgIHJldHVybiAnJ1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAncyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgdmFyIG1pbnV0ZXMgPSAobWlsbGlzZWNvbmRzIC8gKDEwMDAgKiA2MCkpO1xyXG5cclxuICAgIHZhciBob3VyczogbnVtYmVyID0gKG1pbGxpc2Vjb25kcyAvICgxMDAwICogNjAgKiA2MCkpO1xyXG5cclxuICAgIHZhciBkYXlzID0gKG1pbGxpc2Vjb25kcyAvICgxMDAwICogNjAgKiA2MCAqIDI0KSk7XHJcblxyXG4gICAgdmFyIHdlZWtzOiBudW1iZXIgPSAobWlsbGlzZWNvbmRzIC8gKDEwMDAgKiA2MCAqIDYwICogMjQgKiA3KSk7XHJcblxyXG4gICAgdmFyIG1vbnRocyA9IChtaWxsaXNlY29uZHMgLyAoMTAwMCAqIDYwICogNjAgKiAyNCAqIDcgKiA0KSk7XHJcblxyXG4gICAgdmFyIHllYXJzID0gKG1pbGxpc2Vjb25kcyAvICgxMDAwICogNjAgKiA2MCAqIDI0ICogMzY1KSk7XHJcblxyXG5cclxuICAgIGlmICh5ZWFycyA+PSAxKSB7XHJcblxyXG4gICAgICByZXR1cm4geWVhcnMudG9GaXhlZCgpICsgJyB5ZWFyJyArIG51bWJlckVuZGluZyh5ZWFycyk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChtb250aHMgPj0gMSkge1xyXG5cclxuICAgICAgcmV0dXJuIG1vbnRocy50b0ZpeGVkKCkgKyAnIG1vbnRoJyArIG51bWJlckVuZGluZyhtb250aHMpO1xyXG5cclxuICAgIH0gZWxzZSBpZiAod2Vla3MgPj0gMSkge1xyXG5cclxuICAgICAgcmV0dXJuIHdlZWtzLnRvRml4ZWQoKSArICcgd2VlaycgKyBudW1iZXJFbmRpbmcod2Vla3MpO1xyXG5cclxuICAgIH0gZWxzZSBpZiAoZGF5cyA+PSAxKSB7XHJcblxyXG4gICAgICByZXR1cm4gZGF5cy50b0ZpeGVkKCkgKyAnIGRheScgKyBudW1iZXJFbmRpbmcoZGF5cyk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChob3VycyA+PSAxKSB7XHJcblxyXG4gICAgICByZXR1cm4gaG91cnMudG9GaXhlZCgpICsgJyBob3VyJyArIG51bWJlckVuZGluZyhob3Vycyk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChtaW51dGVzID49IDEpIHtcclxuXHJcbiAgICAgIHJldHVybiBtaW51dGVzLnRvRml4ZWQoKSArICcgbWludXRlJyArIG51bWJlckVuZGluZyhtaW51dGVzKTtcclxuXHJcbiAgICB9IGVsc2UgaWYgKG1pbGxpc2Vjb25kcyA+PSAoLTEwMDAgKiA2MCkpIHtcclxuXHJcbiAgICAgIHJldHVybiAnYSBtaW51dGUnO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICByZXR1cm4gJ04vQSc7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgbm93RGF0ZShOb1RpbWU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG5cclxuICAgIGlmIChOb1RpbWUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybWF0ZWREYXRlKERhdGUoKSwgdHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRGb3JtYXRlZERhdGUoRGF0ZSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0Rm9ybWF0ZWREYXRlKGRhdGVTdHJpbmc6IHN0cmluZywgTm9UaW1lOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHJcbiAgICBsZXQgZDogRGF0ZSA9IG5ldyBEYXRlKGRhdGVTdHJpbmcpO1xyXG4gICAgZC5zZXRIb3VycyhkLmdldEhvdXJzKCkgKyAyKTtcclxuXHJcbiAgICBpZiAoTm9UaW1lID09IHRydWUpIHtcclxuICAgICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKS5zcGxpdCgnLicpWzBdO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0Rm9ybWF0ZWREYXRlMihkIDogRGF0ZSwgTm9UaW1lOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHJcblxyXG4gICAgZC5zZXRIb3VycyhkLmdldEhvdXJzKCkgKyAyKTtcclxuXHJcbiAgICBpZiAoTm9UaW1lID09IHRydWUpIHtcclxuICAgICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKS5zcGxpdCgnLicpWzBdO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0QnVzaW5lc3NEYXRlc0NvdW50KHN0YXJ0RGF0ZTogc3RyaW5nLCBlbmREYXRlOiBzdHJpbmcpIHtcclxuICAgIHZhciBjb3VudCA9IDA7XHJcbiAgICB2YXIgX3N0YXJ0RGF0ZSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZSk7XHJcbiAgICB2YXIgX2VuZERhdGUgPSBuZXcgRGF0ZShlbmREYXRlKTtcclxuXHJcbiAgICB2YXIgY3VyRGF0ZSA9IF9zdGFydERhdGU7XHJcblxyXG4gICAgd2hpbGUgKGN1ckRhdGUgPCBfZW5kRGF0ZSkge1xyXG4gICAgICB2YXIgZGF5T2ZXZWVrID0gY3VyRGF0ZS5nZXREYXkoKTtcclxuICAgICAgaWYgKCEoZGF5T2ZXZWVrID09IDYgfHwgZGF5T2ZXZWVrID09IDApKSBjb3VudCsrO1xyXG4gICAgICBjdXJEYXRlLnNldERhdGUoY3VyRGF0ZS5nZXREYXRlKCkgKyAxKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY291bnQ7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBEZXRhaWxzRGlhbG9nUHJvY2Vzc29yIHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyBwcm9jZXNzRGV0YWlsc0NvbmZpZyhkZXRhaWxzQ29uZmlnOiBEZXRhaWxzRGlhbG9nQ29uZmlnLCByb3c6IGFueSk6IERldGFpbHNEaWFsb2dDb25maWcge1xyXG5cclxuICAgIGNvbnN0IHVwZGF0ZWREZXRhaWxzQ29uZmlnOiBEZXRhaWxzRGlhbG9nQ29uZmlnID0gQ29yZS5nZXRDbG9uZShkZXRhaWxzQ29uZmlnKTsgLy97Li4uZGV0YWlsc0NvbmZpZ31cclxuICAgIHVwZGF0ZWREZXRhaWxzQ29uZmlnLmRldGFpbHMgPSByb3c7XHJcblxyXG5cclxuICAgIC8vRm9ybSBDb25maWdcclxuICAgIHVwZGF0ZWREZXRhaWxzQ29uZmlnLmZvcm1Db25maWcubW9kZSA9IHVwZGF0ZWREZXRhaWxzQ29uZmlnLm1vZGUgPz8gXCJ2aWV3XCI7XHJcblxyXG5cclxuXHJcbiAgICBpZiAodXBkYXRlZERldGFpbHNDb25maWcuaGVyb0ZpZWxkICYmIHJvdykge1xyXG4gICAgICB1cGRhdGVkRGV0YWlsc0NvbmZpZy5oZXJvVmFsdWUgPSByb3dbdXBkYXRlZERldGFpbHNDb25maWcuaGVyb0ZpZWxkXTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9UYWJsZSBjb25maWdzXHJcbiAgICBpZiAodXBkYXRlZERldGFpbHNDb25maWcudGFibGVDb25maWcpIHtcclxuICAgICAgdXBkYXRlVGFibGVDb25maWcodXBkYXRlZERldGFpbHNDb25maWcudGFibGVDb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh1cGRhdGVkRGV0YWlsc0NvbmZpZy50YWJsZUNvbmZpZ3MpIHtcclxuICAgICAgdXBkYXRlZERldGFpbHNDb25maWcudGFibGVDb25maWdzLmZvckVhY2godXBkYXRlVGFibGVDb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHVwZGF0ZVRhYmxlQ29uZmlnKHRhYmxlQ29uZmlnKSB7XHJcbiAgICAgIHRhYmxlQ29uZmlnLmhlcm9GaWVsZCA9IHVwZGF0ZWREZXRhaWxzQ29uZmlnPy5oZXJvRmllbGQ7XHJcbiAgICAgIHRhYmxlQ29uZmlnLmhlcm9WYWx1ZSA9IHVwZGF0ZWREZXRhaWxzQ29uZmlnPy5oZXJvVmFsdWU7XHJcbiAgICAgIC8vIHRhYmxlQ29uZmlnLnNldEhlcm8gPSB1cGRhdGVkRGV0YWlsc0NvbmZpZy5zZXRIZXJvO1xyXG4gICAgICB0YWJsZUNvbmZpZy5zZWFyY2hDb25maWcgPSBudWxsO1xyXG4gICAgICB0YWJsZUNvbmZpZy50aWxlQ29uZmlnID0gbnVsbDtcclxuICAgICAgdGFibGVDb25maWcucGFyZW50RGF0YSA9IHVwZGF0ZWREZXRhaWxzQ29uZmlnLmRldGFpbHM7XHJcbiAgICAgIHRhYmxlQ29uZmlnLmVsZXZhdGlvbiA9ICdub25lJztcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vVVJMXHJcbiAgICBpZiAodXBkYXRlZERldGFpbHNDb25maWcudGFibGVDb25maWcpIHtcclxuICAgICAgdHJhbnNmb3JtTG9hZFVybCh1cGRhdGVkRGV0YWlsc0NvbmZpZy50YWJsZUNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHVwZGF0ZWREZXRhaWxzQ29uZmlnLnRhYmxlQ29uZmlncykge1xyXG4gICAgICB1cGRhdGVkRGV0YWlsc0NvbmZpZy50YWJsZUNvbmZpZ3MuZm9yRWFjaCh0cmFuc2Zvcm1Mb2FkVXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodXBkYXRlZERldGFpbHNDb25maWcuc3RlcENvbmZpZz8ubG9hZEFjdGlvbikge1xyXG4gICAgICB0cmFuc2Zvcm1TdGVwVXJsKHVwZGF0ZWREZXRhaWxzQ29uZmlnLnN0ZXBDb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybUxvYWRVcmwodGFibGVDb25maWcpIHtcclxuICAgICAgaWYgKHRhYmxlQ29uZmlnLmxvYWRBY3Rpb24gJiYgdGFibGVDb25maWcubG9hZENyaXRlcmlhICYmIHRhYmxlQ29uZmlnLmxvYWRJREZpZWxkKSB7XHJcbiAgICAgICAgdGFibGVDb25maWcubG9hZEFjdGlvbi51cmwgPSBgJHt0YWJsZUNvbmZpZy5sb2FkQWN0aW9uLnVybC5zcGxpdCgnLycpWzBdfS8ke3RhYmxlQ29uZmlnLmxvYWRDcml0ZXJpYX0vJHt1cGRhdGVkRGV0YWlsc0NvbmZpZy5kZXRhaWxzW3RhYmxlQ29uZmlnLmxvYWRJREZpZWxkXX1gO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhcIlRyYW5zZm9ybWVkXCIsIHRhYmxlQ29uZmlnLmxvYWRBY3Rpb24udXJsKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIk5PVCBUcmFuc2Zvcm1lZFwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVN0ZXBVcmwoc3RlcENvbmZpZykge1xyXG4gICAgICBpZiAoc3RlcENvbmZpZy5sb2FkQWN0aW9uICYmIHN0ZXBDb25maWcubG9hZElERmllbGQgKSB7XHJcbiAgICAgICAgLy8gbGV0IGhlcm9JZCA9IHVwZGF0ZWREZXRhaWxzQ29uZmlnLmRldGFpbHNbdXBkYXRlZERldGFpbHNDb25maWcuaGVyb0ZpZWxkXTtcclxuICAgICAgICBzdGVwQ29uZmlnLmxvYWRBY3Rpb24udXJsID0gYCR7c3RlcENvbmZpZy5sb2FkQWN0aW9uLnVybC5yZXBsYWNlKCd7aWR9JywgdXBkYXRlZERldGFpbHNDb25maWcuZGV0YWlsc1tzdGVwQ29uZmlnLmxvYWRJREZpZWxkXSl9YDtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRyYW5zZm9ybWVkIHN0ZXAgVVJMXCIsIHN0ZXBDb25maWcubG9hZEFjdGlvbi51cmwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICByZXR1cm4gdXBkYXRlZERldGFpbHNDb25maWc7XHJcbiAgfVxyXG5cclxuXHJcbiAgc3RhdGljIGluaXRpYWxpemVDb25maWdzKGRldGFpbHNDb25maWc6IERldGFpbHNEaWFsb2dDb25maWcpIHtcclxuICAgIGNvbnN0IHRhYmxlQ29uZmlnID0gZGV0YWlsc0NvbmZpZy50YWJsZUNvbmZpZztcclxuICAgIGNvbnN0IHRhYmxlQ29uZmlncyA9IGRldGFpbHNDb25maWcudGFibGVDb25maWdzO1xyXG4gICAgY29uc3QgZm9ybUNvbmZpZyA9IGRldGFpbHNDb25maWcuZm9ybUNvbmZpZztcclxuICAgIGNvbnN0IHN0ZXBDb25maWcgPSBkZXRhaWxzQ29uZmlnLnN0ZXBDb25maWc7XHJcbiAgICBjb25zdCBzdGF0dXNDb25maWcgPSBkZXRhaWxzQ29uZmlnLnN0YXR1c0NvbmZpZzsgXHJcbiAgICBjb25zdCBidXR0b25zID0gZGV0YWlsc0NvbmZpZy5idXR0b25zO1xyXG4gICAgZm9ybUNvbmZpZy5tb2RlID0gZm9ybUNvbmZpZy5tb2RlID8/IFwidmlld1wiO1xyXG4gICAgcmV0dXJuIHsgdGFibGVDb25maWcsIHRhYmxlQ29uZmlncywgZm9ybUNvbmZpZywgc3RlcENvbmZpZywgc3RhdHVzQ29uZmlnLCBidXR0b25zIH07XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgc2V0SGVyb1ZhbHVlKGRldGFpbHNDb25maWc6IERldGFpbHNEaWFsb2dDb25maWcsIGRldGFpbHM6IGFueSkge1xyXG5cclxuXHJcbiAgICBpZiAoKGRldGFpbHNDb25maWcuZm9ybUNvbmZpZy5tb2RlID09IFwiY3JlYXRlXCIgICkgJiYgZGV0YWlsc0NvbmZpZy5oZXJvRmllbGQgJiYgZGV0YWlsc0NvbmZpZy5oZXJvVmFsdWUpIHtcclxuICAgICAgZGV0YWlsc1tkZXRhaWxzQ29uZmlnLmhlcm9GaWVsZF0gPSBkZXRhaWxzQ29uZmlnLmhlcm9WYWx1ZTtcclxuXHJcbiAgICAgIC8vIEVuc3VyZSBoZXJvIHZhbHVlcyBhcmUgc2V0IGluIGZvcm0gY29uZmlnXHJcbiAgICAgIGRldGFpbHNDb25maWcuZm9ybUNvbmZpZy5oZXJvRmllbGQgPSBkZXRhaWxzQ29uZmlnLmhlcm9GaWVsZDtcclxuICAgICAgZGV0YWlsc0NvbmZpZy5mb3JtQ29uZmlnLmhlcm9WYWx1ZSA9IGRldGFpbHNDb25maWcuaGVyb1ZhbHVlO1xyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaGFuZGxlRm9ybU1vZGUoZGV0YWlsc0NvbmZpZzogRGV0YWlsc0RpYWxvZ0NvbmZpZywgZm9ybUNvbmZpZzogRm9ybUNvbmZpZywpIHtcclxuICAgIGxldCBkZXRhaWxzO1xyXG4gICAgbGV0IGFjdGlvbjtcclxuICAgIGxldCBsb2FkQnlBY3Rpb24gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoZm9ybUNvbmZpZy5tb2RlID09PSBcImNyZWF0ZVwiKSB7XHJcblxyXG4gICAgICBkZXRhaWxzID0gQ29yZS5nZW5lcmF0ZU9iamVjdChmb3JtQ29uZmlnLmZpZWxkcyk7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IHJlc3AgPSB0aGlzLmxvYWREZXRhaWxzRGF0YShkZXRhaWxzQ29uZmlnLCBmb3JtQ29uZmlnKTtcclxuICAgICAgZGV0YWlscyA9IHJlc3AuZGV0YWlscztcclxuXHJcbiAgICAgIGFjdGlvbiA9IHJlc3AuYWN0aW9uO1xyXG4gICAgICBsb2FkQnlBY3Rpb24gPSByZXNwLmxvYWRCeUFjdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyBkZXRhaWxzLCBsb2FkQnlBY3Rpb24sIGFjdGlvbiB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgbG9hZERldGFpbHNEYXRhKGRldGFpbHNDb25maWc6IERldGFpbHNEaWFsb2dDb25maWcsIGZvcm1Db25maWc6IEZvcm1Db25maWcpIHtcclxuXHJcbiAgICBsZXQgZGV0YWlscztcclxuICAgIGxldCBhY3Rpb247XHJcbiAgICBsZXQgbG9hZEJ5QWN0aW9uID0gZmFsc2U7XHJcblxyXG5cclxuICAgIC8vQ2hvb3NlIHNvdXJjZVxyXG4gICAgaWYgKGRldGFpbHNDb25maWcuZGV0YWlsc1NvdXJjZSA9PSBEZXRhaWxzU291cmNlLlJvdykge1xyXG5cclxuICAgICAgY29uc29sZS5sb2coXCJEYXRhIGZyb20gRGV0YWlscyAtIFJvdyBvcHRpb25cIilcclxuICAgICAgZGV0YWlscyA9IGRldGFpbHNDb25maWcuZGV0YWlscztcclxuXHJcbiAgICB9IGVsc2UgaWYgKGRldGFpbHNDb25maWcuZGV0YWlsc1NvdXJjZSA9PSBEZXRhaWxzU291cmNlLlVybCkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkRhdGEgZnJvbSBVcmwgb3B0aW9uXCIpXHJcbiAgICAgIGFjdGlvbiA9IHRoaXMubG9hZERldGFpbHNGcm9tVXJsKGRldGFpbHNDb25maWcsIGZvcm1Db25maWcpO1xyXG4gICAgICBsb2FkQnlBY3Rpb24gPSB0cnVlO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAvL25ldyBsb2dpY1xyXG4gICAgICBpZiAoZm9ybUNvbmZpZy5sb2FkQWN0aW9uKXtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkRhdGEgZnJvbSBVcmwgLSBHdWVzc2VkXCIpO1xyXG4gICAgICAgICAgYWN0aW9uID0gdGhpcy5sb2FkRGV0YWlsc0Zyb21VcmwoZGV0YWlsc0NvbmZpZywgZm9ybUNvbmZpZyk7XHJcbiAgICAgICAgICBsb2FkQnlBY3Rpb24gPSB0cnVlO1xyXG5cclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkRhdGEgZnJvbSBEZXRhaWxzIC0gR3Vlc3NlZFwiKTtcclxuICAgICAgICAgIGRldGFpbHMgPSBkZXRhaWxzQ29uZmlnLmRldGFpbHM7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHsgZGV0YWlscywgbG9hZEJ5QWN0aW9uLCBhY3Rpb24gfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGxvYWREZXRhaWxzRnJvbVVybChkZXRhaWxzQ29uZmlnOiBEZXRhaWxzRGlhbG9nQ29uZmlnLCBmb3JtQ29uZmlnOiBGb3JtQ29uZmlnKSB7XHJcbiAgICBsZXQgYWN0aW9uIDogQWN0aW9uO1xyXG5cclxuICAgIGlmIChmb3JtQ29uZmlnLmxvYWRBY3Rpb24pIHtcclxuXHJcbiAgICAgIGlmIChkZXRhaWxzQ29uZmlnLmhlcm9GaWVsZCAmJiBkZXRhaWxzQ29uZmlnLmRldGFpbHMpIHtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJEZXRhaWxzQ29uZmlnIEhlcm8gSUQgRmllbGQgXCIgKyBkZXRhaWxzQ29uZmlnLmhlcm9GaWVsZCk7XHJcbiAgICAgICAgYWN0aW9uID0geyB1cmw6IGAke2Zvcm1Db25maWcubG9hZEFjdGlvbi51cmx9LyR7ZGV0YWlsc0NvbmZpZy5kZXRhaWxzW2RldGFpbHNDb25maWcuaGVyb0ZpZWxkXX1gIH07XHJcblxyXG4gICAgICB9IGVsc2UgaWYgKGZvcm1Db25maWcuaGVyb0ZpZWxkICYmIGRldGFpbHNDb25maWcuZGV0YWlscykge1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhcIkZvcm1Db25maWcgSGVybyBJRCBGaWVsZCBcIiArIGZvcm1Db25maWcuaGVyb0ZpZWxkKTtcclxuICAgICAgICBhY3Rpb24gPSB7IHVybDogYCR7Zm9ybUNvbmZpZy5sb2FkQWN0aW9uLnVybH0vJHtkZXRhaWxzQ29uZmlnLmRldGFpbHNbZm9ybUNvbmZpZy5oZXJvRmllbGRdfWAgfTtcclxuXHJcbiAgICAgIH0gZWxzZSBpZiAoZGV0YWlsc0NvbmZpZy5oZXJvVmFsdWUpIHtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJEZWZpbmVkIEhlcm8gVmFsdWUgXCIgKyBkZXRhaWxzQ29uZmlnLmhlcm9WYWx1ZSk7XHJcbiAgICAgICAgYWN0aW9uID0geyB1cmw6IGAke2Zvcm1Db25maWcubG9hZEFjdGlvbi51cmx9LyR7ZGV0YWlsc0NvbmZpZy5oZXJvVmFsdWV9YCB9O1xyXG5cclxuICAgICAgfVxyXG4gICAgICBlbHNle1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwidXJsIHNvdXJjZSBmYWlsZWQgOiBzZXR1cCBoZXJvIGZpZWxkIG9yIGhlcm8gdmFsdWVcIik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGFjdGlvbi5jYWNoZUR1cmF0aW9uTWludXRlcyA9IGZvcm1Db25maWcubG9hZEFjdGlvbi5jYWNoZUR1cmF0aW9uTWludXRlcyA/PyAwO1xyXG4gICAgICBhY3Rpb24uc2tpcENhY2hlID0gZm9ybUNvbmZpZy5sb2FkQWN0aW9uLnNraXBDYWNoZSA/PyBmYWxzZTtcclxuICAgICAgYWN0aW9uLnN1Y2Nlc3NNZXNzYWdlID0gZm9ybUNvbmZpZy5sb2FkQWN0aW9uLnN1Y2Nlc3NNZXNzYWdlID8/IG51bGw7XHJcblxyXG4gICAgfWVsc2V7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiTm8gbG9hZCBhY3Rpb24gc2V0XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhY3Rpb247XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgc2V0RmlsZUZpZWxkKGZvcm1Db25maWc6IEZvcm1Db25maWcpIHtcclxuICAgIHJldHVybiBmb3JtQ29uZmlnLmZpZWxkcy5maW5kKHggPT4geC50eXBlID09PSAnZmlsZScpO1xyXG4gIH1cclxuXHJcblxyXG4gIHN0YXRpYyBzZXR1cEJ1dHRvbnMoYnV0dG9uczogYW55KSB7XHJcbiAgICBsZXQgZXh0cmFCdXR0b25zLCBjcmVhdGVCdXR0b24sIGVkaXRCdXR0b24sIGRlbGV0ZUJ1dHRvbjtcclxuXHJcbiAgICBpZiAoYnV0dG9ucykge1xyXG4gICAgICBleHRyYUJ1dHRvbnMgPSBidXR0b25zLmZpbHRlcih4ID0+IHgubmFtZSAhPT0gXCJjcmVhdGVcIiAmJiB4Lm5hbWUgIT09IFwiZWRpdFwiICYmIHgubmFtZSAhPT0gXCJkZWxldGVcIiAmJiB4Lm5hbWUgIT09IFwidmlld1wiICYmIHguaW5EaWFsb2cpO1xyXG4gICAgICBjcmVhdGVCdXR0b24gPSBidXR0b25zLmZpbmQoeCA9PiB4Lm5hbWUgPT09IFwiY3JlYXRlXCIpO1xyXG4gICAgICBlZGl0QnV0dG9uID0gYnV0dG9ucy5maW5kKHggPT4geC5uYW1lID09PSBcImVkaXRcIik7XHJcbiAgICAgIGRlbGV0ZUJ1dHRvbiA9IGJ1dHRvbnMuZmluZCh4ID0+IHgubmFtZSA9PT0gXCJkZWxldGVcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBleHRyYUJ1dHRvbnMsIGNyZWF0ZUJ1dHRvbiwgZWRpdEJ1dHRvbiwgZGVsZXRlQnV0dG9uIH07XHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxufVxyXG5cclxuXHJcbiJdfQ==
|