ng2-rest 13.2.7 → 13.2.8

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.
Files changed (131) hide show
  1. package/README.md +135 -135
  2. package/assets/shared/shared_folder_info.txt +1 -1
  3. package/browser/README.md +24 -24
  4. package/browser/esm2020/lib/content-type.mjs +12 -12
  5. package/browser/esm2020/lib/cookie.mjs +28 -28
  6. package/browser/esm2020/lib/helpers.mjs +23 -23
  7. package/browser/esm2020/lib/index.mjs +12 -12
  8. package/browser/esm2020/lib/mapping.mjs +238 -238
  9. package/browser/esm2020/lib/models.mjs +159 -159
  10. package/browser/esm2020/lib/other/simple-resource.mjs +116 -116
  11. package/browser/esm2020/lib/params.mjs +278 -278
  12. package/browser/esm2020/lib/request-cache.mjs +100 -100
  13. package/browser/esm2020/lib/resource.service.mjs +213 -213
  14. package/browser/esm2020/lib/rest-headers.mjs +128 -128
  15. package/browser/esm2020/lib/rest-request.mjs +321 -321
  16. package/browser/esm2020/lib/rest.class.mjs +115 -115
  17. package/browser/esm2020/ng2-rest.mjs +4 -4
  18. package/browser/esm2020/public-api.mjs +1 -1
  19. package/browser/fesm2015/ng2-rest.mjs +1677 -1677
  20. package/browser/fesm2020/ng2-rest.mjs +1675 -1675
  21. package/browser/lib/content-type.d.ts +4 -4
  22. package/browser/lib/cookie.d.ts +7 -7
  23. package/browser/lib/helpers.d.ts +10 -10
  24. package/browser/lib/index.d.ts +9 -9
  25. package/browser/lib/mapping.d.ts +12 -12
  26. package/browser/lib/models.d.ts +157 -157
  27. package/browser/lib/other/simple-resource.d.ts +29 -29
  28. package/browser/lib/params.d.ts +23 -23
  29. package/browser/lib/request-cache.d.ts +17 -17
  30. package/browser/lib/resource.service.d.ts +43 -43
  31. package/browser/lib/rest-headers.d.ts +57 -57
  32. package/browser/lib/rest-request.d.ts +21 -21
  33. package/browser/lib/rest.class.d.ts +36 -36
  34. package/browser/ng2-rest.d.ts +4 -4
  35. package/client/README.md +24 -24
  36. package/client/esm2020/lib/content-type.mjs +12 -12
  37. package/client/esm2020/lib/cookie.mjs +28 -28
  38. package/client/esm2020/lib/helpers.mjs +23 -23
  39. package/client/esm2020/lib/index.mjs +12 -12
  40. package/client/esm2020/lib/mapping.mjs +238 -238
  41. package/client/esm2020/lib/models.mjs +159 -159
  42. package/client/esm2020/lib/other/simple-resource.mjs +116 -116
  43. package/client/esm2020/lib/params.mjs +278 -278
  44. package/client/esm2020/lib/request-cache.mjs +100 -100
  45. package/client/esm2020/lib/resource.service.mjs +213 -213
  46. package/client/esm2020/lib/rest-headers.mjs +128 -128
  47. package/client/esm2020/lib/rest-request.mjs +321 -321
  48. package/client/esm2020/lib/rest.class.mjs +115 -115
  49. package/client/esm2020/ng2-rest.mjs +4 -4
  50. package/client/esm2020/public-api.mjs +1 -1
  51. package/client/fesm2015/ng2-rest.mjs +1677 -1677
  52. package/client/fesm2020/ng2-rest.mjs +1675 -1675
  53. package/client/lib/content-type.d.ts +4 -4
  54. package/client/lib/cookie.d.ts +7 -7
  55. package/client/lib/helpers.d.ts +10 -10
  56. package/client/lib/index.d.ts +9 -9
  57. package/client/lib/mapping.d.ts +12 -12
  58. package/client/lib/models.d.ts +157 -157
  59. package/client/lib/other/simple-resource.d.ts +29 -29
  60. package/client/lib/params.d.ts +23 -23
  61. package/client/lib/request-cache.d.ts +17 -17
  62. package/client/lib/resource.service.d.ts +43 -43
  63. package/client/lib/rest-headers.d.ts +57 -57
  64. package/client/lib/rest-request.d.ts +21 -21
  65. package/client/lib/rest.class.d.ts +36 -36
  66. package/client/ng2-rest.d.ts +4 -4
  67. package/client/package.json +28 -28
  68. package/index.d.ts +1 -1
  69. package/index.js.map +1 -1
  70. package/lib/content-type.d.ts +5 -5
  71. package/lib/content-type.js.map +1 -1
  72. package/lib/cookie.d.ts +8 -8
  73. package/lib/cookie.js.map +1 -1
  74. package/lib/helpers.d.ts +11 -11
  75. package/lib/helpers.js.map +1 -1
  76. package/lib/index.d.ts +10 -10
  77. package/lib/index.js.map +1 -1
  78. package/lib/mapping.d.ts +13 -13
  79. package/lib/mapping.js.map +1 -1
  80. package/lib/models.d.ts +158 -158
  81. package/lib/models.js.map +1 -1
  82. package/lib/other/simple-resource.d.ts +30 -30
  83. package/lib/other/simple-resource.js.map +1 -1
  84. package/lib/params.d.ts +24 -24
  85. package/lib/params.js.map +1 -1
  86. package/lib/request-cache.d.ts +18 -18
  87. package/lib/request-cache.js.map +1 -1
  88. package/lib/resource.service.d.ts +44 -44
  89. package/lib/resource.service.js.map +1 -1
  90. package/lib/rest-headers.d.ts +58 -58
  91. package/lib/rest-headers.js.map +1 -1
  92. package/lib/rest-request.d.ts +22 -22
  93. package/lib/rest-request.js.map +1 -1
  94. package/lib/rest.class.d.ts +37 -37
  95. package/lib/rest.class.js.map +1 -1
  96. package/package.json +4 -4
  97. package/package.json_devDependencies.json +217 -217
  98. package/package.json_tnp.json5 +53 -50
  99. package/tmp-environment.json +34 -33
  100. package/websql/README.md +24 -24
  101. package/websql/esm2020/lib/content-type.mjs +12 -12
  102. package/websql/esm2020/lib/cookie.mjs +28 -28
  103. package/websql/esm2020/lib/helpers.mjs +23 -23
  104. package/websql/esm2020/lib/index.mjs +12 -12
  105. package/websql/esm2020/lib/mapping.mjs +238 -238
  106. package/websql/esm2020/lib/models.mjs +159 -159
  107. package/websql/esm2020/lib/other/simple-resource.mjs +116 -116
  108. package/websql/esm2020/lib/params.mjs +278 -278
  109. package/websql/esm2020/lib/request-cache.mjs +100 -100
  110. package/websql/esm2020/lib/resource.service.mjs +213 -213
  111. package/websql/esm2020/lib/rest-headers.mjs +128 -128
  112. package/websql/esm2020/lib/rest-request.mjs +321 -321
  113. package/websql/esm2020/lib/rest.class.mjs +115 -115
  114. package/websql/esm2020/ng2-rest.mjs +4 -4
  115. package/websql/esm2020/public-api.mjs +1 -1
  116. package/websql/fesm2015/ng2-rest.mjs +1677 -1677
  117. package/websql/fesm2020/ng2-rest.mjs +1675 -1675
  118. package/websql/lib/content-type.d.ts +4 -4
  119. package/websql/lib/cookie.d.ts +7 -7
  120. package/websql/lib/helpers.d.ts +10 -10
  121. package/websql/lib/index.d.ts +9 -9
  122. package/websql/lib/mapping.d.ts +12 -12
  123. package/websql/lib/models.d.ts +157 -157
  124. package/websql/lib/other/simple-resource.d.ts +29 -29
  125. package/websql/lib/params.d.ts +23 -23
  126. package/websql/lib/request-cache.d.ts +17 -17
  127. package/websql/lib/resource.service.d.ts +43 -43
  128. package/websql/lib/rest-headers.d.ts +57 -57
  129. package/websql/lib/rest-request.d.ts +21 -21
  130. package/websql/lib/rest.class.d.ts +36 -36
  131. package/websql/ng2-rest.d.ts +4 -4
