monkey-front-components 0.0.384 → 0.0.387
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/esm2020/lib/components/base/base-component.mjs +322 -0
- package/esm2020/lib/components/base/base-dynamic-array.mjs +221 -0
- package/esm2020/lib/components/base/base-dynamic.mjs +99 -0
- package/esm2020/lib/components/base/base-scroll-component.mjs +55 -0
- package/esm2020/lib/components/base/base-validators.mjs +19 -0
- package/esm2020/lib/components/base/index.mjs +6 -0
- package/esm2020/lib/components/dynamic/button/button.component.mjs +52 -0
- package/esm2020/lib/components/dynamic/button/index.mjs +2 -0
- package/esm2020/lib/components/dynamic/dynamic-directive.mjs +95 -0
- package/esm2020/lib/components/dynamic/dynamic.module.mjs +84 -0
- package/esm2020/lib/components/dynamic/file-upload/file-upload.component.mjs +52 -0
- package/esm2020/lib/components/dynamic/file-upload/index.mjs +2 -0
- package/esm2020/lib/components/dynamic/form/dynamic-form-array.component.mjs +72 -0
- package/esm2020/lib/components/dynamic/form/dynamic-form.component.mjs +46 -0
- package/esm2020/lib/components/dynamic/form/index.mjs +3 -0
- package/esm2020/lib/components/dynamic/index.mjs +9 -0
- package/esm2020/lib/components/dynamic/input/index.mjs +2 -0
- package/esm2020/lib/components/dynamic/input/input.component.mjs +65 -0
- package/esm2020/lib/components/dynamic/input-phone/index.mjs +2 -0
- package/esm2020/lib/components/dynamic/input-phone/input-phone.component.mjs +65 -0
- package/esm2020/lib/components/dynamic/radio/index.mjs +2 -0
- package/esm2020/lib/components/dynamic/radio/radio.component.mjs +33 -0
- package/esm2020/lib/components/dynamic/select/index.mjs +2 -0
- package/esm2020/lib/components/dynamic/select/select.component.mjs +80 -0
- package/esm2020/lib/components/dynamic/select-search/index.mjs +2 -0
- package/esm2020/lib/components/dynamic/select-search/select-search.component.mjs +80 -0
- package/esm2020/lib/components/index.mjs +4 -0
- package/esm2020/lib/components/shared/filter/filter.component.mjs +119 -0
- package/esm2020/lib/components/shared/filter/filter.module.mjs +63 -0
- package/esm2020/lib/components/shared/filter/index.mjs +3 -0
- package/esm2020/lib/components/shared/filter/menu/index.mjs +2 -0
- package/esm2020/lib/components/shared/filter/menu/menu.component.mjs +120 -0
- package/esm2020/lib/components/shared/filter/menu/menu.module.mjs +70 -0
- package/esm2020/lib/components/shared/filter/options/children/children.component.mjs +50 -0
- package/esm2020/lib/components/shared/filter/options/children/index.mjs +2 -0
- package/esm2020/lib/components/shared/filter/options/currency/currency.component.mjs +46 -0
- package/esm2020/lib/components/shared/filter/options/currency/index.mjs +2 -0
- package/esm2020/lib/components/shared/filter/options/date-range/date-range.component.mjs +65 -0
- package/esm2020/lib/components/shared/filter/options/date-range/index.mjs +2 -0
- package/esm2020/lib/components/shared/filter/options/index.mjs +2 -0
- package/esm2020/lib/components/shared/filter/options/input/index.mjs +2 -0
- package/esm2020/lib/components/shared/filter/options/input/input.component.mjs +46 -0
- package/esm2020/lib/components/shared/filter/options/options.component.mjs +68 -0
- package/esm2020/lib/components/shared/filter/options/options.module.mjs +95 -0
- package/esm2020/lib/components/shared/filter/options/status/index.mjs +2 -0
- package/esm2020/lib/components/shared/filter/options/status/status.component.mjs +66 -0
- package/esm2020/lib/components/shared/filter/selected/index.mjs +2 -0
- package/esm2020/lib/components/shared/filter/selected/item/children/children.component.mjs +57 -0
- package/esm2020/lib/components/shared/filter/selected/item/children/index.mjs +2 -0
- package/esm2020/lib/components/shared/filter/selected/item/currency/currency.component.mjs +29 -0
- package/esm2020/lib/components/shared/filter/selected/item/currency/index.mjs +2 -0
- package/esm2020/lib/components/shared/filter/selected/item/date-range/date-range.component.mjs +42 -0
- package/esm2020/lib/components/shared/filter/selected/item/date-range/index.mjs +2 -0
- package/esm2020/lib/components/shared/filter/selected/item/date-with-action/date-with-action.component.mjs +33 -0
- package/esm2020/lib/components/shared/filter/selected/item/date-with-action/index.mjs +2 -0
- package/esm2020/lib/components/shared/filter/selected/item/index.mjs +8 -0
- package/esm2020/lib/components/shared/filter/selected/item/input/index.mjs +2 -0
- package/esm2020/lib/components/shared/filter/selected/item/input/input.component.mjs +28 -0
- package/esm2020/lib/components/shared/filter/selected/item/item.component.mjs +74 -0
- package/esm2020/lib/components/shared/filter/selected/item/status/index.mjs +2 -0
- package/esm2020/lib/components/shared/filter/selected/item/status/status.component.mjs +39 -0
- package/esm2020/lib/components/shared/filter/selected/selected.component.mjs +80 -0
- package/esm2020/lib/components/shared/filter/selected/selected.module.mjs +90 -0
- package/esm2020/lib/components/shared/index.mjs +5 -0
- package/esm2020/lib/components/shared/password-strength/index.mjs +3 -0
- package/esm2020/lib/components/shared/password-strength/password-strength.component.mjs +85 -0
- package/esm2020/lib/components/shared/password-strength/password-strength.mjs +2 -0
- package/esm2020/lib/components/shared/password-strength/password-strength.module.mjs +50 -0
- package/esm2020/lib/components/shared/products/filter/filter.component.mjs +36 -0
- package/esm2020/lib/components/shared/products/index.mjs +3 -0
- package/esm2020/lib/components/shared/products/products.component.mjs +91 -0
- package/esm2020/lib/components/shared/products/products.module.mjs +22 -0
- package/esm2020/lib/components/shared/products/providers/index.mjs +2 -0
- package/esm2020/lib/components/shared/products/providers/products.model.mjs +38 -0
- package/esm2020/lib/components/shared/progress-bar/index.mjs +4 -0
- package/esm2020/lib/components/shared/progress-bar/progress-bar.component.mjs +28 -0
- package/esm2020/lib/components/shared/progress-bar/progress-bar.module.mjs +18 -0
- package/esm2020/lib/components/shared/progress-bar/progress-bar.service.mjs +49 -0
- package/esm2020/lib/interfaces/field-config.mjs +2 -0
- package/esm2020/lib/interfaces/index.mjs +2 -0
- package/esm2020/monkey-front-components.mjs +5 -0
- package/esm2020/public-api.mjs +5 -0
- package/fesm2015/monkey-front-components.mjs +2877 -0
- package/fesm2015/monkey-front-components.mjs.map +1 -0
- package/fesm2020/monkey-front-components.mjs +2859 -0
- package/fesm2020/monkey-front-components.mjs.map +1 -0
- package/lib/components/base/base-component.d.ts +50 -0
- package/lib/components/base/base-dynamic-array.d.ts +34 -0
- package/lib/components/base/base-dynamic.d.ts +24 -0
- package/lib/components/base/base-scroll-component.d.ts +16 -0
- package/lib/components/base/base-validators.d.ts +1 -0
- package/{src/lib/components/base/index.ts → lib/components/base/index.d.ts} +5 -5
- package/lib/components/dynamic/button/button.component.d.ts +17 -0
- package/{src/lib/components/dynamic/button/index.ts → lib/components/dynamic/button/index.d.ts} +1 -1
- package/lib/components/dynamic/dynamic-directive.d.ts +22 -0
- package/lib/components/dynamic/dynamic.module.d.ts +20 -0
- package/lib/components/dynamic/file-upload/file-upload.component.d.ts +17 -0
- package/{src/lib/components/dynamic/file-upload/index.ts → lib/components/dynamic/file-upload/index.d.ts} +1 -1
- package/lib/components/dynamic/form/dynamic-form-array.component.d.ts +16 -0
- package/lib/components/dynamic/form/dynamic-form.component.d.ts +14 -0
- package/{src/lib/components/dynamic/form/index.ts → lib/components/dynamic/form/index.d.ts} +2 -2
- package/{src/lib/components/dynamic/index.ts → lib/components/dynamic/index.d.ts} +8 -8
- package/{src/lib/components/dynamic/input/index.ts → lib/components/dynamic/input/index.d.ts} +1 -1
- package/lib/components/dynamic/input/input.component.d.ts +20 -0
- package/{src/lib/components/dynamic/input-phone/index.ts → lib/components/dynamic/input-phone/index.d.ts} +1 -1
- package/lib/components/dynamic/input-phone/input-phone.component.d.ts +20 -0
- package/{src/lib/components/dynamic/radio/index.ts → lib/components/dynamic/radio/index.d.ts} +1 -1
- package/lib/components/dynamic/radio/radio.component.d.ts +11 -0
- package/{src/lib/components/dynamic/select/index.ts → lib/components/dynamic/select/index.d.ts} +1 -1
- package/lib/components/dynamic/select/select.component.d.ts +16 -0
- package/{src/lib/components/dynamic/select-search/index.ts → lib/components/dynamic/select-search/index.d.ts} +1 -1
- package/lib/components/dynamic/select-search/select-search.component.d.ts +16 -0
- package/{src/lib/components/index.ts → lib/components/index.d.ts} +3 -3
- package/lib/components/shared/filter/filter.component.d.ts +32 -0
- package/lib/components/shared/filter/filter.module.d.ts +14 -0
- package/{src/lib/components/shared/filter/index.ts → lib/components/shared/filter/index.d.ts} +2 -2
- package/{src/lib/components/shared/filter/menu/index.ts → lib/components/shared/filter/menu/index.d.ts} +1 -1
- package/lib/components/shared/filter/menu/menu.component.d.ts +24 -0
- package/lib/components/shared/filter/menu/menu.module.d.ts +14 -0
- package/lib/components/shared/filter/options/children/children.component.d.ts +17 -0
- package/{src/lib/components/shared/filter/options/children/index.ts → lib/components/shared/filter/options/children/index.d.ts} +1 -1
- package/lib/components/shared/filter/options/currency/currency.component.d.ts +17 -0
- package/{src/lib/components/shared/filter/options/currency/index.ts → lib/components/shared/filter/options/currency/index.d.ts} +1 -1
- package/lib/components/shared/filter/options/date-range/date-range.component.d.ts +24 -0
- package/{src/lib/components/shared/filter/options/date-range/index.ts → lib/components/shared/filter/options/date-range/index.d.ts} +1 -1
- package/{src/lib/components/shared/filter/options/index.ts → lib/components/shared/filter/options/index.d.ts} +1 -1
- package/{src/lib/components/shared/filter/options/input/index.ts → lib/components/shared/filter/options/input/index.d.ts} +1 -1
- package/lib/components/shared/filter/options/input/input.component.d.ts +17 -0
- package/lib/components/shared/filter/options/options.component.d.ts +20 -0
- package/lib/components/shared/filter/options/options.module.d.ts +18 -0
- package/{src/lib/components/shared/filter/options/status/index.ts → lib/components/shared/filter/options/status/index.d.ts} +1 -1
- package/lib/components/shared/filter/options/status/status.component.d.ts +19 -0
- package/{src/lib/components/shared/filter/selected/index.ts → lib/components/shared/filter/selected/index.d.ts} +1 -1
- package/lib/components/shared/filter/selected/item/children/children.component.d.ts +16 -0
- package/{src/lib/components/shared/filter/selected/item/children/index.ts → lib/components/shared/filter/selected/item/children/index.d.ts} +1 -1
- package/lib/components/shared/filter/selected/item/currency/currency.component.d.ts +11 -0
- package/{src/lib/components/shared/filter/selected/item/currency/index.ts → lib/components/shared/filter/selected/item/currency/index.d.ts} +1 -1
- package/lib/components/shared/filter/selected/item/date-range/date-range.component.d.ts +12 -0
- package/{src/lib/components/shared/filter/selected/item/date-range/index.ts → lib/components/shared/filter/selected/item/date-range/index.d.ts} +1 -1
- package/lib/components/shared/filter/selected/item/date-with-action/date-with-action.component.d.ts +11 -0
- package/{src/lib/components/shared/filter/selected/item/date-with-action/index.ts → lib/components/shared/filter/selected/item/date-with-action/index.d.ts} +1 -1
- package/{src/lib/components/shared/filter/selected/item/index.ts → lib/components/shared/filter/selected/item/index.d.ts} +7 -7
- package/{src/lib/components/shared/filter/selected/item/input/index.ts → lib/components/shared/filter/selected/item/input/index.d.ts} +1 -1
- package/lib/components/shared/filter/selected/item/input/input.component.d.ts +11 -0
- package/lib/components/shared/filter/selected/item/item.component.d.ts +20 -0
- package/{src/lib/components/shared/filter/selected/item/status/index.ts → lib/components/shared/filter/selected/item/status/index.d.ts} +1 -1
- package/lib/components/shared/filter/selected/item/status/status.component.d.ts +13 -0
- package/lib/components/shared/filter/selected/selected.component.d.ts +18 -0
- package/lib/components/shared/filter/selected/selected.module.d.ts +21 -0
- package/{src/lib/components/shared/index.ts → lib/components/shared/index.d.ts} +4 -4
- package/{src/lib/components/shared/password-strength/index.ts → lib/components/shared/password-strength/index.d.ts} +2 -2
- package/lib/components/shared/password-strength/password-strength.component.d.ts +23 -0
- package/lib/components/shared/password-strength/password-strength.d.ts +5 -0
- package/lib/components/shared/password-strength/password-strength.module.d.ts +12 -0
- package/lib/components/shared/products/filter/filter.component.d.ts +12 -0
- package/{src/lib/components/shared/products/index.ts → lib/components/shared/products/index.d.ts} +2 -2
- package/lib/components/shared/products/products.component.d.ts +20 -0
- package/lib/components/shared/products/products.module.d.ts +11 -0
- package/{src/lib/components/shared/products/providers/index.ts → lib/components/shared/products/providers/index.d.ts} +1 -1
- package/lib/components/shared/products/providers/products.model.d.ts +13 -0
- package/{src/lib/components/shared/progress-bar/index.ts → lib/components/shared/progress-bar/index.d.ts} +3 -3
- package/lib/components/shared/progress-bar/progress-bar.component.d.ts +12 -0
- package/lib/components/shared/progress-bar/progress-bar.module.d.ts +8 -0
- package/lib/components/shared/progress-bar/progress-bar.service.d.ts +14 -0
- package/lib/interfaces/field-config.d.ts +54 -0
- package/{src/lib/interfaces/index.ts → lib/interfaces/index.d.ts} +1 -1
- package/monkey-front-components-0.0.387.tgz +0 -0
- package/monkey-front-components.d.ts +5 -0
- package/package.json +25 -5
- package/public-api.d.ts +1 -0
- package/karma.conf.js +0 -44
- package/monkey-front-components-0.0.384.tgz +0 -0
- package/ng-package.json +0 -10
- package/src/lib/components/base/base-component.ts +0 -359
- package/src/lib/components/base/base-dynamic-array.ts +0 -233
- package/src/lib/components/base/base-dynamic.ts +0 -90
- package/src/lib/components/base/base-scroll-component.ts +0 -52
- package/src/lib/components/base/base-validators.ts +0 -19
- package/src/lib/components/dynamic/button/button.component.html +0 -4
- package/src/lib/components/dynamic/button/button.component.scss +0 -7
- package/src/lib/components/dynamic/button/button.component.ts +0 -47
- package/src/lib/components/dynamic/dynamic-directive.ts +0 -102
- package/src/lib/components/dynamic/dynamic.module.ts +0 -53
- package/src/lib/components/dynamic/file-upload/file-upload.component.html +0 -10
- package/src/lib/components/dynamic/file-upload/file-upload.component.ts +0 -46
- package/src/lib/components/dynamic/form/dynamic-form-array.component.html +0 -19
- package/src/lib/components/dynamic/form/dynamic-form-array.component.scss +0 -10
- package/src/lib/components/dynamic/form/dynamic-form-array.component.ts +0 -75
- package/src/lib/components/dynamic/form/dynamic-form.component.html +0 -7
- package/src/lib/components/dynamic/form/dynamic-form.component.ts +0 -49
- package/src/lib/components/dynamic/input/input.component.html +0 -9
- package/src/lib/components/dynamic/input/input.component.ts +0 -58
- package/src/lib/components/dynamic/input-phone/input-phone.component.html +0 -7
- package/src/lib/components/dynamic/input-phone/input-phone.component.ts +0 -58
- package/src/lib/components/dynamic/radio/radio.component.html +0 -8
- package/src/lib/components/dynamic/radio/radio.component.ts +0 -22
- package/src/lib/components/dynamic/select/select.component.html +0 -14
- package/src/lib/components/dynamic/select/select.component.ts +0 -75
- package/src/lib/components/dynamic/select-search/select-search.component.html +0 -15
- package/src/lib/components/dynamic/select-search/select-search.component.ts +0 -76
- package/src/lib/components/shared/filter/filter.component.html +0 -51
- package/src/lib/components/shared/filter/filter.component.scss +0 -79
- package/src/lib/components/shared/filter/filter.component.ts +0 -117
- package/src/lib/components/shared/filter/filter.module.ts +0 -36
- package/src/lib/components/shared/filter/menu/menu.component.html +0 -28
- package/src/lib/components/shared/filter/menu/menu.component.scss +0 -62
- package/src/lib/components/shared/filter/menu/menu.component.ts +0 -122
- package/src/lib/components/shared/filter/menu/menu.module.ts +0 -41
- package/src/lib/components/shared/filter/options/children/children.component.html +0 -6
- package/src/lib/components/shared/filter/options/children/children.component.scss +0 -30
- package/src/lib/components/shared/filter/options/children/children.component.ts +0 -58
- package/src/lib/components/shared/filter/options/currency/currency.component.html +0 -3
- package/src/lib/components/shared/filter/options/currency/currency.component.scss +0 -19
- package/src/lib/components/shared/filter/options/currency/currency.component.ts +0 -52
- package/src/lib/components/shared/filter/options/date-range/date-range.component.html +0 -3
- package/src/lib/components/shared/filter/options/date-range/date-range.component.scss +0 -34
- package/src/lib/components/shared/filter/options/date-range/date-range.component.ts +0 -72
- package/src/lib/components/shared/filter/options/input/input.component.html +0 -3
- package/src/lib/components/shared/filter/options/input/input.component.scss +0 -19
- package/src/lib/components/shared/filter/options/input/input.component.ts +0 -52
- package/src/lib/components/shared/filter/options/options.component.html +0 -43
- package/src/lib/components/shared/filter/options/options.component.scss +0 -56
- package/src/lib/components/shared/filter/options/options.component.ts +0 -58
- package/src/lib/components/shared/filter/options/options.module.ts +0 -58
- package/src/lib/components/shared/filter/options/status/status.component.html +0 -4
- package/src/lib/components/shared/filter/options/status/status.component.scss +0 -29
- package/src/lib/components/shared/filter/options/status/status.component.ts +0 -73
- package/src/lib/components/shared/filter/selected/item/children/children.component.html +0 -19
- package/src/lib/components/shared/filter/selected/item/children/children.component.scss +0 -68
- package/src/lib/components/shared/filter/selected/item/children/children.component.ts +0 -49
- package/src/lib/components/shared/filter/selected/item/currency/currency.component.html +0 -1
- package/src/lib/components/shared/filter/selected/item/currency/currency.component.scss +0 -4
- package/src/lib/components/shared/filter/selected/item/currency/currency.component.ts +0 -26
- package/src/lib/components/shared/filter/selected/item/date-range/date-range.component.html +0 -2
- package/src/lib/components/shared/filter/selected/item/date-range/date-range.component.scss +0 -4
- package/src/lib/components/shared/filter/selected/item/date-range/date-range.component.ts +0 -39
- package/src/lib/components/shared/filter/selected/item/date-with-action/date-with-action.component.html +0 -1
- package/src/lib/components/shared/filter/selected/item/date-with-action/date-with-action.component.scss +0 -4
- package/src/lib/components/shared/filter/selected/item/date-with-action/date-with-action.component.ts +0 -29
- package/src/lib/components/shared/filter/selected/item/input/input.component.html +0 -1
- package/src/lib/components/shared/filter/selected/item/input/input.component.scss +0 -4
- package/src/lib/components/shared/filter/selected/item/input/input.component.ts +0 -26
- package/src/lib/components/shared/filter/selected/item/item.component.html +0 -38
- package/src/lib/components/shared/filter/selected/item/item.component.scss +0 -72
- package/src/lib/components/shared/filter/selected/item/item.component.ts +0 -71
- package/src/lib/components/shared/filter/selected/item/status/status.component.html +0 -1
- package/src/lib/components/shared/filter/selected/item/status/status.component.scss +0 -4
- package/src/lib/components/shared/filter/selected/item/status/status.component.ts +0 -36
- package/src/lib/components/shared/filter/selected/selected.component.html +0 -3
- package/src/lib/components/shared/filter/selected/selected.component.scss +0 -9
- package/src/lib/components/shared/filter/selected/selected.component.ts +0 -76
- package/src/lib/components/shared/filter/selected/selected.module.ts +0 -60
- package/src/lib/components/shared/password-strength/password-strength.component.html +0 -50
- package/src/lib/components/shared/password-strength/password-strength.component.scss +0 -70
- package/src/lib/components/shared/password-strength/password-strength.component.ts +0 -89
- package/src/lib/components/shared/password-strength/password-strength.module.ts +0 -24
- package/src/lib/components/shared/password-strength/password-strength.ts +0 -5
- package/src/lib/components/shared/products/filter/filter.component.html +0 -6
- package/src/lib/components/shared/products/filter/filter.component.scss +0 -20
- package/src/lib/components/shared/products/filter/filter.component.ts +0 -34
- package/src/lib/components/shared/products/products.component.html +0 -15
- package/src/lib/components/shared/products/products.component.scss +0 -70
- package/src/lib/components/shared/products/products.component.ts +0 -104
- package/src/lib/components/shared/products/products.module.ts +0 -13
- package/src/lib/components/shared/products/providers/products.model.ts +0 -60
- package/src/lib/components/shared/progress-bar/progress-bar.component.html +0 -3
- package/src/lib/components/shared/progress-bar/progress-bar.component.scss +0 -6
- package/src/lib/components/shared/progress-bar/progress-bar.component.ts +0 -27
- package/src/lib/components/shared/progress-bar/progress-bar.module.ts +0 -10
- package/src/lib/components/shared/progress-bar/progress-bar.service.ts +0 -59
- package/src/lib/interfaces/field-config.ts +0 -58
- package/src/public-api.ts +0 -5
- package/src/test.ts +0 -26
- package/tsconfig.lib.json +0 -20
- package/tsconfig.lib.prod.json +0 -10
- package/tsconfig.spec.json +0 -17
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
import { Subject } from 'rxjs';
|
|
2
|
+
import { Directive } from '@angular/core';
|
|
3
|
+
import { takeUntil } from 'rxjs/operators';
|
|
4
|
+
import { MonkeyUtils } from 'monkey-style-guide';
|
|
5
|
+
import { MonkeyEcxCommonsService, ValidateUtils } from 'monkey-front-core';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class BaseComponent {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.__paginationOptions = null;
|
|
10
|
+
this.__isMobile = this.isMobile();
|
|
11
|
+
this.__locales = ['pt-BR', 'es-CL'];
|
|
12
|
+
this.__unsubscribeAll = new Subject();
|
|
13
|
+
}
|
|
14
|
+
isMobile() {
|
|
15
|
+
const isMobileWidth = (window.screen.width <= 640) ||
|
|
16
|
+
(window.matchMedia &&
|
|
17
|
+
window.matchMedia('only screen and (max-width: 640px)').matches);
|
|
18
|
+
return (/Android|webOS|iPhone|iPad|iPod|BlackBerry|Mobile/i.test(navigator.userAgent)) || isMobileWidth;
|
|
19
|
+
}
|
|
20
|
+
handlePagination(create = true) {
|
|
21
|
+
const { __paginationOptions } = this;
|
|
22
|
+
if (__paginationOptions) {
|
|
23
|
+
const { mainElement, service } = __paginationOptions;
|
|
24
|
+
const element = document.getElementById(mainElement);
|
|
25
|
+
if (element) {
|
|
26
|
+
element.scroll = null;
|
|
27
|
+
element.onscroll = null;
|
|
28
|
+
element.removeEventListener('scroll', element.eventListeners('scroll'));
|
|
29
|
+
element.removeEventListener('scroll', element.eventListeners('scroll')[0]);
|
|
30
|
+
if (create) {
|
|
31
|
+
element.addEventListener('scroll', () => {
|
|
32
|
+
const { scrollTop, scrollHeight, offsetHeight } = element;
|
|
33
|
+
const contentHeight = scrollHeight - offsetHeight;
|
|
34
|
+
if (contentHeight <= scrollTop) {
|
|
35
|
+
service.doPagination();
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
handleSupport(supportControls) {
|
|
43
|
+
const { service, show } = supportControls;
|
|
44
|
+
const method = show ? 'show' : 'hide';
|
|
45
|
+
service[method.toLowerCase()]();
|
|
46
|
+
}
|
|
47
|
+
handleTranslate(translateOptions) {
|
|
48
|
+
const { service } = translateOptions;
|
|
49
|
+
service.__oni18nDataChanged$
|
|
50
|
+
.pipe(takeUntil(this.__unsubscribeAll))
|
|
51
|
+
.subscribe(() => {
|
|
52
|
+
const data = service.__i18n;
|
|
53
|
+
if (data) {
|
|
54
|
+
this.__i18n = data;
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
handleViewScroll(options) {
|
|
59
|
+
const { elementId, service } = options;
|
|
60
|
+
if (elementId === service?.__savedState?.scrollElementId) {
|
|
61
|
+
this.goScroll(elementId);
|
|
62
|
+
service.__savedState.scrollElementId = null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
getErrorFirstMessageTranslated(formControl = null) {
|
|
66
|
+
if (formControl?.hasError('required'))
|
|
67
|
+
return 'FIELD-REQUIRED';
|
|
68
|
+
if (formControl?.hasError('invalid'))
|
|
69
|
+
return 'FIELD-INVALID';
|
|
70
|
+
if (formControl?.hasError('email'))
|
|
71
|
+
return 'INVALID-EMAIL';
|
|
72
|
+
if (formControl?.hasError('minlength'))
|
|
73
|
+
return 'MIN-LENGTH';
|
|
74
|
+
if (formControl?.hasError('maxlength'))
|
|
75
|
+
return 'MAX-LENGTH';
|
|
76
|
+
if (formControl?.hasError('max'))
|
|
77
|
+
return 'MAX';
|
|
78
|
+
if (formControl?.hasError('min'))
|
|
79
|
+
return 'MIN';
|
|
80
|
+
if (formControl?.hasError('passwordsNotMatching'))
|
|
81
|
+
return 'MATCH-PASSWORD';
|
|
82
|
+
if (formControl?.hasError('invalidDate'))
|
|
83
|
+
return 'INVALID-DATE';
|
|
84
|
+
if (formControl?.hasError('invalidTrue'))
|
|
85
|
+
return 'INVALID-TRUE';
|
|
86
|
+
if (formControl?.hasError('invalidCpfCnpj'))
|
|
87
|
+
return 'INVALID-DOCUMENT';
|
|
88
|
+
if (formControl?.hasError('invalidZipCode'))
|
|
89
|
+
return 'INVALID-ZIPCODE';
|
|
90
|
+
if (formControl?.hasError('invalidCombo'))
|
|
91
|
+
return 'INVALID-COMBO';
|
|
92
|
+
if (formControl?.hasError('invalidUrl'))
|
|
93
|
+
return 'INVALID-URL';
|
|
94
|
+
if (formControl?.hasError('invalidUnlockRegister')) {
|
|
95
|
+
return 'INVALID-UNLOCK-REGISTER';
|
|
96
|
+
}
|
|
97
|
+
if (formControl?.hasError('dateStartMustBeLessThanAnd')) {
|
|
98
|
+
return 'DATE-START-MUST-BE-LESS-THAN-AND';
|
|
99
|
+
}
|
|
100
|
+
if (formControl?.hasError('dateEndMustBeGreaterThanStart')) {
|
|
101
|
+
return 'DATE-END-MUST-BE-GREATER-THAN-SART';
|
|
102
|
+
}
|
|
103
|
+
if (formControl?.hasError('phone'))
|
|
104
|
+
return 'INVALID-PHONE';
|
|
105
|
+
if (formControl?.hasError('invalidValueGreaterThanZero'))
|
|
106
|
+
return 'INVALID-GREATER-THAN-ZERO';
|
|
107
|
+
return 'FIELD-INVALID';
|
|
108
|
+
}
|
|
109
|
+
getErrorLastMessageNotTranslated(formControl = null) {
|
|
110
|
+
if (formControl?.hasError('minlength')) {
|
|
111
|
+
return `${formControl?.getError('minlength').requiredLength} caracteres.`;
|
|
112
|
+
}
|
|
113
|
+
if (formControl?.hasError('maxlength')) {
|
|
114
|
+
return `${formControl?.getError('maxlength').requiredLength} caracteres.`;
|
|
115
|
+
}
|
|
116
|
+
if (formControl?.hasError('max')) {
|
|
117
|
+
return `${formControl?.getError('max').max}`;
|
|
118
|
+
}
|
|
119
|
+
if (formControl?.hasError('min')) {
|
|
120
|
+
return `${formControl?.getError('min').min}`;
|
|
121
|
+
}
|
|
122
|
+
return '';
|
|
123
|
+
}
|
|
124
|
+
validateFormWithTranslate(f, index) {
|
|
125
|
+
const formErrors = f.value;
|
|
126
|
+
if (f.status === 'VALID')
|
|
127
|
+
return true;
|
|
128
|
+
if (!formErrors)
|
|
129
|
+
return true;
|
|
130
|
+
Object.entries(formErrors).forEach(([key, value]) => {
|
|
131
|
+
const control = f.get(key);
|
|
132
|
+
formErrors[key] = '';
|
|
133
|
+
if (control && !control.valid) {
|
|
134
|
+
const msg = {
|
|
135
|
+
first: `ERRORS.${this.getErrorFirstMessageTranslated(f.get(key))}`,
|
|
136
|
+
last: this.getErrorLastMessageNotTranslated(f.get(key))
|
|
137
|
+
};
|
|
138
|
+
formErrors[key] = msg;
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
if (MonkeyUtils.persistNullEmptyUndefined(index)) {
|
|
142
|
+
this.__monkeyecxFormErrors[index || 0] = formErrors;
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
this.__monkeyecxFormErrors = formErrors;
|
|
146
|
+
}
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
copyToClipboard(val) {
|
|
150
|
+
const selBox = document.createElement('textarea');
|
|
151
|
+
selBox.style.position = 'fixed';
|
|
152
|
+
selBox.style.left = '0';
|
|
153
|
+
selBox.style.top = '0';
|
|
154
|
+
selBox.style.opacity = '0';
|
|
155
|
+
selBox.value = val;
|
|
156
|
+
document.body.appendChild(selBox);
|
|
157
|
+
selBox.focus();
|
|
158
|
+
selBox.select();
|
|
159
|
+
document.execCommand('copy');
|
|
160
|
+
document.body.removeChild(selBox);
|
|
161
|
+
}
|
|
162
|
+
validateForm(f, index, alias) {
|
|
163
|
+
const formErrors = f.value;
|
|
164
|
+
if (f.status === 'VALID')
|
|
165
|
+
return true;
|
|
166
|
+
if (!formErrors)
|
|
167
|
+
return true;
|
|
168
|
+
Object.entries(formErrors).forEach(([key, value]) => {
|
|
169
|
+
const control = f.get(key);
|
|
170
|
+
formErrors[key] = '';
|
|
171
|
+
if (control && !control.valid) {
|
|
172
|
+
const msg = {
|
|
173
|
+
firstMessage: `ERRORS.${this.getErrorFirstMessageTranslated(f.get(key))}`,
|
|
174
|
+
lastMessage: this.getErrorLastMessageNotTranslated(f.get(key))
|
|
175
|
+
};
|
|
176
|
+
formErrors[key] = msg;
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
if (MonkeyUtils.persistNullEmptyUndefined(index)) {
|
|
180
|
+
this.__monkeyecxFormErrors[index || 0] = formErrors;
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
let obj;
|
|
184
|
+
if (alias) {
|
|
185
|
+
obj = {
|
|
186
|
+
[alias]: {
|
|
187
|
+
...formErrors
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
obj = formErrors;
|
|
193
|
+
}
|
|
194
|
+
this.__monkeyecxFormErrors = {
|
|
195
|
+
...this.__monkeyecxFormErrors,
|
|
196
|
+
...obj
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
f.markAllAsTouched();
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
clearAllServiceData(clearData) {
|
|
203
|
+
const context = this;
|
|
204
|
+
Object.values(context).forEach((ctx) => {
|
|
205
|
+
if (ctx instanceof MonkeyEcxCommonsService) {
|
|
206
|
+
ctx.clear(clearData);
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
ngOnInit(args) {
|
|
211
|
+
if (args?.paginationOptions) {
|
|
212
|
+
this.__paginationOptions = args?.paginationOptions;
|
|
213
|
+
this.handlePagination();
|
|
214
|
+
}
|
|
215
|
+
if (args?.supportControls) {
|
|
216
|
+
this.handleSupport(args?.supportControls);
|
|
217
|
+
}
|
|
218
|
+
if (args?.translateOptions) {
|
|
219
|
+
this.handleTranslate(args?.translateOptions);
|
|
220
|
+
}
|
|
221
|
+
if (args?.scrollOptions) {
|
|
222
|
+
this.handleViewScroll(args.scrollOptions);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
ngOnDestroy(clearData = true) {
|
|
226
|
+
this.__unsubscribeAll.next();
|
|
227
|
+
this.__unsubscribeAll.complete();
|
|
228
|
+
this.clearAllServiceData(clearData);
|
|
229
|
+
this.handlePagination(false);
|
|
230
|
+
}
|
|
231
|
+
handleErrorFromServices(error, f) {
|
|
232
|
+
this.__monkeyecxFormErrors = null;
|
|
233
|
+
if (error.type === 'Parameter_Error') {
|
|
234
|
+
Object.entries(f.value).forEach(([key, value]) => {
|
|
235
|
+
error.notifications.forEach((_) => {
|
|
236
|
+
const field = _.split(':')[0];
|
|
237
|
+
const description = _.split(':')[1];
|
|
238
|
+
if (field === key) {
|
|
239
|
+
const msg = {
|
|
240
|
+
firstMessage: '',
|
|
241
|
+
lastMessage: description
|
|
242
|
+
};
|
|
243
|
+
this.__monkeyecxFormErrors = {
|
|
244
|
+
...this.__monkeyecxFormErrors,
|
|
245
|
+
[key]: msg
|
|
246
|
+
};
|
|
247
|
+
f.controls[key].setErrors({
|
|
248
|
+
incorrect: true
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
f.markAllAsTouched();
|
|
255
|
+
}
|
|
256
|
+
goBack() {
|
|
257
|
+
window.history.back();
|
|
258
|
+
}
|
|
259
|
+
goScroll(id) {
|
|
260
|
+
const element = document.getElementById(id);
|
|
261
|
+
if (element)
|
|
262
|
+
element.scrollIntoView();
|
|
263
|
+
}
|
|
264
|
+
getEmbeddedData(data, field) {
|
|
265
|
+
const { _embedded } = data;
|
|
266
|
+
return _embedded ? _embedded[field] : null;
|
|
267
|
+
}
|
|
268
|
+
openWindow(url) {
|
|
269
|
+
window.open(`${url}`, '_blank');
|
|
270
|
+
}
|
|
271
|
+
fillI18n(data) {
|
|
272
|
+
this.__i18n = data;
|
|
273
|
+
}
|
|
274
|
+
getCountryPrefix(country) {
|
|
275
|
+
return {
|
|
276
|
+
br: 55,
|
|
277
|
+
cl: 56
|
|
278
|
+
}[country];
|
|
279
|
+
}
|
|
280
|
+
getCountryCurrencyChartFormat(country) {
|
|
281
|
+
return {
|
|
282
|
+
br: 'R$ #,###,##0.00',
|
|
283
|
+
cl: 'CLP #,###,##0'
|
|
284
|
+
}[country];
|
|
285
|
+
}
|
|
286
|
+
getCountryValidators(country) {
|
|
287
|
+
return {
|
|
288
|
+
br: {
|
|
289
|
+
governmentId: ValidateUtils.DocumentValidator
|
|
290
|
+
},
|
|
291
|
+
cl: {
|
|
292
|
+
governmentId: ValidateUtils.DocumentRutValidator
|
|
293
|
+
}
|
|
294
|
+
}[country];
|
|
295
|
+
}
|
|
296
|
+
isAbleToHandlePagination() {
|
|
297
|
+
const { __paginationOptions } = this;
|
|
298
|
+
if (__paginationOptions) {
|
|
299
|
+
const { service } = __paginationOptions;
|
|
300
|
+
const links = service.__links;
|
|
301
|
+
if (links && links?.next)
|
|
302
|
+
return true;
|
|
303
|
+
}
|
|
304
|
+
return false;
|
|
305
|
+
}
|
|
306
|
+
onHandlePagination() {
|
|
307
|
+
const { __paginationOptions } = this;
|
|
308
|
+
if (__paginationOptions) {
|
|
309
|
+
const { service } = __paginationOptions;
|
|
310
|
+
service.doPagination();
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
BaseComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
315
|
+
BaseComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.1", type: BaseComponent, selector: "[baseComponent]", ngImport: i0 });
|
|
316
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaseComponent, decorators: [{
|
|
317
|
+
type: Directive,
|
|
318
|
+
args: [{
|
|
319
|
+
selector: '[baseComponent]'
|
|
320
|
+
}]
|
|
321
|
+
}], ctorParameters: function () { return []; } });
|
|
322
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tb25rZXktZnJvbnQtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvYmFzZS9iYXNlLWNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBYSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsdUJBQXVCLEVBTXZCLGFBQWEsRUFDZCxNQUFNLG1CQUFtQixDQUFDOztBQUszQixNQUFNLE9BQWdCLGFBQWE7SUFlakM7UUFWQSx3QkFBbUIsR0FBc0MsSUFBSSxDQUFDO1FBSTlELGVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFN0IsY0FBUyxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBSzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFTyxRQUFRO1FBQ2QsTUFBTSxhQUFhLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUM7WUFDaEQsQ0FBQyxNQUFNLENBQUMsVUFBVTtnQkFDaEIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLE9BQU8sQ0FDaEUsQ0FBQztRQUNKLE9BQU8sQ0FBQyxtREFBbUQsQ0FBQyxJQUFJLENBQzlELFNBQVMsQ0FBQyxTQUFTLENBQ3BCLENBQUMsSUFBSSxhQUFhLENBQUM7SUFDdEIsQ0FBQztJQUVPLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxJQUFJO1FBQ3BD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ZTtTQUNwQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUVNLG9CQUFvQixDQUFDLE9BQWU7UUFDekMsT0FBTztZQUNMLEVBQUUsRUFBRTtnQkFDRixZQUFZLEVBQUUsYUFBYSxDQUFDLGlCQUFpQjthQUM5QztZQUNELEVBQUUsRUFBRTtnQkFDRixZQUFZLEVBQUUsYUFBYSxDQUFDLG9CQUFvQjthQUNqRDtTQUNGLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDYixDQUFDO0lBRU0sd0JBQXdCO1FBQzdCLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxHQUFHLElBQUksQ0FBQztRQUVyQyxJQUFJLG1CQUFtQixFQUFFO1lBQ3ZCLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQztZQUV4QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQzlCLElBQUksS0FBSyxJQUFJLEtBQUssRUFBRSxJQUFJO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1NBQ3ZDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU0sa0JBQWtCO1FBQ3ZCLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxHQUFHLElBQUksQ0FBQztRQUVyQyxJQUFJLG1CQUFtQixFQUFFO1lBQ3ZCLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQztZQUN4QyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDeEI7SUFDSCxDQUFDOzswR0FsVm1CLGFBQWE7OEZBQWIsYUFBYTsyRkFBYixhQUFhO2tCQUhsQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxpQkFBaUI7aUJBQzVCIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBPbkRlc3Ryb3ksIERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTW9ua2V5VXRpbHMgfSBmcm9tICdtb25rZXktc3R5bGUtZ3VpZGUnO1xuaW1wb3J0IHtcbiAgTW9ua2V5RWN4Q29tbW9uc1NlcnZpY2UsXG4gIE1vbmtleUVjeEVycm9yUmVzcG9uc2UsXG4gIE1vbmtleUVjeFBhZ2luYXRpb25PcHRpb25zLFxuICBNb25rZXlFY3hTY3JvbGxPcHRpb25zLFxuICBNb25rZXlFY3hTdXBwb3J0T3B0aW9ucyxcbiAgTW9ua2V5RWN4VHJhbnNsYXRlT3B0aW9ucyxcbiAgVmFsaWRhdGVVdGlsc1xufSBmcm9tICdtb25rZXktZnJvbnQtY29yZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tiYXNlQ29tcG9uZW50XSdcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIF9fbW9ua2V5ZWN4Rm9ybUVycm9yczogYW55IHwgYW55W107XG5cbiAgX191bnN1YnNjcmliZUFsbDogU3ViamVjdDxhbnk+O1xuXG4gIF9fcGFnaW5hdGlvbk9wdGlvbnM6IE1vbmtleUVjeFBhZ2luYXRpb25PcHRpb25zIHwgbnVsbCA9IG51bGw7XG5cbiAgX19pMThuOiBhbnk7XG5cbiAgX19pc01vYmlsZSA9IHRoaXMuaXNNb2JpbGUoKTtcblxuICBfX2xvY2FsZXMgPSBbJ3B0LUJSJywgJ2VzLUNMJ107XG5cbiAgcHJpdmF0ZSBwYWdpbmF0aW9uRnVuYzogYW55O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9fdW5zdWJzY3JpYmVBbGwgPSBuZXcgU3ViamVjdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc01vYmlsZSgpIHtcbiAgICBjb25zdCBpc01vYmlsZVdpZHRoID0gKHdpbmRvdy5zY3JlZW4ud2lkdGggPD0gNjQwKSB8fFxuICAgICAgKHdpbmRvdy5tYXRjaE1lZGlhICYmXG4gICAgICAgIHdpbmRvdy5tYXRjaE1lZGlhKCdvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpJykubWF0Y2hlc1xuICAgICAgKTtcbiAgICByZXR1cm4gKC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxNb2JpbGUvaS50ZXN0KFxuICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudFxuICAgICkpIHx8IGlzTW9iaWxlV2lkdGg7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVBhZ2luYXRpb24oY3JlYXRlID0gdHJ1ZSkge1xuICAgIGNvbnN0IHsgX19wYWdpbmF0aW9uT3B0aW9ucyB9ID0gdGhpcztcblxuICAgIGlmIChfX3BhZ2luYXRpb25PcHRpb25zKSB7XG4gICAgICBjb25zdCB7IG1haW5FbGVtZW50LCBzZXJ2aWNlIH0gPSBfX3BhZ2luYXRpb25PcHRpb25zO1xuXG4gICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobWFpbkVsZW1lbnQpO1xuXG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LnNjcm9sbCA9IG51bGw7XG4gICAgICAgIGVsZW1lbnQub25zY3JvbGwgPSBudWxsO1xuXG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKGVsZW1lbnQgYXMgYW55KS5ldmVudExpc3RlbmVycygnc2Nyb2xsJykpO1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIChlbGVtZW50IGFzIGFueSkuZXZlbnRMaXN0ZW5lcnMoJ3Njcm9sbCcpWzBdKTtcbiAgICAgICAgaWYgKGNyZWF0ZSkge1xuICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbEhlaWdodCwgb2Zmc2V0SGVpZ2h0IH0gPSBlbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgY29udGVudEhlaWdodCA9IHNjcm9sbEhlaWdodCAtIG9mZnNldEhlaWdodDtcblxuICAgICAgICAgICAgaWYgKGNvbnRlbnRIZWlnaHQgPD0gc2Nyb2xsVG9wKSB7XG4gICAgICAgICAgICAgIHNlcnZpY2UuZG9QYWdpbmF0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN1cHBvcnQoc3VwcG9ydENvbnRyb2xzOiBNb25rZXlFY3hTdXBwb3J0T3B0aW9ucykge1xuICAgIGNvbnN0IHsgc2VydmljZSwgc2hvdyB9ID0gc3VwcG9ydENvbnRyb2xzO1xuICAgIGNvbnN0IG1ldGhvZCA9IHNob3cgPyAnc2hvdycgOiAnaGlkZSc7XG4gICAgc2VydmljZVttZXRob2QudG9Mb3dlckNhc2UoKV0oKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVHJhbnNsYXRlKHRyYW5zbGF0ZU9wdGlvbnM6IE1vbmtleUVjeFRyYW5zbGF0ZU9wdGlvbnMpIHtcbiAgICBjb25zdCB7IHNlcnZpY2UgfSA9IHRyYW5zbGF0ZU9wdGlvbnM7XG4gICAgc2VydmljZS5fX29uaTE4bkRhdGFDaGFuZ2VkJFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX191bnN1YnNjcmliZUFsbCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHNlcnZpY2UuX19pMThuO1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMuX19pMThuID0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVZpZXdTY3JvbGwob3B0aW9uczogTW9ua2V5RWN4U2Nyb2xsT3B0aW9ucykge1xuICAgIGNvbnN0IHsgZWxlbWVudElkLCBzZXJ2aWNlIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKGVsZW1lbnRJZCA9PT0gc2VydmljZT8uX19zYXZlZFN0YXRlPy5zY3JvbGxFbGVtZW50SWQpIHtcbiAgICAgIHRoaXMuZ29TY3JvbGwoZWxlbWVudElkKTtcblxuICAgICAgc2VydmljZS5fX3NhdmVkU3RhdGUuc2Nyb2xsRWxlbWVudElkID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEVycm9yRmlyc3RNZXNzYWdlVHJhbnNsYXRlZChmb3JtQ29udHJvbDogQWJzdHJhY3RDb250cm9sIHwgbnVsbCA9IG51bGwpIHtcbiAgICBpZiAoZm9ybUNvbnRyb2w/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpKSByZXR1cm4gJ0ZJRUxELVJFUVVJUkVEJztcbiAgICBpZiAoZm9ybUNvbnRyb2w/Lmhhc0Vycm9yKCdpbnZhbGlkJykpIHJldHVybiAnRklFTEQtSU5WQUxJRCc7XG4gICAgaWYgKGZvcm1Db250cm9sPy5oYXNFcnJvcignZW1haWwnKSkgcmV0dXJuICdJTlZBTElELUVNQUlMJztcbiAgICBpZiAoZm9ybUNvbnRyb2w/Lmhhc0Vycm9yKCdtaW5sZW5ndGgnKSkgcmV0dXJuICdNSU4tTEVOR1RIJztcbiAgICBpZiAoZm9ybUNvbnRyb2w/Lmhhc0Vycm9yKCdtYXhsZW5ndGgnKSkgcmV0dXJuICdNQVgtTEVOR1RIJztcbiAgICBpZiAoZm9ybUNvbnRyb2w/Lmhhc0Vycm9yKCdtYXgnKSkgcmV0dXJuICdNQVgnO1xuICAgIGlmIChmb3JtQ29udHJvbD8uaGFzRXJyb3IoJ21pbicpKSByZXR1cm4gJ01JTic7XG4gICAgaWYgKGZvcm1Db250cm9sPy5oYXNFcnJvcigncGFzc3dvcmRzTm90TWF0Y2hpbmcnKSkgcmV0dXJuICdNQVRDSC1QQVNTV09SRCc7XG4gICAgaWYgKGZvcm1Db250cm9sPy5oYXNFcnJvcignaW52YWxpZERhdGUnKSkgcmV0dXJuICdJTlZBTElELURBVEUnO1xuICAgIGlmIChmb3JtQ29udHJvbD8uaGFzRXJyb3IoJ2ludmFsaWRUcnVlJykpIHJldHVybiAnSU5WQUxJRC1UUlVFJztcbiAgICBpZiAoZm9ybUNvbnRyb2w/Lmhhc0Vycm9yKCdpbnZhbGlkQ3BmQ25waicpKSByZXR1cm4gJ0lOVkFMSUQtRE9DVU1FTlQnO1xuICAgIGlmIChmb3JtQ29udHJvbD8uaGFzRXJyb3IoJ2ludmFsaWRaaXBDb2RlJykpIHJldHVybiAnSU5WQUxJRC1aSVBDT0RFJztcbiAgICBpZiAoZm9ybUNvbnRyb2w/Lmhhc0Vycm9yKCdpbnZhbGlkQ29tYm8nKSkgcmV0dXJuICdJTlZBTElELUNPTUJPJztcbiAgICBpZiAoZm9ybUNvbnRyb2w/Lmhhc0Vycm9yKCdpbnZhbGlkVXJsJykpIHJldHVybiAnSU5WQUxJRC1VUkwnO1xuICAgIGlmIChmb3JtQ29udHJvbD8uaGFzRXJyb3IoJ2ludmFsaWRVbmxvY2tSZWdpc3RlcicpKSB7IHJldHVybiAnSU5WQUxJRC1VTkxPQ0stUkVHSVNURVInOyB9XG4gICAgaWYgKGZvcm1Db250cm9sPy5oYXNFcnJvcignZGF0ZVN0YXJ0TXVzdEJlTGVzc1RoYW5BbmQnKSkge1xuICAgICAgcmV0dXJuICdEQVRFLVNUQVJULU1VU1QtQkUtTEVTUy1USEFOLUFORCc7XG4gICAgfVxuICAgIGlmIChmb3JtQ29udHJvbD8uaGFzRXJyb3IoJ2RhdGVFbmRNdXN0QmVHcmVhdGVyVGhhblN0YXJ0JykpIHtcbiAgICAgIHJldHVybiAnREFURS1FTkQtTVVTVC1CRS1HUkVBVEVSLVRIQU4tU0FSVCc7XG4gICAgfVxuICAgIGlmIChmb3JtQ29udHJvbD8uaGFzRXJyb3IoJ3Bob25lJykpIHJldHVybiAnSU5WQUxJRC1QSE9ORSc7XG4gICAgaWYgKGZvcm1Db250cm9sPy5oYXNFcnJvcignaW52YWxpZFZhbHVlR3JlYXRlclRoYW5aZXJvJykpIHJldHVybiAnSU5WQUxJRC1HUkVBVEVSLVRIQU4tWkVSTyc7XG5cbiAgICByZXR1cm4gJ0ZJRUxELUlOVkFMSUQnO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFcnJvckxhc3RNZXNzYWdlTm90VHJhbnNsYXRlZChmb3JtQ29udHJvbDogQWJzdHJhY3RDb250cm9sIHwgbnVsbCA9IG51bGwpIHtcbiAgICBpZiAoZm9ybUNvbnRyb2w/Lmhhc0Vycm9yKCdtaW5sZW5ndGgnKSkge1xuICAgICAgcmV0dXJuIGAke2Zvcm1Db250cm9sPy5nZXRFcnJvcignbWlubGVuZ3RoJykucmVxdWlyZWRMZW5ndGh9IGNhcmFjdGVyZXMuYDtcbiAgICB9XG4gICAgaWYgKGZvcm1Db250cm9sPy5oYXNFcnJvcignbWF4bGVuZ3RoJykpIHtcbiAgICAgIHJldHVybiBgJHtmb3JtQ29udHJvbD8uZ2V0RXJyb3IoJ21heGxlbmd0aCcpLnJlcXVpcmVkTGVuZ3RofSBjYXJhY3RlcmVzLmA7XG4gICAgfVxuICAgIGlmIChmb3JtQ29udHJvbD8uaGFzRXJyb3IoJ21heCcpKSB7IHJldHVybiBgJHtmb3JtQ29udHJvbD8uZ2V0RXJyb3IoJ21heCcpLm1heH1gOyB9XG4gICAgaWYgKGZvcm1Db250cm9sPy5oYXNFcnJvcignbWluJykpIHsgcmV0dXJuIGAke2Zvcm1Db250cm9sPy5nZXRFcnJvcignbWluJykubWlufWA7IH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZUZvcm1XaXRoVHJhbnNsYXRlKGY6IEZvcm1Hcm91cCwgaW5kZXg/OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBmb3JtRXJyb3JzOiBhbnkgPSBmLnZhbHVlO1xuXG4gICAgaWYgKGYuc3RhdHVzID09PSAnVkFMSUQnKSByZXR1cm4gdHJ1ZTtcblxuICAgIGlmICghZm9ybUVycm9ycykgcmV0dXJuIHRydWU7XG4gICAgT2JqZWN0LmVudHJpZXMoZm9ybUVycm9ycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBjb25zdCBjb250cm9sID0gZi5nZXQoa2V5KTtcbiAgICAgIGZvcm1FcnJvcnNba2V5XSA9ICcnO1xuICAgICAgaWYgKGNvbnRyb2wgJiYgIWNvbnRyb2wudmFsaWQpIHtcbiAgICAgICAgY29uc3QgbXNnID0ge1xuICAgICAgICAgIGZpcnN0OiBgRVJST1JTLiR7dGhpcy5nZXRFcnJvckZpcnN0TWVzc2FnZVRyYW5zbGF0ZWQoZi5nZXQoa2V5KSl9YCxcbiAgICAgICAgICBsYXN0OiB0aGlzLmdldEVycm9yTGFzdE1lc3NhZ2VOb3RUcmFuc2xhdGVkKGYuZ2V0KGtleSkpXG4gICAgICAgIH07XG4gICAgICAgIGZvcm1FcnJvcnNba2V5XSA9IG1zZztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChNb25rZXlVdGlscy5wZXJzaXN0TnVsbEVtcHR5VW5kZWZpbmVkKGluZGV4KSkgeyB0aGlzLl9fbW9ua2V5ZWN4Rm9ybUVycm9yc1tpbmRleCB8fCAwXSA9IGZvcm1FcnJvcnM7IH0gZWxzZSB7XG4gICAgICB0aGlzLl9fbW9ua2V5ZWN4Rm9ybUVycm9ycyA9IGZvcm1FcnJvcnM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGNvcHlUb0NsaXBib2FyZCh2YWw6IHN0cmluZykge1xuICAgIGNvbnN0IHNlbEJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG4gICAgc2VsQm94LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICBzZWxCb3guc3R5bGUubGVmdCA9ICcwJztcbiAgICBzZWxCb3guc3R5bGUudG9wID0gJzAnO1xuICAgIHNlbEJveC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgIHNlbEJveC52YWx1ZSA9IHZhbDtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNlbEJveCk7XG4gICAgc2VsQm94LmZvY3VzKCk7XG4gICAgc2VsQm94LnNlbGVjdCgpO1xuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzZWxCb3gpO1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlRm9ybShmOiBGb3JtR3JvdXAsIGluZGV4PzogbnVtYmVyLCBhbGlhcz86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZvcm1FcnJvcnM6IGFueSA9IGYudmFsdWU7XG4gICAgaWYgKGYuc3RhdHVzID09PSAnVkFMSUQnKSByZXR1cm4gdHJ1ZTtcblxuICAgIGlmICghZm9ybUVycm9ycykgcmV0dXJuIHRydWU7XG4gICAgT2JqZWN0LmVudHJpZXMoZm9ybUVycm9ycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBjb25zdCBjb250cm9sID0gZi5nZXQoa2V5KTtcbiAgICAgIGZvcm1FcnJvcnNba2V5XSA9ICcnO1xuICAgICAgaWYgKGNvbnRyb2wgJiYgIWNvbnRyb2wudmFsaWQpIHtcbiAgICAgICAgY29uc3QgbXNnID0ge1xuICAgICAgICAgIGZpcnN0TWVzc2FnZTogYEVSUk9SUy4ke3RoaXMuZ2V0RXJyb3JGaXJzdE1lc3NhZ2VUcmFuc2xhdGVkKFxuICAgICAgICAgICAgZi5nZXQoa2V5KVxuICAgICAgICAgICl9YCxcbiAgICAgICAgICBsYXN0TWVzc2FnZTogdGhpcy5nZXRFcnJvckxhc3RNZXNzYWdlTm90VHJhbnNsYXRlZChmLmdldChrZXkpKVxuICAgICAgICB9O1xuICAgICAgICBmb3JtRXJyb3JzW2tleV0gPSBtc2c7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoTW9ua2V5VXRpbHMucGVyc2lzdE51bGxFbXB0eVVuZGVmaW5lZChpbmRleCkpIHtcbiAgICAgIHRoaXMuX19tb25rZXllY3hGb3JtRXJyb3JzW2luZGV4IHx8IDBdID0gZm9ybUVycm9ycztcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG9iajogYW55O1xuXG4gICAgICBpZiAoYWxpYXMpIHtcbiAgICAgICAgb2JqID0ge1xuICAgICAgICAgIFthbGlhc106IHtcbiAgICAgICAgICAgIC4uLmZvcm1FcnJvcnNcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmogPSBmb3JtRXJyb3JzO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9fbW9ua2V5ZWN4Rm9ybUVycm9ycyA9IHtcbiAgICAgICAgLi4udGhpcy5fX21vbmtleWVjeEZvcm1FcnJvcnMsXG4gICAgICAgIC4uLm9ialxuICAgICAgfTtcbiAgICB9XG4gICAgZi5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGNsZWFyQWxsU2VydmljZURhdGEoY2xlYXJEYXRhOiBib29sZWFuKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXM7XG4gICAgT2JqZWN0LnZhbHVlcyhjb250ZXh0KS5mb3JFYWNoKChjdHg6IGFueSkgPT4ge1xuICAgICAgaWYgKGN0eCBpbnN0YW5jZW9mIE1vbmtleUVjeENvbW1vbnNTZXJ2aWNlKSB7XG4gICAgICAgIGN0eC5jbGVhcihjbGVhckRhdGEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KGFyZ3M6IHtcbiAgICBwYWdpbmF0aW9uT3B0aW9ucz86IE1vbmtleUVjeFBhZ2luYXRpb25PcHRpb25zO1xuICAgIHN1cHBvcnRDb250cm9scz86IE1vbmtleUVjeFN1cHBvcnRPcHRpb25zO1xuICAgIHNjcm9sbE9wdGlvbnM/OiBNb25rZXlFY3hTY3JvbGxPcHRpb25zO1xuICAgIHRyYW5zbGF0ZU9wdGlvbnM/OiBNb25rZXlFY3hUcmFuc2xhdGVPcHRpb25zO1xuICB9KSB7XG4gICAgaWYgKGFyZ3M/LnBhZ2luYXRpb25PcHRpb25zKSB7XG4gICAgICB0aGlzLl9fcGFnaW5hdGlvbk9wdGlvbnMgPSBhcmdzPy5wYWdpbmF0aW9uT3B0aW9ucztcbiAgICAgIHRoaXMuaGFuZGxlUGFnaW5hdGlvbigpO1xuICAgIH1cbiAgICBpZiAoYXJncz8uc3VwcG9ydENvbnRyb2xzKSB7XG4gICAgICB0aGlzLmhhbmRsZVN1cHBvcnQoYXJncz8uc3VwcG9ydENvbnRyb2xzKTtcbiAgICB9XG4gICAgaWYgKGFyZ3M/LnRyYW5zbGF0ZU9wdGlvbnMpIHtcbiAgICAgIHRoaXMuaGFuZGxlVHJhbnNsYXRlKGFyZ3M/LnRyYW5zbGF0ZU9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoYXJncz8uc2Nyb2xsT3B0aW9ucykge1xuICAgICAgdGhpcy5oYW5kbGVWaWV3U2Nyb2xsKGFyZ3Muc2Nyb2xsT3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KGNsZWFyRGF0YTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICB0aGlzLl9fdW5zdWJzY3JpYmVBbGwubmV4dCgpO1xuICAgIHRoaXMuX191bnN1YnNjcmliZUFsbC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuY2xlYXJBbGxTZXJ2aWNlRGF0YShjbGVhckRhdGEpO1xuICAgIHRoaXMuaGFuZGxlUGFnaW5hdGlvbihmYWxzZSk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRXJyb3JGcm9tU2VydmljZXMoZXJyb3I6IE1vbmtleUVjeEVycm9yUmVzcG9uc2UsIGY6IEZvcm1Hcm91cCkge1xuICAgIHRoaXMuX19tb25rZXllY3hGb3JtRXJyb3JzID0gbnVsbDtcbiAgICBpZiAoZXJyb3IudHlwZSA9PT0gJ1BhcmFtZXRlcl9FcnJvcicpIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGYudmFsdWUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBlcnJvci5ub3RpZmljYXRpb25zLmZvckVhY2goKF86IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gXy5zcGxpdCgnOicpWzBdO1xuICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gXy5zcGxpdCgnOicpWzFdO1xuICAgICAgICAgIGlmIChmaWVsZCA9PT0ga2V5KSB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSB7XG4gICAgICAgICAgICAgIGZpcnN0TWVzc2FnZTogJycsXG4gICAgICAgICAgICAgIGxhc3RNZXNzYWdlOiBkZXNjcmlwdGlvblxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX19tb25rZXllY3hGb3JtRXJyb3JzID0ge1xuICAgICAgICAgICAgICAuLi50aGlzLl9fbW9ua2V5ZWN4Rm9ybUVycm9ycyxcbiAgICAgICAgICAgICAgW2tleV06IG1zZ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGYuY29udHJvbHNba2V5XS5zZXRFcnJvcnMoe1xuICAgICAgICAgICAgICBpbmNvcnJlY3Q6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgfVxuXG4gIHB1YmxpYyBnb0JhY2soKSB7XG4gICAgd2luZG93Lmhpc3RvcnkuYmFjaygpO1xuICB9XG5cbiAgcHVibGljIGdvU2Nyb2xsKGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmIChlbGVtZW50KSBlbGVtZW50LnNjcm9sbEludG9WaWV3KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RW1iZWRkZWREYXRhKGRhdGE6IGFueSwgZmllbGQ6IHN0cmluZyk6IGFueVtdIHwgYW55IHtcbiAgICBjb25zdCB7IF9lbWJlZGRlZCB9ID0gZGF0YTtcbiAgICByZXR1cm4gX2VtYmVkZGVkID8gX2VtYmVkZGVkW2ZpZWxkXSA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgb3BlbldpbmRvdyh1cmw6IHN0cmluZykge1xuICAgIHdpbmRvdy5vcGVuKGAke3VybH1gLCAnX2JsYW5rJyk7XG4gIH1cblxuICBwdWJsaWMgZmlsbEkxOG4oZGF0YTogYW55KSB7XG4gICAgdGhpcy5fX2kxOG4gPSBkYXRhO1xuICB9XG5cbiAgcHVibGljIGdldENvdW50cnlQcmVmaXgoY291bnRyeTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJyOiA1NSxcbiAgICAgIGNsOiA1NlxuICAgIH1bY291bnRyeV07XG4gIH1cblxuICBwdWJsaWMgZ2V0Q291bnRyeUN1cnJlbmN5Q2hhcnRGb3JtYXQoY291bnRyeTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJyOiAnUiQgIywjIyMsIyMwLjAwJyxcbiAgICAgIGNsOiAnQ0xQICMsIyMjLCMjMCdcbiAgICB9W2NvdW50cnldO1xuICB9XG5cbiAgcHVibGljIGdldENvdW50cnlWYWxpZGF0b3JzKGNvdW50cnk6IHN0cmluZykge1xuICAgIHJldHVybiB7XG4gICAgICBicjoge1xuICAgICAgICBnb3Zlcm5tZW50SWQ6IFZhbGlkYXRlVXRpbHMuRG9jdW1lbnRWYWxpZGF0b3JcbiAgICAgIH0sXG4gICAgICBjbDoge1xuICAgICAgICBnb3Zlcm5tZW50SWQ6IFZhbGlkYXRlVXRpbHMuRG9jdW1lbnRSdXRWYWxpZGF0b3JcbiAgICAgIH1cbiAgICB9W2NvdW50cnldO1xuICB9XG5cbiAgcHVibGljIGlzQWJsZVRvSGFuZGxlUGFnaW5hdGlvbigpIHtcbiAgICBjb25zdCB7IF9fcGFnaW5hdGlvbk9wdGlvbnMgfSA9IHRoaXM7XG5cbiAgICBpZiAoX19wYWdpbmF0aW9uT3B0aW9ucykge1xuICAgICAgY29uc3QgeyBzZXJ2aWNlIH0gPSBfX3BhZ2luYXRpb25PcHRpb25zO1xuXG4gICAgICBjb25zdCBsaW5rcyA9IHNlcnZpY2UuX19saW5rcztcbiAgICAgIGlmIChsaW5rcyAmJiBsaW5rcz8ubmV4dCkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBvbkhhbmRsZVBhZ2luYXRpb24oKSB7XG4gICAgY29uc3QgeyBfX3BhZ2luYXRpb25PcHRpb25zIH0gPSB0aGlzO1xuXG4gICAgaWYgKF9fcGFnaW5hdGlvbk9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHsgc2VydmljZSB9ID0gX19wYWdpbmF0aW9uT3B0aW9ucztcbiAgICAgIHNlcnZpY2UuZG9QYWdpbmF0aW9uKCk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { Directive, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { Validators } from '@angular/forms';
|
|
3
|
+
import { MonkeyUtils } from 'monkey-style-guide';
|
|
4
|
+
import { Subject } from 'rxjs';
|
|
5
|
+
import { takeUntil } from 'rxjs/operators';
|
|
6
|
+
import { BaseComponent } from './base-component';
|
|
7
|
+
import { validators } from './base-validators';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/forms";
|
|
10
|
+
export class BaseDynamicArray extends BaseComponent {
|
|
11
|
+
constructor(fb) {
|
|
12
|
+
super();
|
|
13
|
+
this.fb = fb;
|
|
14
|
+
this.onHandleSubmit = new EventEmitter();
|
|
15
|
+
this.onHandleUpdateForm = new EventEmitter();
|
|
16
|
+
this.onHandleSubmitFormReady = new EventEmitter();
|
|
17
|
+
this.fields = [];
|
|
18
|
+
this.qtd = 1;
|
|
19
|
+
this.disabled = false;
|
|
20
|
+
this._form = null;
|
|
21
|
+
// eslint-disable-next-line object-curly-newline
|
|
22
|
+
this._plusValidations = [];
|
|
23
|
+
this.changesUnsubscribe = new Subject();
|
|
24
|
+
this.formBase = () => {
|
|
25
|
+
// return this.fb.group(this.createControl());
|
|
26
|
+
return this.createControl();
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
handleInternalPlusValidation(mainField, data) {
|
|
30
|
+
const { operator, field, value } = mainField;
|
|
31
|
+
const validators = {
|
|
32
|
+
e: (val1, val2) => { return val1 === val2; },
|
|
33
|
+
lt: (val1, val2) => { return val1 < val2; },
|
|
34
|
+
gt: (val1, val2) => { return val1 > val2; }
|
|
35
|
+
};
|
|
36
|
+
return validators[operator](data?.[field] || data, value);
|
|
37
|
+
}
|
|
38
|
+
makeInternalPlusValidation(data, sourceField, settings, rowIndex) {
|
|
39
|
+
const changeFields = (show) => {
|
|
40
|
+
const saved = [...this.fields];
|
|
41
|
+
saved.map((val) => {
|
|
42
|
+
const valSaved = {
|
|
43
|
+
...val
|
|
44
|
+
};
|
|
45
|
+
if (val.name === sourceField) {
|
|
46
|
+
this._plusValidations[rowIndex] = {
|
|
47
|
+
[sourceField]: {
|
|
48
|
+
...valSaved,
|
|
49
|
+
alwaysShow: show
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
this.createOneControl(val.name, this.formValues?.controls[rowIndex], show);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
this._plusValidations[rowIndex] = {
|
|
56
|
+
...valSaved
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
const validated = this.handleInternalPlusValidation(settings, data);
|
|
63
|
+
changeFields(validated);
|
|
64
|
+
}
|
|
65
|
+
createOneControl(fieldName, ctrl, create = true) {
|
|
66
|
+
const { fields } = this;
|
|
67
|
+
if (!fields)
|
|
68
|
+
return;
|
|
69
|
+
fields.forEach((field) => {
|
|
70
|
+
const { fieldType, validations, name, disabled } = field;
|
|
71
|
+
if (name !== fieldName)
|
|
72
|
+
return;
|
|
73
|
+
let { value } = field;
|
|
74
|
+
if (fieldType === 'button')
|
|
75
|
+
return;
|
|
76
|
+
if (fieldType === 'radiobutton' || fieldType === 'checkbox' || fieldType === 'select') {
|
|
77
|
+
value = '';
|
|
78
|
+
}
|
|
79
|
+
if (create) {
|
|
80
|
+
const control = this.fb.control(value, this.bindValidations(validations || []));
|
|
81
|
+
if (disabled || this.disabled)
|
|
82
|
+
control.disable();
|
|
83
|
+
ctrl.addControl(name, control);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
ctrl.removeControl(name);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
createControl(data) {
|
|
91
|
+
const { fields } = this;
|
|
92
|
+
if (!fields)
|
|
93
|
+
return null;
|
|
94
|
+
// eslint-disable-next-line object-curly-newline
|
|
95
|
+
const group = this.fb.group({});
|
|
96
|
+
fields.forEach((field) => {
|
|
97
|
+
const { fieldType, validations, name, disabled, alwaysShow } = field;
|
|
98
|
+
let { value } = field;
|
|
99
|
+
if (field.alwaysShowPlusValidation) {
|
|
100
|
+
if (!this.handleInternalPlusValidation(field.alwaysShowPlusValidation, data))
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
else if (!alwaysShow)
|
|
104
|
+
return;
|
|
105
|
+
if (fieldType === 'button')
|
|
106
|
+
return;
|
|
107
|
+
if (fieldType === 'radiobutton' || fieldType === 'checkbox' || fieldType === 'select') {
|
|
108
|
+
value = '';
|
|
109
|
+
}
|
|
110
|
+
const control = this.fb.control(value, this.bindValidations(validations || []));
|
|
111
|
+
if (disabled || this.disabled)
|
|
112
|
+
control.disable();
|
|
113
|
+
group.addControl(name, control);
|
|
114
|
+
});
|
|
115
|
+
return group;
|
|
116
|
+
}
|
|
117
|
+
bindValidations(validations) {
|
|
118
|
+
if (validations.length > 0) {
|
|
119
|
+
const validList = [];
|
|
120
|
+
validations.forEach((valid) => {
|
|
121
|
+
const validated = valid.param
|
|
122
|
+
? validators[valid.name](valid.param)
|
|
123
|
+
: validators[valid.name];
|
|
124
|
+
validList.push(validated);
|
|
125
|
+
});
|
|
126
|
+
return Validators.compose(validList);
|
|
127
|
+
}
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
buildForm() {
|
|
131
|
+
const form = this.fb.group({
|
|
132
|
+
fields: this.fb.array([])
|
|
133
|
+
});
|
|
134
|
+
form?.controls.fields?.valueChanges.subscribe((_) => {
|
|
135
|
+
this.watchForChanges();
|
|
136
|
+
});
|
|
137
|
+
return form;
|
|
138
|
+
}
|
|
139
|
+
watchForChanges() {
|
|
140
|
+
const { fields, changesUnsubscribe } = this;
|
|
141
|
+
changesUnsubscribe.next();
|
|
142
|
+
this.formValues?.controls?.map((control, index) => {
|
|
143
|
+
fields.forEach((fieldConfig) => {
|
|
144
|
+
const { name, alwaysShowPlusValidation } = fieldConfig;
|
|
145
|
+
if (!alwaysShowPlusValidation)
|
|
146
|
+
return;
|
|
147
|
+
const { field } = alwaysShowPlusValidation;
|
|
148
|
+
if (field) {
|
|
149
|
+
control.controls[field]?.valueChanges.pipe(takeUntil(changesUnsubscribe)).subscribe((_) => {
|
|
150
|
+
this.makeInternalPlusValidation(_, name, alwaysShowPlusValidation, index);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
return null;
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
get formValues() {
|
|
158
|
+
return this._form ? this._form.get('fields') : null;
|
|
159
|
+
}
|
|
160
|
+
fillValues() {
|
|
161
|
+
const { data, qtd } = this;
|
|
162
|
+
if ((!this._form) && qtd)
|
|
163
|
+
return;
|
|
164
|
+
if (qtd > 0) {
|
|
165
|
+
Array(qtd)
|
|
166
|
+
.fill(null)
|
|
167
|
+
.map((_, index) => {
|
|
168
|
+
let form = this.createControl();
|
|
169
|
+
if (data && data[index]) {
|
|
170
|
+
form = this.createControl(data[index]);
|
|
171
|
+
const handledData = data[index];
|
|
172
|
+
Object.entries(handledData).forEach(([key, value]) => {
|
|
173
|
+
if (MonkeyUtils.persistNullEmptyUndefined(value) && form?.controls[key]) {
|
|
174
|
+
form?.controls[key].setValue(value);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
this.formValues?.push(form);
|
|
179
|
+
return null;
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
ngOnInit() {
|
|
184
|
+
this._form = this.buildForm();
|
|
185
|
+
this.fillValues();
|
|
186
|
+
this.onHandleUpdateForm.subscribe(() => {
|
|
187
|
+
this.fillValues();
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
ngOnChanges() {
|
|
191
|
+
if (!this._form) {
|
|
192
|
+
this._form = this.buildForm();
|
|
193
|
+
}
|
|
194
|
+
this.fillValues();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
BaseDynamicArray.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaseDynamicArray, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Directive });
|
|
198
|
+
BaseDynamicArray.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.1", type: BaseDynamicArray, selector: "[baseDynamicArray]", inputs: { onHandleSubmit: "onHandleSubmit", onHandleUpdateForm: "onHandleUpdateForm", self: "self", fields: "fields", data: "data", qtd: "qtd", disabled: "disabled" }, outputs: { onHandleSubmitFormReady: "onHandleSubmitFormReady" }, usesInheritance: true, usesOnChanges: true, ngImport: i0 });
|
|
199
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaseDynamicArray, decorators: [{
|
|
200
|
+
type: Directive,
|
|
201
|
+
args: [{
|
|
202
|
+
selector: '[baseDynamicArray]'
|
|
203
|
+
}]
|
|
204
|
+
}], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { onHandleSubmit: [{
|
|
205
|
+
type: Input
|
|
206
|
+
}], onHandleUpdateForm: [{
|
|
207
|
+
type: Input
|
|
208
|
+
}], onHandleSubmitFormReady: [{
|
|
209
|
+
type: Output
|
|
210
|
+
}], self: [{
|
|
211
|
+
type: Input
|
|
212
|
+
}], fields: [{
|
|
213
|
+
type: Input
|
|
214
|
+
}], data: [{
|
|
215
|
+
type: Input
|
|
216
|
+
}], qtd: [{
|
|
217
|
+
type: Input
|
|
218
|
+
}], disabled: [{
|
|
219
|
+
type: Input
|
|
220
|
+
}] } });
|
|
221
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1keW5hbWljLWFycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW9ua2V5LWZyb250LWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UvYmFzZS1keW5hbWljLWFycmF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBcUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7OztBQUsvQyxNQUFNLE9BQWdCLGdCQUFpQixTQUFRLGFBQWE7SUF3QjFELFlBQW9CLEVBQWU7UUFDakMsS0FBSyxFQUFFLENBQUM7UUFEVSxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBdkIxQixtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFekMsdUJBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUU1Qyw0QkFBdUIsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUl0RSxXQUFNLEdBQXNCLEVBQUUsQ0FBQztRQUkvQixRQUFHLEdBQVcsQ0FBQyxDQUFDO1FBRWhCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFbkMsVUFBSyxHQUFxQixJQUFJLENBQUM7UUFFL0IsZ0RBQWdEO1FBQ2hELHFCQUFnQixHQUFVLEVBQUUsQ0FBQztRQUVyQix1QkFBa0IsR0FB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QUFVLEVBQUUsSUFBSSxDQUFDLElBQVcsQ0FBQyxDQUFDO2dCQUVuQyxPQUFPLElBQUksQ0FBQztZQUNkLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDSCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQixJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNyQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDL0I7UUFDRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQzs7NkdBM05tQixnQkFBZ0I7aUdBQWhCLGdCQUFnQjsyRkFBaEIsZ0JBQWdCO2tCQUhyQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxvQkFBb0I7aUJBQy9CO2tHQUVVLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUVJLHVCQUF1QjtzQkFBaEMsTUFBTTtnQkFFRSxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxHQUFHO3NCQUFYLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPbkNoYW5nZXMsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTW9ua2V5VXRpbHMgfSBmcm9tICdtb25rZXktc3R5bGUtZ3VpZGUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTUVDWEZpZWxkQ29uZmlnLCBNRUNYRmllbGRDb25maWdWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEJhc2VDb21wb25lbnQgfSBmcm9tICcuL2Jhc2UtY29tcG9uZW50JztcbmltcG9ydCB7IHZhbGlkYXRvcnMgfSBmcm9tICcuL2Jhc2UtdmFsaWRhdG9ycyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tiYXNlRHluYW1pY0FycmF5XSdcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUR5bmFtaWNBcnJheSBleHRlbmRzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIG9uSGFuZGxlU3VibWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQElucHV0KCkgb25IYW5kbGVVcGRhdGVGb3JtID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpIG9uSGFuZGxlU3VibWl0Rm9ybVJlYWR5OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBJbnB1dCgpIHNlbGY6IGFueTtcblxuICBASW5wdXQoKSBmaWVsZHM6IE1FQ1hGaWVsZENvbmZpZ1tdID0gW107XG5cbiAgQElucHV0KCkgZGF0YTogYW55O1xuXG4gIEBJbnB1dCgpIHF0ZDogbnVtYmVyID0gMTtcblxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIF9mb3JtOiBGb3JtR3JvdXAgfCBudWxsID0gbnVsbDtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JqZWN0LWN1cmx5LW5ld2xpbmVcbiAgX3BsdXNWYWxpZGF0aW9uczogYW55W10gPSBbXTtcblxuICBwcml2YXRlIGNoYW5nZXNVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVJbnRlcm5hbFBsdXNWYWxpZGF0aW9uKFxuICAgIG1haW5GaWVsZDogYW55LFxuICAgIGRhdGE6IGFueVxuICApIHtcbiAgICBjb25zdCB7IG9wZXJhdG9yLCBmaWVsZCwgdmFsdWUgfSA9IG1haW5GaWVsZDtcbiAgICBjb25zdCB2YWxpZGF0b3JzOiBhbnkgPSB7XG4gICAgICBlOiAodmFsMTogYW55LCB2YWwyOiBzdHJpbmcpID0+IHsgcmV0dXJuIHZhbDEgPT09IHZhbDI7IH0sXG4gICAgICBsdDogKHZhbDE6IGFueSwgdmFsMjogc3RyaW5nKSA9PiB7IHJldHVybiB2YWwxIDwgdmFsMjsgfSxcbiAgICAgIGd0OiAodmFsMTogYW55LCB2YWwyOiBzdHJpbmcpID0+IHsgcmV0dXJuIHZhbDEgPiB2YWwyOyB9XG4gICAgfTtcblxuICAgIHJldHVybiB2YWxpZGF0b3JzW29wZXJhdG9yXShkYXRhPy5bZmllbGRdIHx8IGRhdGEsIHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFrZUludGVybmFsUGx1c1ZhbGlkYXRpb24oXG4gICAgZGF0YTogYW55LFxuICAgIHNvdXJjZUZpZWxkOiBzdHJpbmcsXG4gICAgc2V0dGluZ3M6IGFueSxcbiAgICByb3dJbmRleDogbnVtYmVyXG4gICkge1xuICAgIGNvbnN0IGNoYW5nZUZpZWxkcyA9IChzaG93OiBib29sZWFuKSA9PiB7XG4gICAgICBjb25zdCBzYXZlZCA9IFsuLi50aGlzLmZpZWxkc107XG5cbiAgICAgIHNhdmVkLm1hcCgodmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbFNhdmVkID0ge1xuICAgICAgICAgIC4uLnZhbFxuICAgICAgICB9O1xuICAgICAgICBpZiAodmFsLm5hbWUgPT09IHNvdXJjZUZpZWxkKSB7XG4gICAgICAgICAgdGhpcy5fcGx1c1ZhbGlkYXRpb25zW3Jvd0luZGV4XSA9IHtcbiAgICAgICAgICAgIFtzb3VyY2VGaWVsZF06IHtcbiAgICAgICAgICAgICAgLi4udmFsU2F2ZWQsXG4gICAgICAgICAgICAgIGFsd2F5c1Nob3c6IHNob3dcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuY3JlYXRlT25lQ29udHJvbCh2YWwubmFtZSwgdGhpcy5mb3JtVmFsdWVzPy5jb250cm9sc1tyb3dJbmRleF0sIHNob3cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3BsdXNWYWxpZGF0aW9uc1tyb3dJbmRleF0gPSB7XG4gICAgICAgICAgICAuLi52YWxTYXZlZFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgdmFsaWRhdGVkID0gdGhpcy5oYW5kbGVJbnRlcm5hbFBsdXNWYWxpZGF0aW9uKHNldHRpbmdzLCBkYXRhKTtcbiAgICBjaGFuZ2VGaWVsZHModmFsaWRhdGVkKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlT25lQ29udHJvbChmaWVsZE5hbWU6IHN0cmluZywgY3RybDogYW55LCBjcmVhdGUgPSB0cnVlKSB7XG4gICAgY29uc3QgeyBmaWVsZHMgfSA9IHRoaXM7XG4gICAgaWYgKCFmaWVsZHMpIHJldHVybjtcblxuICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZDogTUVDWEZpZWxkQ29uZmlnKSA9PiB7XG4gICAgICBjb25zdCB7IGZpZWxkVHlwZSwgdmFsaWRhdGlvbnMsIG5hbWUsIGRpc2FibGVkIH0gPSBmaWVsZDtcbiAgICAgIGlmIChuYW1lICE9PSBmaWVsZE5hbWUpIHJldHVybjtcbiAgICAgIGxldCB7IHZhbHVlIH0gPSBmaWVsZDtcbiAgICAgIGlmIChmaWVsZFR5cGUgPT09ICdidXR0b24nKSByZXR1cm47XG4gICAgICBpZiAoZmllbGRUeXBlID09PSAncmFkaW9idXR0b24nIHx8IGZpZWxkVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBmaWVsZFR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgIHZhbHVlID0gJyc7XG4gICAgICB9XG4gICAgICBpZiAoY3JlYXRlKSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZiLmNvbnRyb2wodmFsdWUsIHRoaXMuYmluZFZhbGlkYXRpb25zKHZhbGlkYXRpb25zIHx8IFtdKSk7XG4gICAgICAgIGlmIChkaXNhYmxlZCB8fCB0aGlzLmRpc2FibGVkKSBjb250cm9sLmRpc2FibGUoKTtcbiAgICAgICAgY3RybC5hZGRDb250cm9sKG5hbWUsIGNvbnRyb2wpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3RybC5yZW1vdmVDb250cm9sKG5hbWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb250cm9sKGRhdGE/OiBhbnkpIHtcbiAgICBjb25zdCB7IGZpZWxkcyB9ID0gdGhpcztcbiAgICBpZiAoIWZpZWxkcykgcmV0dXJuIG51bGw7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9iamVjdC1jdXJseS1uZXdsaW5lXG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQ6IE1FQ1hGaWVsZENvbmZpZykgPT4ge1xuICAgICAgY29uc3QgeyBmaWVsZFR5cGUsIHZhbGlkYXRpb25zLCBuYW1lLCBkaXNhYmxlZCwgYWx3YXlzU2hvdyB9ID0gZmllbGQ7XG4gICAgICBsZXQgeyB2YWx1ZSB9ID0gZmllbGQ7XG4gICAgICBpZiAoZmllbGQuYWx3YXlzU2hvd1BsdXNWYWxpZGF0aW9uKSB7XG4gICAgICAgIGlmICghdGhpcy5oYW5kbGVJbnRlcm5hbFBsdXNWYWxpZGF0aW9uKGZpZWxkLmFsd2F5c1Nob3dQbHVzVmFsaWRhdGlvbiwgZGF0YSkpIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoIWFsd2F5c1Nob3cpIHJldHVybjtcbiAgICAgIGlmIChmaWVsZFR5cGUgPT09ICdidXR0b24nKSByZXR1cm47XG4gICAgICBpZiAoZmllbGRUeXBlID09PSAncmFkaW9idXR0b24nIHx8IGZpZWxkVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBmaWVsZFR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgIHZhbHVlID0gJyc7XG4gICAgICB9XG4gICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mYi5jb250cm9sKHZhbHVlLCB0aGlzLmJpbmRWYWxpZGF0aW9ucyh2YWxpZGF0aW9ucyB8fCBbXSkpO1xuICAgICAgaWYgKGRpc2FibGVkIHx8IHRoaXMuZGlzYWJsZWQpIGNvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgZ3JvdXAuYWRkQ29udHJvbChuYW1lIGFzIHN0cmluZywgY29udHJvbCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ3JvdXA7XG4gIH1cblxuICBwcml2YXRlIGJpbmRWYWxpZGF0aW9ucyh2YWxpZGF0aW9uczogTUVDWEZpZWxkQ29uZmlnVmFsaWRhdG9yW10pIHtcbiAgICBpZiAodmFsaWRhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgdmFsaWRMaXN0OiBhbnlbXSA9IFtdO1xuICAgICAgdmFsaWRhdGlvbnMuZm9yRWFjaCgodmFsaWQ6IE1FQ1hGaWVsZENvbmZpZ1ZhbGlkYXRvcikgPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWQgPSB2YWxpZC5wYXJhbVxuICAgICAgICAgID8gdmFsaWRhdG9yc1t2YWxpZC5uYW1lXSh2YWxpZC5wYXJhbSlcbiAgICAgICAgICA6IHZhbGlkYXRvcnNbdmFsaWQubmFtZV07XG4gICAgICAgIHZhbGlkTGlzdC5wdXNoKHZhbGlkYXRlZCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBWYWxpZGF0b3JzLmNvbXBvc2UodmFsaWRMaXN0KTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRm9ybSgpOiBGb3JtR3JvdXAge1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGZpZWxkczogdGhpcy5mYi5hcnJheShbXSlcbiAgICB9KTtcblxuICAgIGZvcm0/LmNvbnRyb2xzLmZpZWxkcz8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoXykgPT4ge1xuICAgICAgdGhpcy53YXRjaEZvckNoYW5nZXMoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmb3JtO1xuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaEZvckNoYW5nZXMoKSB7XG4gICAgY29uc3QgeyBmaWVsZHMsIGNoYW5nZXNVbnN1YnNjcmliZSB9ID0gdGhpcztcbiAgICBjaGFuZ2VzVW5zdWJzY3JpYmUubmV4dCgpO1xuXG4gICAgdGhpcy5mb3JtVmFsdWVzPy5jb250cm9scz8ubWFwKChjb250cm9sOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZENvbmZpZzogTUVDWEZpZWxkQ29uZmlnKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSwgYWx3YXlzU2hvd1BsdXNWYWxpZGF0aW9uIH0gPSBmaWVsZENvbmZpZztcbiAgICAgICAgaWYgKCFhbHdheXNTaG93UGx1c1ZhbGlkYXRpb24pIHJldHVybjtcbiAgICAgICAgY29uc3QgeyBmaWVsZCB9ID0gYWx3YXlzU2hvd1BsdXNWYWxpZGF0aW9uO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICBjb250cm9sLmNvbnRyb2xzW2ZpZWxkXT8udmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgICAgICB0YWtlVW50aWwoY2hhbmdlc1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKChfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWFrZUludGVybmFsUGx1c1ZhbGlkYXRpb24oXG4gICAgICAgICAgICAgIF8sXG4gICAgICAgICAgICAgIG5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICBhbHdheXNTaG93UGx1c1ZhbGlkYXRpb24sXG4gICAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGZvcm1CYXNlID0gKCkgPT4ge1xuICAgIC8vIHJldHVybiB0aGlzLmZiLmdyb3VwKHRoaXMuY3JlYXRlQ29udHJvbCgpKTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVDb250cm9sKCk7XG4gIH07XG5cbiAgcHVibGljIGdldCBmb3JtVmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLl9mb3JtID8gKHRoaXMuX2Zvcm0uZ2V0KCdmaWVsZHMnKSBhcyBGb3JtQXJyYXkpIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBmaWxsVmFsdWVzKCkge1xuICAgIGNvbnN0IHsgZGF0YSwgcXRkIH0gPSB0aGlzO1xuICAgIGlmICgoIXRoaXMuX2Zvcm0pICYmIHF0ZCkgcmV0dXJuO1xuICAgIGlmIChxdGQgPiAwKSB7XG4gICAgICBBcnJheTxhbnk+KHF0ZClcbiAgICAgICAgLmZpbGwobnVsbClcbiAgICAgICAgLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICAgICAgICBsZXQgZm9ybSA9IHRoaXMuY3JlYXRlQ29udHJvbCgpO1xuICAgICAgICAgIGlmIChkYXRhICYmIGRhdGFbaW5kZXhdKSB7XG4gICAgICAgICAgICBmb3JtID0gdGhpcy5jcmVhdGVDb250cm9sKGRhdGFbaW5kZXhdKTtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZWREYXRhID0gZGF0YVtpbmRleF07XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhoYW5kbGVkRGF0YSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChNb25rZXlVdGlscy5wZXJzaXN0TnVsbEVtcHR5VW5kZWZpbmVkKHZhbHVlKSAmJiBmb3JtPy5jb250cm9sc1trZXldKSB7XG4gICAgICAgICAgICAgICAgZm9ybT8uY29udHJvbHNba2V5XS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmZvcm1WYWx1ZXM/LnB1c2goZm9ybSBhcyBhbnkpO1xuXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuX2Zvcm0gPSB0aGlzLmJ1aWxkRm9ybSgpO1xuICAgIHRoaXMuZmlsbFZhbHVlcygpO1xuXG4gICAgdGhpcy5vbkhhbmRsZVVwZGF0ZUZvcm0uc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZmlsbFZhbHVlcygpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgaWYgKCF0aGlzLl9mb3JtKSB7XG4gICAgICB0aGlzLl9mb3JtID0gdGhpcy5idWlsZEZvcm0oKTtcbiAgICB9XG4gICAgdGhpcy5maWxsVmFsdWVzKCk7XG4gIH1cbn1cbiJdfQ==
|