@@ -1,250 +1,250 @@
1
- import { _ } from 'tnp-core/websql';
2
- import { Helpers } from 'tnp-core/websql';
3
- import { walk } from 'lodash-walk-object/websql';
4
- import { CLASS, SYMBOL } from 'typescript-class-helpers/websql';
5
- export var Mapping;
6
- (function (Mapping) {
7
- function decode(json, autodetect = false) {
8
- if (_.isUndefined(json)) {
9
- return void 0;
10
- }
11
- let mapping = decodeFromDecorator(_.isArray(json) ? _.first(json) : json, !autodetect);
12
- if (autodetect) {
13
- mapping = _.merge(getMappingNaive(json), mapping);
14
- }
15
- return mapping;
16
- }
17
- Mapping.decode = decode;
18
- function encode(json, mapping, circular = []) {
19
- if (_.isString(json) || _.isBoolean(json) || _.isNumber(json)) {
20
- return json;
21
- }
22
- if (mapping['']) {
23
- const decoratorMapping = getModelsMapping(CLASS.getBy(mapping['']));
24
- mapping = _.merge(mapping, decoratorMapping);
25
- }
26
- let res;
27
- if (_.isArray(circular) && circular.length > 0) {
28
- res = setMappingCirc(json, mapping, circular);
29
- }
30
- else {
31
- res = setMapping(json, mapping);
32
- }
33
- return res;
34
- }
35
- Mapping.encode = encode;
36
- function decodeFromDecorator(json, production = false) {
37
- const entityClass = CLASS.getFromObject(json);
38
- const mappings = getModelsMapping(entityClass);
39
- return mappings;
40
- }
41
- function getModelsMapping(entity) {
42
- if (!_.isFunction(entity) || entity === Object) {
43
- return {};
44
- }
45
- const className = CLASS.getName(entity);
46
- let enityOWnMapping = _.isArray(entity[SYMBOL.MODELS_MAPPING]) ?
47
- entity[SYMBOL.MODELS_MAPPING] : [{ '': className }];
48
- let res = {};
49
- let parents = enityOWnMapping
50
- .filter(m => !_.isUndefined(m['']) && m[''] !== className)
51
- .map(m => m['']);
52
- enityOWnMapping.reverse().forEach(m => {
53
- m = _.cloneDeep(m);
54
- Object.keys(m).forEach(key => {
55
- const v = m[key];
56
- const isArr = _.isArray(v);
57
- const model = isArr ? _.first(v) : v;
58
- if (parents.includes(model)) {
59
- m[key] = isArr ? [className] : className;
60
- }
61
- });
62
- res = _.merge(res, m);
63
- });
64
- res[''] = className;
65
- return res;
66
- }
67
- Mapping.getModelsMapping = getModelsMapping;
68
- function add(o, path, mapping = {}) {
69
- if (!o || Array.isArray(o) || typeof o !== 'object')
70
- return;
71
- const objectClassName = CLASS.getName(Object.getPrototypeOf(o).constructor);
72
- const resolveClass = CLASS.getBy(objectClassName);
73
- if (!resolveClass) {
74
- if (objectClassName !== 'Object') {
75
- if (Helpers.isBrowser) {
76
- console.error(`Cannot resolve class "${objectClassName}" while mapping.`);
77
- }
78
- }
79
- return;
80
- }
81
- if (!mapping[path])
82
- mapping[path] = CLASS.getName(resolveClass);
83
- ;
84
- }
85
- /**
86
- * USE ONLY IN DEVELOPMENT
87
- * @param c
88
- * @param path
89
- * @param mapping
90
- * @param level
91
- */
92
- function getMappingNaive(c, path = '', mapping = {}, level = 0) {
93
- if (Array.isArray(c)) {
94
- c.forEach(c => getMappingNaive(c, path, mapping, level));
95
- return mapping;
96
- }
97
- if (++level === 16)
98
- return;
99
- add(c, path, mapping);
100
- for (var p in c) {
101
- if (c.hasOwnProperty(p)) {
102
- const v = c[p];
103
- if (Array.isArray(v) && v.length > 0) { // reducer as impovement
104
- v.forEach((elem, i) => {
105
- const currentPaht = [path, p].filter(c => c.trim() != '').join('.');
106
- getMappingNaive(elem, currentPaht, mapping, level);
107
- });
108
- }
109
- else if (typeof v === 'object') {
110
- const currentPaht = [path, p].filter(c => c.trim() != '').join('.');
111
- add(v, currentPaht, mapping);
112
- getMappingNaive(v, currentPaht, mapping, level);
113
- }
114
- }
115
- }
116
- return mapping;
117
- }
118
- function getMappingPathFrom(pathLodhas) {
119
- if (!_.isString(pathLodhas)) {
120
- return void 0;
121
- }
122
- const regex = /\[([0-9a-zA-Z]|\'|\")*\]/g;
123
- pathLodhas = pathLodhas
124
- .replace(regex, '')
125
- .replace('..', '.');
126
- if (pathLodhas.startsWith('.')) {
127
- pathLodhas = pathLodhas.slice(1);
128
- }
129
- return pathLodhas;
130
- }
131
- function setMappingCirc(json, mapping = {}, circular = []) {
132
- const mainClassFn = !_.isArray(json) && CLASS.getBy(mapping['']);
133
- walk.Object(json, (v, lodashPath, changeValue) => {
134
- if (!_.isUndefined(v) && !_.isNull(v)) {
135
- const mappingPath = getMappingPathFrom(lodashPath);
136
- if (!_.isUndefined(mapping[mappingPath])) {
137
- const isArray = _.isArray(mapping[mappingPath]);
138
- if (!isArray) {
139
- const className = isArray ? _.first(mapping[mappingPath]) : mapping[mappingPath];
140
- const classFN = CLASS.getBy(className);
141
- if (_.isFunction(classFN)) {
142
- changeValue(_.merge(new classFN(), v));
143
- }
144
- }
145
- }
146
- }
147
- });
148
- circular.forEach(c => {
149
- const ref = _.get(json, c.circuralTargetPath);
150
- _.set(json, c.pathToObj, ref);
151
- });
152
- if (_.isFunction(mainClassFn)) {
153
- json = _.merge(new mainClassFn(), json);
154
- }
155
- return json;
156
- }
157
- function setMapping(json, mapping = {}) {
158
- if (Array.isArray(json)) {
159
- return json.map(j => {
160
- return setMapping(j, mapping);
161
- });
162
- }
163
- const mainClassFn = CLASS.getBy(mapping['']);
164
- for (const key in json) {
165
- if (json.hasOwnProperty(key)) {
166
- if (_.isArray(json[key])) {
167
- json[key] = json[key].map(arrObj => {
168
- const objMapping = getModelsMapping(CLASS.getBy(mapping[key]));
169
- return setMapping(arrObj, objMapping);
170
- });
171
- }
172
- else if (_.isObject(json[key])) {
173
- const objMapping = getModelsMapping(CLASS.getBy(mapping[key]));
174
- json[key] = setMapping(json[key], objMapping);
175
- }
176
- }
177
- }
178
- Object
179
- .keys(mapping)
180
- .filter(key => key !== '' && key.split('.').length >= 2)
181
- .forEach(lodasPath => {
182
- const objMapping = getModelsMapping(CLASS.getBy(mapping[lodasPath]));
183
- const input = _.get(json, lodasPath);
184
- if (!_.isUndefined(input)) {
185
- const res = setMapping(input, objMapping);
186
- _.set(json, lodasPath, res);
187
- }
188
- });
189
- if (!mainClassFn) {
190
- return json;
191
- }
192
- return _.merge(new mainClassFn(), json);
193
- }
194
- function DefaultModelWithMapping(defaultModelValues, mapping) {
195
- return function (target) {
196
- if (!_.isArray(target[SYMBOL.MODELS_MAPPING])) {
197
- target[SYMBOL.MODELS_MAPPING] = [];
198
- }
199
- target[SYMBOL.MODELS_MAPPING].push({ '': CLASS.getName(target) });
200
- if (_.isObject(mapping)) {
201
- target[SYMBOL.MODELS_MAPPING] = target[SYMBOL.MODELS_MAPPING].concat(mapping);
202
- Object.keys(mapping)
203
- .forEach(key => {
204
- const v = mapping;
205
- if (_.isUndefined(v) || _.isFunction(v)) {
1
+ import { _ } from 'tnp-core/websql';
2
+ import { Helpers } from 'tnp-core/websql';
3
+ import { walk } from 'lodash-walk-object/websql';
4
+ import { CLASS, SYMBOL } from 'typescript-class-helpers/websql';
5
+ export var Mapping;
6
+ (function (Mapping) {
7
+ function decode(json, autodetect = false) {
8
+ if (_.isUndefined(json)) {
9
+ return void 0;
10
+ }
11
+ let mapping = decodeFromDecorator(_.isArray(json) ? _.first(json) : json, !autodetect);
12
+ if (autodetect) {
13
+ mapping = _.merge(getMappingNaive(json), mapping);
14
+ }
15
+ return mapping;
16
+ }
17
+ Mapping.decode = decode;
18
+ function encode(json, mapping, circular = []) {
19
+ if (_.isString(json) || _.isBoolean(json) || _.isNumber(json)) {
20
+ return json;
21
+ }
22
+ if (mapping['']) {
23
+ const decoratorMapping = getModelsMapping(CLASS.getBy(mapping['']));
24
+ mapping = _.merge(mapping, decoratorMapping);
25
+ }
26
+ let res;
27
+ if (_.isArray(circular) && circular.length > 0) {
28
+ res = setMappingCirc(json, mapping, circular);
29
+ }
30
+ else {
31
+ res = setMapping(json, mapping);
32
+ }
33
+ return res;
34
+ }
35
+ Mapping.encode = encode;
36
+ function decodeFromDecorator(json, production = false) {
37
+ const entityClass = CLASS.getFromObject(json);
38
+ const mappings = getModelsMapping(entityClass);
39
+ return mappings;
40
+ }
41
+ function getModelsMapping(entity) {
42
+ if (!_.isFunction(entity) || entity === Object) {
43
+ return {};
44
+ }
45
+ const className = CLASS.getName(entity);
46
+ let enityOWnMapping = _.isArray(entity[SYMBOL.MODELS_MAPPING]) ?
47
+ entity[SYMBOL.MODELS_MAPPING] : [{ '': className }];
48
+ let res = {};
49
+ let parents = enityOWnMapping
50
+ .filter(m => !_.isUndefined(m['']) && m[''] !== className)
51
+ .map(m => m['']);
52
+ enityOWnMapping.reverse().forEach(m => {
53
+ m = _.cloneDeep(m);
54
+ Object.keys(m).forEach(key => {
55
+ const v = m[key];
56
+ const isArr = _.isArray(v);
57
+ const model = isArr ? _.first(v) : v;
58
+ if (parents.includes(model)) {
59
+ m[key] = isArr ? [className] : className;
60
+ }
61
+ });
62
+ res = _.merge(res, m);
63
+ });
64
+ res[''] = className;
65
+ return res;
66
+ }
67
+ Mapping.getModelsMapping = getModelsMapping;
68
+ function add(o, path, mapping = {}) {
69
+ if (!o || Array.isArray(o) || typeof o !== 'object')
70
+ return;
71
+ const objectClassName = CLASS.getName(Object.getPrototypeOf(o).constructor);
72
+ const resolveClass = CLASS.getBy(objectClassName);
73
+ if (!resolveClass) {
74
+ if (objectClassName !== 'Object') {
75
+ if (Helpers.isBrowser) {
76
+ console.error(`Cannot resolve class "${objectClassName}" while mapping.`);
77
+ }
78
+ }
79
+ return;
80
+ }
81
+ if (!mapping[path])
82
+ mapping[path] = CLASS.getName(resolveClass);
83
+ ;
84
+ }
85
+ /**
86
+ * USE ONLY IN DEVELOPMENT
87
+ * @param c
88
+ * @param path
89
+ * @param mapping
90
+ * @param level
91
+ */
92
+ function getMappingNaive(c, path = '', mapping = {}, level = 0) {
93
+ if (Array.isArray(c)) {
94
+ c.forEach(c => getMappingNaive(c, path, mapping, level));
95
+ return mapping;
96
+ }
97
+ if (++level === 16)
98
+ return;
99
+ add(c, path, mapping);
100
+ for (var p in c) {
101
+ if (c.hasOwnProperty(p)) {
102
+ const v = c[p];
103
+ if (Array.isArray(v) && v.length > 0) { // reducer as impovement
104
+ v.forEach((elem, i) => {
105
+ const currentPaht = [path, p].filter(c => c.trim() != '').join('.');
106
+ getMappingNaive(elem, currentPaht, mapping, level);
107
+ });
108
+ }
109
+ else if (typeof v === 'object') {
110
+ const currentPaht = [path, p].filter(c => c.trim() != '').join('.');
111
+ add(v, currentPaht, mapping);
112
+ getMappingNaive(v, currentPaht, mapping, level);
113
+ }
114
+ }
115
+ }
116
+ return mapping;
117
+ }
118
+ function getMappingPathFrom(pathLodhas) {
119
+ if (!_.isString(pathLodhas)) {
120
+ return void 0;
121
+ }
122
+ const regex = /\[([0-9a-zA-Z]|\'|\")*\]/g;
123
+ pathLodhas = pathLodhas
124
+ .replace(regex, '')
125
+ .replace('..', '.');
126
+ if (pathLodhas.startsWith('.')) {
127
+ pathLodhas = pathLodhas.slice(1);
128
+ }
129
+ return pathLodhas;
130
+ }
131
+ function setMappingCirc(json, mapping = {}, circular = []) {
132
+ const mainClassFn = !_.isArray(json) && CLASS.getBy(mapping['']);
133
+ walk.Object(json, (v, lodashPath, changeValue) => {
134
+ if (!_.isUndefined(v) && !_.isNull(v)) {
135
+ const mappingPath = getMappingPathFrom(lodashPath);
136
+ if (!_.isUndefined(mapping[mappingPath])) {
137
+ const isArray = _.isArray(mapping[mappingPath]);
138
+ if (!isArray) {
139
+ const className = isArray ? _.first(mapping[mappingPath]) : mapping[mappingPath];
140
+ const classFN = CLASS.getBy(className);
141
+ if (_.isFunction(classFN)) {
142
+ changeValue(_.merge(new classFN(), v));
143
+ }
144
+ }
145
+ }
146
+ }
147
+ });
148
+ circular.forEach(c => {
149
+ const ref = _.get(json, c.circuralTargetPath);
150
+ _.set(json, c.pathToObj, ref);
151
+ });
152
+ if (_.isFunction(mainClassFn)) {
153
+ json = _.merge(new mainClassFn(), json);
154
+ }
155
+ return json;
156
+ }
157
+ function setMapping(json, mapping = {}) {
158
+ if (Array.isArray(json)) {
159
+ return json.map(j => {
160
+ return setMapping(j, mapping);
161
+ });
162
+ }
163
+ const mainClassFn = CLASS.getBy(mapping['']);
164
+ for (const key in json) {
165
+ if (json.hasOwnProperty(key)) {
166
+ if (_.isArray(json[key])) {
167
+ json[key] = json[key].map(arrObj => {
168
+ const objMapping = getModelsMapping(CLASS.getBy(mapping[key]));
169
+ return setMapping(arrObj, objMapping);
170
+ });
171
+ }
172
+ else if (_.isObject(json[key])) {
173
+ const objMapping = getModelsMapping(CLASS.getBy(mapping[key]));
174
+ json[key] = setMapping(json[key], objMapping);
175
+ }
176
+ }
177
+ }
178
+ Object
179
+ .keys(mapping)
180
+ .filter(key => key !== '' && key.split('.').length >= 2)
181
+ .forEach(lodasPath => {
182
+ const objMapping = getModelsMapping(CLASS.getBy(mapping[lodasPath]));
183
+ const input = _.get(json, lodasPath);
184
+ if (!_.isUndefined(input)) {
185
+ const res = setMapping(input, objMapping);
186
+ _.set(json, lodasPath, res);
187
+ }
188
+ });
189
+ if (!mainClassFn) {
190
+ return json;
191
+ }
192
+ return _.merge(new mainClassFn(), json);
193
+ }
194
+ function DefaultModelWithMapping(defaultModelValues, mapping) {
195
+ return function (target) {
196
+ if (!_.isArray(target[SYMBOL.MODELS_MAPPING])) {
197
+ target[SYMBOL.MODELS_MAPPING] = [];
198
+ }
199
+ target[SYMBOL.MODELS_MAPPING].push({ '': CLASS.getName(target) });
200
+ if (_.isObject(mapping)) {
201
+ target[SYMBOL.MODELS_MAPPING] = target[SYMBOL.MODELS_MAPPING].concat(mapping);
202
+ Object.keys(mapping)
203
+ .forEach(key => {
204
+ const v = mapping;
205
+ if (_.isUndefined(v) || _.isFunction(v)) {
206
206
  throw `
207
207
 
208
208
 
209
209
  Class: '${target.name}'
210
210
  [ng2rest] Bad mapping value for path: ${key} , please use type: <string> or [<string>]
211
- `;
212
- }
213
- });
214
- }
215
- if (_.isObject(defaultModelValues)) {
216
- const toMerge = {};
217
- const describedTarget = CLASS
218
- .describeProperites(target)
219
- .filter(prop => /^([a-zA-Z0-9]|\_|\#)+$/.test(prop));
220
- describedTarget.forEach(propDefInConstr => {
221
- if (defaultModelValues[propDefInConstr]) {
211
+ `;
212
+ }
213
+ });
214
+ }
215
+ if (_.isObject(defaultModelValues)) {
216
+ const toMerge = {};
217
+ const describedTarget = CLASS
218
+ .describeProperites(target)
219
+ .filter(prop => /^([a-zA-Z0-9]|\_|\#)+$/.test(prop));
220
+ describedTarget.forEach(propDefInConstr => {
221
+ if (defaultModelValues[propDefInConstr]) {
222
222
  console.warn(`
223
223
 
224
224
  CONFLICT: default value for property: "${propDefInConstr}"
225
225
  in class "${target.name}" already defined as typescript
226
226
  default class proprty value.
227
227
 
228
- `);
229
- }
230
- else {
231
- toMerge[propDefInConstr] = null; // TODO from toString I can't know that
232
- }
233
- });
234
- target[SYMBOL.DEFAULT_MODEL] = _.merge(toMerge, defaultModelValues);
235
- const propsToOmmit = Object
236
- .keys(target[SYMBOL.DEFAULT_MODEL])
237
- .filter(key => {
238
- const descriptor = Object
239
- .getOwnPropertyDescriptor(target.prototype, key);
240
- return !!descriptor;
241
- });
242
- _.merge(target.prototype, _.omit(target[SYMBOL.DEFAULT_MODEL], propsToOmmit));
243
- }
244
- };
245
- }
246
- Mapping.DefaultModelWithMapping = DefaultModelWithMapping;
247
- })(Mapping || (Mapping = {}));
248
- ;
249
- ({}); // @--end-of-file-for-module=ng2-rest lib/mapping.ts
228
+ `);
229
+ }
230
+ else {
231
+ toMerge[propDefInConstr] = null; // TODO from toString I can't know that
232
+ }
233
+ });
234
+ target[SYMBOL.DEFAULT_MODEL] = _.merge(toMerge, defaultModelValues);
235
+ const propsToOmmit = Object
236
+ .keys(target[SYMBOL.DEFAULT_MODEL])
237
+ .filter(key => {
238
+ const descriptor = Object
239
+ .getOwnPropertyDescriptor(target.prototype, key);
240
+ return !!descriptor;
241
+ });
242
+ _.merge(target.prototype, _.omit(target[SYMBOL.DEFAULT_MODEL], propsToOmmit));
243
+ }
244
+ };
245
+ }
246
+ Mapping.DefaultModelWithMapping = DefaultModelWithMapping;
247
+ })(Mapping || (Mapping = {}));
248
+ ;
249
+ ({}); // @--end-of-file-for-module=ng2-rest lib/mapping.ts
250
250
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwcGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RtcC1saWJzLWZvci1idW5kbGUtd2Vic3FsL25nMi1yZXN0L3Byb2plY3RzL25nMi1yZXN0L3NyYy9saWIvbWFwcGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR2hFLE1BQU0sS0FBVyxPQUFPLENBcVR2QjtBQXJURCxXQUFpQixPQUFPO0lBRXRCLFNBQWdCLE1BQU0sQ0FBQyxJQUFZLEVBQUUsVUFBVSxHQUFHLEtBQUs7UUFHckQsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3ZCLE9BQU8sS0FBSyxDQUFDLENBQUM7U0FDZjtRQUVELElBQUksT0FBTyxHQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRXRGLElBQUksVUFBVSxFQUFFO1lBQ2QsT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ25EO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQWRlLGNBQU0sU0FjckIsQ0FBQTtJQUVELFNBQWdCLE1BQU0sQ0FBZSxJQUFZLEVBQUUsT0FBZ0IsRUFBRSxXQUFtQixFQUFFO1FBQ3hGLElBQUksQ0FBQyxDQUFD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SUFBSSxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsRUFBRTt3QkFDdkMsT0FBTyxDQUFDLElBQUksQ0FBQzs7cURBRTRCLGVBQWU7d0JBQzVDLE1BQU0sQ0FBQyxJQUFJOzs7YUFHdEIsQ0FBQyxDQUFBO3FCQUNIO3lCQUFNO3dCQUNMLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyx1Q0FBdUM7cUJBQ3pFO2dCQUNILENBQUMsQ0FBQyxDQUFDO2dCQUlILE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztnQkFFcEUsTUFBTSxZQUFZLEdBQUcsTUFBTTtxQkFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7cUJBQ2xDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDWixNQUFNLFVBQVUsR0FBRyxNQUFNO3lCQUN0Qix3QkFBd0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUNuRCxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUM7Z0JBQ3RCLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQzthQUcvRTtRQUNILENBQUMsQ0FBQTtJQUNILENBQUM7SUFqRWUsK0JBQXVCLDBCQWlFdEMsQ0FBQTtBQUVILENBQUMsRUFyVGdCLE9BQU8sS0FBUCxPQUFPLFFBcVR2QjtBQUVBLENBQUM7QUFBQSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsb0RBQW9EIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgXyB9IGZyb20gJ3RucC1jb3JlL3dlYnNxbCc7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSAndG5wLWNvcmUvd2Vic3FsJztcbmltcG9ydCB7IENpcmMsIEpTT04xMCB9IGZyb20gJ2pzb24xMC93ZWJzcWwnO1xuaW1wb3J0IHsgd2FsayB9IGZyb20gJ2xvZGFzaC13YWxrLW9iamVjdC93ZWJzcWwnO1xuaW1wb3J0IHsgQ0xBU1MsIFNZTUJPTCB9IGZyb20gJ3R5cGVzY3JpcHQtY2xhc3MtaGVscGVycy93ZWJzcWwnO1xuaW1wb3J0IHsgSGVscGVycyBhcyBIZWxwZXJzTG9nIH0gZnJvbSAndG5wLWNvcmUvd2Vic3FsJztcblxuZXhwb3J0IG5hbWVzcGFjZSBNYXBwaW5nIHtcblxuICBleHBvcnQgZnVuY3Rpb24gZGVjb2RlKGpzb246IE9iamVjdCwgYXV0b2RldGVjdCA9IGZhbHNlKTogTWFwcGluZyB7XG5cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKGpzb24pKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cblxuICAgIGxldCBtYXBwaW5nID0gZGVjb2RlRnJvbURlY29yYXRvcihfLmlzQXJyYXkoanNvbikgPyBfLmZpcnN0KGpzb24pIDoganNvbiwgIWF1dG9kZXRlY3QpXG5cbiAgICBpZiAoYXV0b2RldGVjdCkge1xuICAgICAgbWFwcGluZyA9IF8ubWVyZ2UoZ2V0TWFwcGluZ05haXZlKGpzb24pLCBtYXBwaW5nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwcGluZztcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBlbmNvZGU8VCA9IEZ1bmN0aW9uPihqc29uOiBPYmplY3QsIG1hcHBpbmc6IE1hcHBpbmcsIGNpcmN1bGFyOiBDaXJjW10gPSBbXSk6IFQge1xuICAgIGlmIChfLmlzU3RyaW5nKGpzb24pIHx8IF8uaXNCb29sZWFuKGpzb24pIHx8IF8uaXNOdW1iZXIoanNvbikpIHtcbiAgICAgIHJldHVybiBqc29uIGFzIGFueTtcbiAgICB9XG5cbiAgICBpZiAobWFwcGluZ1snJ10pIHtcbiAgICAgIGNvbnN0IGRlY29yYXRvck1hcHBpbmcgPSBnZXRNb2RlbHNNYXBwaW5nKENMQVNTLmdldEJ5KG1hcHBpbmdbJyddKSk7XG4gICAgICBtYXBwaW5nID0gXy5tZXJnZShtYXBwaW5nLCBkZWNvcmF0b3JNYXBwaW5nKVxuICAgIH1cblxuICAgIGxldCByZXM6IGFueTtcbiAgICBpZiAoXy5pc0FycmF5KGNpcmN1bGFyKSAmJiBjaXJjdWxhci5sZW5ndGggPiAwKSB7XG4gICAgICByZXMgPSBzZXRNYXBwaW5nQ2lyYyhqc29uLCBtYXBwaW5nLCBjaXJjdWxhcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IHNldE1hcHBpbmcoanNvbiwgbWFwcGluZyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIGRlY29kZUZyb21EZWNvcmF0b3IoanNvbjogT2JqZWN0LCBwcm9kdWN0aW9uID0gZmFsc2UpOiBNYXBwaW5nIHtcbiAgICBjb25zdCBlbnRpdHlDbGFzcyA9IENMQVNTLmdldEZyb21PYmplY3QoanNvbik7XG4gICAgY29uc3QgbWFwcGluZ3MgPSBnZXRNb2RlbHNNYXBwaW5nKGVudGl0eUNsYXNzKTtcbiAgICByZXR1cm4gbWFwcGluZ3MgYXMgYW55O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsc01hcHBpbmcoZW50aXR5OiBGdW5jdGlvbikge1xuXG4gICAgaWYgKCFfLmlzRnVuY3Rpb24oZW50aXR5KSB8fCBlbnRpdHkgPT09IE9iamVjdCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCBjbGFzc05hbWUgPSBDTEFTUy5nZXROYW1lKGVudGl0eSlcblxuICAgIGxldCBlbml0eU9Xbk1hcHBpbmc6IGFueVtdID0gXy5pc0FycmF5KGVudGl0eVtTWU1CT0wuTU9ERUxTX01BUFBJTkddKSA/XG4gICAgICBlbnRpdHlbU1lNQk9MLk1PREVMU19NQVBQSU5HXSA6IFt7ICcnOiBjbGFzc05hbWUgfV07XG5cbiAgICBsZXQgcmVzID0ge307XG4gICAgbGV0IHBhcmVudHMgPSBlbml0eU9Xbk1hcHBpbmdcbiAgICAgIC5maWx0ZXIobSA9PiAhXy5pc1VuZGVmaW5lZChtWycnXSkgJiYgbVsnJ10gIT09IGNsYXNzTmFtZSlcbiAgICAgIC5tYXAobSA9PiBtWycnXSk7XG5cbiAgICBlbml0eU9Xbk1hcHBpbmcucmV2ZXJzZSgpLmZvckVhY2gobSA9PiB7XG4gICAgICBtID0gXy5jbG9uZURlZXAobSk7XG5cbiAgICAgIE9iamVjdC5rZXlzKG0pLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgY29uc3QgdiA9IG1ba2V5XVxuICAgICAgICBjb25zdCBpc0FyciA9IF8uaXNBcnJheSh2KVxuICAgICAgICBjb25zdCBtb2RlbCA9IGlzQXJyID8gXy5maXJzdCh2KSA6IHY7XG4gICAgICAgIGlmIChwYXJlbnRzLmluY2x1ZGVzKG1vZGVsKSkge1xuICAgICAgICAgIG1ba2V5XSA9IGlzQXJyID8gW2NsYXNzTmFtZV0gOiBjbGFzc05hbWU7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICByZXMgPSBfLm1lcmdlKHJlcywgbSlcbiAgICB9KVxuICAgIHJlc1snJ10gPSBjbGFzc05hbWU7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cblxuICBleHBvcnQgdHlwZSBNYXBwaW5nPFQgPSB7fT4gPSB7XG4gICAgW1AgaW4ga2V5b2YgVF0/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgfTtcblxuICBmdW5jdGlvbiBhZGQobzogT2JqZWN0LCBwYXRoOiBzdHJpbmcsIG1hcHBpbmc6IE1hcHBpbmcgPSB7fSkge1xuICAgIGlmICghbyB8fCBBcnJheS5pc0FycmF5KG8pIHx8IHR5cGVvZiBvICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuICAgIGNvbnN0IG9iamVjdENsYXNzTmFtZSA9IENMQVNTLmdldE5hbWUoT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pLmNvbnN0cnVjdG9yKTtcbiAgICBjb25zdCByZXNvbHZlQ2xhc3MgPSBDTEFTUy5nZXRCeShvYmplY3RDbGFzc05hbWUpO1xuICAgIGlmICghcmVzb2x2ZUNsYXNzKSB7XG4gICAgICBpZiAob2JqZWN0Q2xhc3NOYW1lICE9PSAnT2JqZWN0Jykge1xuICAgICAgICBpZiAoSGVscGVycy5pc0Jyb3dzZXIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBDYW5ub3QgcmVzb2x2ZSBjbGFzcyBcIiR7b2JqZWN0Q2xhc3NOYW1lfVwiIHdoaWxlIG1hcHBpbmcuYClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIW1hcHBpbmdbcGF0aF0pIG1hcHBpbmdbcGF0aF0gPSBDTEFTUy5nZXROYW1lKHJlc29sdmVDbGFzcykgYXMgYW55OztcbiAgfVxuXG4gIC8qKlxuICAgKiBVU0UgT05MWSBJTiBERVZFTE9QTUVOVFxuICAgKiBAcGFyYW0gY1xuICAgKiBAcGFyYW0gcGF0aFxuICAgKiBAcGFyYW0gbWFwcGluZ1xuICAgKiBAcGFyYW0gbGV2ZWxcbiAgICovXG4gIGZ1bmN0aW9uIGdldE1hcHBpbmdOYWl2ZShjOiBPYmplY3QsIHBhdGggPSAnJywgbWFwcGluZzogTWFwcGluZyA9IHt9LCBsZXZlbCA9IDApIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkge1xuICAgICAgYy5mb3JFYWNoKGMgPT4gZ2V0TWFwcGluZ05haXZlKGMsIHBhdGgsIG1hcHBpbmcsIGxldmVsKSlcbiAgICAgIHJldHVybiBtYXBwaW5nO1xuICAgIH1cbiAgICBpZiAoKytsZXZlbCA9PT0gMTYpIHJldHVybjtcbiAgICBhZGQoYywgcGF0aCwgbWFwcGluZyk7XG4gICAgZm9yICh2YXIgcCBpbiBjKSB7XG4gICAgICBpZiAoYy5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgICBjb25zdCB2ID0gY1twXTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodikgJiYgdi5sZW5ndGggPiAwKSB7IC8vIHJlZHVjZXIgYXMgaW1wb3ZlbWVudFxuICAgICAgICAgIHYuZm9yRWFjaCgoZWxlbSwgaSkgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UGFodCA9IFtwYXRoLCBwXS5maWx0ZXIoYyA9PiBjLnRyaW0oKSAhPSAnJykuam9pbignLicpO1xuICAgICAgICAgICAgZ2V0TWFwcGluZ05haXZlKGVsZW0sIGN1cnJlbnRQYWh0LCBtYXBwaW5nLCBsZXZlbCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UGFodCA9IFtwYXRoLCBwXS5maWx0ZXIoYyA9PiBjLnRyaW0oKSAhPSAnJykuam9pbignLicpO1xuICAgICAgICAgIGFkZCh2LCBjdXJyZW50UGFodCwgbWFwcGluZyk7XG4gICAgICAgICAgZ2V0TWFwcGluZ05haXZlKHYsIGN1cnJlbnRQYWh0LCBtYXBwaW5nLCBsZXZlbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcHBpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNYXBwaW5nUGF0aEZyb20ocGF0aExvZGhhczogc3RyaW5nKSB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhdGhMb2RoYXMpKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICBjb25zdCByZWdleCA9IC9cXFsoWzAtOWEtekEtWl18XFwnfFxcXCIpKlxcXS9nO1xuICAgIHBhdGhMb2RoYXMgPSBwYXRoTG9kaGFzXG4gICAgICAucmVwbGFjZShyZWdleCwgJycpXG4gICAgICAucmVwbGFjZSgnLi4nLCAnLicpO1xuICAgIGlmIChwYXRoTG9kaGFzLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgcGF0aExvZGhhcyA9IHBhdGhMb2RoYXMuc2xpY2UoMSlcbiAgICB9XG4gICAgcmV0dXJuIHBhdGhMb2RoYXM7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRNYXBwaW5nQ2lyYyhqc29uOiBPYmplY3QsIG1hcHBpbmc6IE1hcHBpbmcgPSB7fSwgY2lyY3VsYXI6IENpcmNbXSA9IFtdKSB7XG5cbiAgICBjb25zdCBtYWluQ2xhc3NGbiA9ICFfLmlzQXJyYXkoanNvbikgJiYgQ0xBU1MuZ2V0QnkobWFwcGluZ1snJ10pO1xuXG4gICAgd2Fsay5PYmplY3QoanNvbiwgKHYsIGxvZGFzaFBhdGgsIGNoYW5nZVZhbHVlKSA9PiB7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQodikgJiYgIV8uaXNOdWxsKHYpKSB7XG4gICAgICAgIGNvbnN0IG1hcHBpbmdQYXRoID0gZ2V0TWFwcGluZ1BhdGhGcm9tKGxvZGFzaFBhdGgpXG4gICAgICAgIGlmICghXy5pc1VuZGVmaW5lZChtYXBwaW5nW21hcHBpbmdQYXRoXSkpIHtcbiAgICAgICAgICBjb25zdCBpc0FycmF5ID0gXy5pc0FycmF5KG1hcHBpbmdbbWFwcGluZ1BhdGhdKTtcbiAgICAgICAgICBpZiAoIWlzQXJyYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGlzQXJyYXkgPyBfLmZpcnN0KG1hcHBpbmdbbWFwcGluZ1BhdGhdKSA6IG1hcHBpbmdbbWFwcGluZ1BhdGhdO1xuICAgICAgICAgICAgY29uc3QgY2xhc3NGTiA9IENMQVNTLmdldEJ5KGNsYXNzTmFtZSlcbiAgICAgICAgICAgIGlmIChfLmlzRnVuY3Rpb24oY2xhc3NGTikpIHtcblxuICAgICAgICAgICAgICBjaGFuZ2VWYWx1ZShfLm1lcmdlKG5ldyAoY2xhc3NGTiBhcyBhbnkpKCksIHYpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjaXJjdWxhci5mb3JFYWNoKGMgPT4ge1xuICAgICAgY29uc3QgcmVmID0gXy5nZXQoanNvbiwgYy5jaXJjdXJhbFRhcmdldFBhdGgpXG4gICAgICBfLnNldChqc29uLCBjLnBhdGhUb09iaiwgcmVmKVxuICAgIH0pXG5cbiAgICBpZiAoXy5pc0Z1bmN0aW9uKG1haW5DbGFzc0ZuKSkge1xuICAgICAganNvbiA9IF8ubWVyZ2UobmV3IChtYWluQ2xhc3NGbiBhcyBhbnkpKCksIGpzb24pXG4gICAgfVxuXG4gICAgcmV0dXJuIGpzb247XG4gIH1cblxuXG5cbiAgZnVuY3Rpb24gc2V0TWFwcGluZyhqc29uOiBPYmplY3QsIG1hcHBpbmc6IE1hcHBpbmcgPSB7fSkge1xuXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uKSkge1xuICAgICAgcmV0dXJuIGpzb24ubWFwKGogPT4ge1xuICAgICAgICByZXR1cm4gc2V0TWFwcGluZyhqLCBtYXBwaW5nKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCBtYWluQ2xhc3NGbiA9IENMQVNTLmdldEJ5KG1hcHBpbmdbJyddKTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIGpzb24pIHtcbiAgICAgIGlmIChqc29uLmhhc093blByb3BlcnR5KGtleSkpIHtcblxuXG5cbiAgICAgICAgaWYgKF8uaXNBcnJheShqc29uW2tleV0pKSB7XG4gICAgICAgICAganNvbltrZXldID0ganNvbltrZXldLm1hcChhcnJPYmogPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2JqTWFwcGluZyA9IGdldE1vZGVsc01hcHBpbmcoQ0xBU1MuZ2V0QnkobWFwcGluZ1trZXldKSlcbiAgICAgICAgICAgIHJldHVybiBzZXRNYXBwaW5nKGFyck9iaiwgb2JqTWFwcGluZylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKF8uaXNPYmplY3QoanNvbltrZXldKSkge1xuICAgICAgICAgIGNvbnN0IG9iak1hcHBpbmcgPSBnZXRNb2RlbHNNYXBwaW5nKENMQVNTLmdldEJ5KG1hcHBpbmdba2V5XSkpXG4gICAgICAgICAganNvbltrZXldID0gc2V0TWFwcGluZyhqc29uW2tleV0sIG9iak1hcHBpbmcpXG4gICAgICAgIH1cbiAgICAgIH1cblxuXG5cblxuXG4gICAgfVxuXG4gICAgT2JqZWN0XG4gICAgICAua2V5cyhtYXBwaW5nKVxuICAgICAgLmZpbHRlcihrZXkgPT4ga2V5ICE9PSAnJyAmJiBrZXkuc3BsaXQoJy4nKS5sZW5ndGggPj0gMilcbiAgICAgIC5mb3JFYWNoKGxvZGFzUGF0aCA9PiB7XG5cbiAgICAgICAgY29uc3Qgb2JqTWFwcGluZyA9IGdldE1vZGVsc01hcHBpbmcoQ0xBU1MuZ2V0QnkobWFwcGluZ1tsb2Rhc1BhdGhdKSlcbiAgICAgICAgY29uc3QgaW5wdXQgPSBfLmdldChqc29uLCBsb2Rhc1BhdGgpXG4gICAgICAgIGlmICghXy5pc1VuZGVmaW5lZChpbnB1dCkpIHtcbiAgICAgICAgICBjb25zdCByZXMgPSBzZXRNYXBwaW5nKGlucHV0LCBvYmpNYXBwaW5nKVxuICAgICAgICAgIF8uc2V0KGpzb24sIGxvZGFzUGF0aCwgcmVzKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgaWYgKCFtYWluQ2xhc3NGbikge1xuICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxuICAgIHJldHVybiBfLm1lcmdlKG5ldyAobWFpbkNsYXNzRm4gYXMgYW55KSgpLCBqc29uKVxuICB9XG5cblxuXG5cbiAgZXhwb3J0IHR5cGUgTW9kZWxWYWx1ZTxUPiA9IHtcbiAgICAvKipcbiAgICAgKiBJbnNpZGUgbW9kZWxzIHR5cGVzXG4gICAgICovXG4gICAgW3Byb3BOYW1lIGluIGtleW9mIFRdPzogVFtwcm9wTmFtZV07XG4gIH07XG5cblxuICBleHBvcnQgZnVuY3Rpb24gRGVmYXVsdE1vZGVsV2l0aE1hcHBpbmc8VCA9IE9iamVjdD4oXG4gICAgZGVmYXVsdE1vZGVsVmFsdWVzPzogTW9kZWxWYWx1ZTxUPixcbiAgICBtYXBwaW5nPzogTWFwcGluZzxUPlxuICApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogRnVuY3Rpb24pIHtcblxuICAgICAgaWYgKCFfLmlzQXJyYXkodGFyZ2V0W1NZTUJPTC5NT0RFTFNfTUFQUElOR10pKSB7XG4gICAgICAgIHRhcmdldFtTWU1CT0wuTU9ERUxTX01BUFBJTkddID0gW107XG4gICAgICB9XG5cbiAgICAgICh0YXJnZXRbU1lNQk9MLk1PREVMU19NQVBQSU5HXSBhcyBhbnlbXSkucHVzaCh7ICcnOiBDTEFTUy5nZXROYW1lKHRhcmdldCkgfSk7XG4gICAgICBpZiAoXy5pc09iamVjdChtYXBwaW5nKSkge1xuICAgICAgICB0YXJnZXRbU1lNQk9MLk1PREVMU19NQVBQSU5HXSA9ICh0YXJnZXRbU1lNQk9MLk1PREVMU19NQVBQSU5HXSBhcyBhbnlbXSkuY29uY2F0KG1hcHBpbmcpXG4gICAgICAgIE9iamVjdC5rZXlzKG1hcHBpbmcpXG4gICAgICAgICAgLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBtYXBwaW5nO1xuICAgICAgICAgICAgaWYgKF8uaXNVbmRlZmluZWQodikgfHwgXy5pc0Z1bmN0aW9uKHYpKSB7XG4gICAgICAgICAgICAgIHRocm93IGBcblxuXG4gICAgICAgICAgICBDbGFzczogJyR7dGFyZ2V0Lm5hbWV9J1xuW25nMnJlc3RdIEJhZCBtYXBwaW5nIHZhbHVlIGZvciBwYXRoOiAke2tleX0gLCBwbGVhc2UgdXNlIHR5cGU6IDxzdHJpbmc+IG9yIFs8c3RyaW5nPl1cbmA7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuXG4gICAgICBpZiAoXy5pc09iamVjdChkZWZhdWx0TW9kZWxWYWx1ZXMpKSB7XG4gICAgICAgIGNvbnN0IHRvTWVyZ2UgPSB7fTtcbiAgICAgICAgY29uc3QgZGVzY3JpYmVkVGFyZ2V0ID0gQ0xBU1NcbiAgICAgICAgICAuZGVzY3JpYmVQcm9wZXJpdGVzKHRhcmdldClcbiAgICAgICAgICAuZmlsdGVyKHByb3AgPT4gL14oW2EtekEtWjAtOV18XFxffFxcIykrJC8udGVzdChwcm9wKSlcblxuICAgICAgICBkZXNjcmliZWRUYXJnZXQuZm9yRWFjaChwcm9wRGVmSW5Db25zdHIgPT4ge1xuICAgICAgICAgIGlmIChkZWZhdWx0TW9kZWxWYWx1ZXNbcHJvcERlZkluQ29uc3RyXSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBcblxuICAgICAgICAgICAgQ09ORkxJQ1Q6IGRlZmF1bHQgdmFsdWUgZm9yIHByb3BlcnR5OiBcIiR7cHJvcERlZkluQ29uc3RyfVwiXG4gICAgICAgICAgICBpbiBjbGFzcyBcIiR7dGFyZ2V0Lm5hbWV9XCIgYWxyZWFkeSBkZWZpbmVkIGFzIHR5cGVzY3JpcHRcbiAgICAgICAgICAgIGRlZmF1bHQgY2xhc3MgcHJvcHJ0eSB2YWx1ZS5cblxuICAgICAgICAgICAgYClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdG9NZXJnZVtwcm9wRGVmSW5Db25zdHJdID0gbnVsbDsgLy8gVE9ETyBmcm9tIHRvU3RyaW5nIEkgY2FuJ3Qga25vdyB0aGF0XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG5cbiAgICAgICAgdGFyZ2V0W1NZTUJPTC5ERUZBVUxUX01PREVMXSA9IF8ubWVyZ2UodG9NZXJnZSwgZGVmYXVsdE1vZGVsVmFsdWVzKTtcblxuICAgICAgICBjb25zdCBwcm9wc1RvT21taXQgPSBPYmplY3RcbiAgICAgICAgICAua2V5cyh0YXJnZXRbU1lNQk9MLkRFRkFVTFRfTU9ERUxdKVxuICAgICAgICAgIC5maWx0ZXIoa2V5ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3RcbiAgICAgICAgICAgICAgLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQucHJvdG90eXBlLCBrZXkpO1xuICAgICAgICAgICAgcmV0dXJuICEhZGVzY3JpcHRvcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgXy5tZXJnZSh0YXJnZXQucHJvdG90eXBlLCBfLm9taXQodGFyZ2V0W1NZTUJPTC5ERUZBVUxUX01PREVMXSwgcHJvcHNUb09tbWl0KSk7XG5cblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG59XG5cbiA7KHt9KTsgLy8gQC0tZW5kLW9mLWZpbGUtZm9yLW1vZHVsZT1uZzItcmVzdCBsaWIvbWFwcGluZy50cyJdfQ==