breeze-client 2.1.6 → 2.1.7-mjs
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/LICENSE +1 -1
- package/adapter-ajax-angularjs/{breeze-client-adapter-ajax-angularjs.d.ts → index.d.ts} +1 -0
- package/adapter-ajax-fetch/{breeze-client-adapter-ajax-fetch.d.ts → index.d.ts} +1 -0
- package/adapter-ajax-httpclient/{breeze-client-adapter-ajax-httpclient.d.ts → index.d.ts} +1 -0
- package/adapter-ajax-jquery/{breeze-client-adapter-ajax-jquery.d.ts → index.d.ts} +1 -0
- package/adapter-ajax-post/{breeze-client-adapter-ajax-post.d.ts → index.d.ts} +1 -0
- package/adapter-data-service-odata/{breeze-client-adapter-data-service-odata.d.ts → index.d.ts} +1 -0
- package/adapter-data-service-webapi/{breeze-client-adapter-data-service-webapi.d.ts → index.d.ts} +1 -0
- package/adapter-model-library-backing-store/{breeze-client-adapter-model-library-backing-store.d.ts → index.d.ts} +1 -0
- package/adapter-model-library-ko/{breeze-client-adapter-model-library-ko.d.ts → index.d.ts} +1 -0
- package/adapter-uri-builder-json/{breeze-client-adapter-uri-builder-json.d.ts → index.d.ts} +1 -0
- package/adapter-uri-builder-odata/{breeze-client-adapter-uri-builder-odata.d.ts → index.d.ts} +1 -0
- package/esm2022/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +135 -0
- package/esm2022/adapter-ajax-angularjs/adapter-core.mjs +49 -0
- package/esm2022/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +5 -0
- package/esm2022/adapter-ajax-fetch/adapter-ajax-fetch.mjs +135 -0
- package/esm2022/adapter-ajax-fetch/adapter-core.mjs +49 -0
- package/esm2022/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +5 -0
- package/esm2022/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +139 -0
- package/esm2022/adapter-ajax-httpclient/adapter-core.mjs +49 -0
- package/esm2022/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +5 -0
- package/esm2022/adapter-ajax-jquery/adapter-ajax-jquery.mjs +107 -0
- package/esm2022/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +5 -0
- package/esm2022/adapter-ajax-post/adapter-ajax-post.mjs +77 -0
- package/esm2022/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +5 -0
- package/esm2022/adapter-data-service-odata/adapter-core.mjs +49 -0
- package/{esm5/adapter-data-service-odata/adapter-data-service-odata.js → esm2022/adapter-data-service-odata/adapter-data-service-odata.mjs} +138 -147
- package/esm2022/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +5 -0
- package/esm2022/adapter-data-service-webapi/adapter-data-service-webapi.mjs +100 -0
- package/esm2022/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +5 -0
- package/esm2022/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +269 -0
- package/esm2022/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +5 -0
- package/esm2022/adapter-model-library-ko/adapter-model-library-ko.mjs +241 -0
- package/esm2022/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +5 -0
- package/esm2022/adapter-uri-builder-json/adapter-core.mjs +49 -0
- package/esm2022/adapter-uri-builder-json/adapter-uri-builder-json.mjs +37 -0
- package/esm2022/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +5 -0
- package/esm2022/adapter-uri-builder-odata/adapter-core.mjs +49 -0
- package/esm2022/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +191 -0
- package/esm2022/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +5 -0
- package/esm2022/breeze-client.mjs +5 -0
- package/esm2022/index.mjs +2 -0
- package/esm2022/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +5 -0
- package/esm2022/mixin-get-entity-graph/mixin-get-entity-graph.mjs +269 -0
- package/esm2022/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +5 -0
- package/esm2022/mixin-save-queuing/mixin-save-queuing.mjs +421 -0
- package/esm2022/src/abstract-data-service-adapter.mjs +325 -0
- package/esm2022/src/array.mjs +4 -0
- package/esm2022/src/assert-param.mjs +330 -0
- package/esm2022/src/breeze.mjs +85 -0
- package/esm2022/src/complex-array.mjs +117 -0
- package/esm2022/src/config.mjs +232 -0
- package/esm2022/src/core.mjs +712 -0
- package/esm2022/src/csdl-metadata-parser.mjs +385 -0
- package/esm2022/src/data-service.mjs +239 -0
- package/esm2022/src/data-type.mjs +507 -0
- package/esm2022/src/default-property-interceptor.mjs +460 -0
- package/{esm2015/src/entity-action.js → esm2022/src/entity-action.mjs} +25 -25
- package/esm2022/src/entity-aspect.mjs +897 -0
- package/esm2022/src/entity-group.mjs +192 -0
- package/esm2022/src/entity-key.mjs +127 -0
- package/esm2022/src/entity-manager.mjs +2183 -0
- package/esm2022/src/entity-metadata.mjs +2242 -0
- package/esm2022/src/entity-query.mjs +1024 -0
- package/esm2022/src/entity-state.mjs +107 -0
- package/esm2022/src/enum.mjs +143 -0
- package/esm2022/src/event.mjs +264 -0
- package/esm2022/src/interface-registry.mjs +39 -0
- package/esm2022/src/key-generator.mjs +110 -0
- package/esm2022/src/local-query-comparison-options.mjs +75 -0
- package/esm2022/src/mapping-context.mjs +422 -0
- package/{esm5/src/naming-convention.js → esm2022/src/naming-convention.mjs} +35 -29
- package/esm2022/src/observable-array.mjs +183 -0
- package/esm2022/src/predicate.mjs +1259 -0
- package/esm2022/src/primitive-array.mjs +85 -0
- package/esm2022/src/query-options.mjs +160 -0
- package/esm2022/src/relation-array.mjs +173 -0
- package/esm2022/src/save-options.mjs +51 -0
- package/esm2022/src/unattached-children-map.mjs +56 -0
- package/{esm5/src/validate.js → esm2022/src/validate.mjs} +116 -110
- package/esm2022/src/validation-options.mjs +78 -0
- package/{fesm2015/breeze-client-adapter-ajax-angularjs.js → fesm2022/breeze-client-adapter-ajax-angularjs.mjs} +6 -1
- package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs.map +1 -0
- package/{fesm2015/breeze-client-adapter-ajax-fetch.js → fesm2022/breeze-client-adapter-ajax-fetch.mjs} +9 -4
- package/fesm2022/breeze-client-adapter-ajax-fetch.mjs.map +1 -0
- package/{fesm2015/breeze-client-adapter-ajax-httpclient.js → fesm2022/breeze-client-adapter-ajax-httpclient.mjs} +6 -4
- package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs.map +1 -0
- package/{fesm2015/breeze-client-adapter-ajax-jquery.js → fesm2022/breeze-client-adapter-ajax-jquery.mjs} +6 -2
- package/fesm2022/breeze-client-adapter-ajax-jquery.mjs.map +1 -0
- package/{fesm2015/breeze-client-adapter-ajax-post.js → fesm2022/breeze-client-adapter-ajax-post.mjs} +1 -1
- package/fesm2022/breeze-client-adapter-ajax-post.mjs.map +1 -0
- package/{fesm2015/breeze-client-adapter-data-service-odata.js → fesm2022/breeze-client-adapter-data-service-odata.mjs} +68 -69
- package/fesm2022/breeze-client-adapter-data-service-odata.mjs.map +1 -0
- package/{fesm2015/breeze-client-adapter-data-service-webapi.js → fesm2022/breeze-client-adapter-data-service-webapi.mjs} +30 -30
- package/fesm2022/breeze-client-adapter-data-service-webapi.mjs.map +1 -0
- package/{fesm2015/breeze-client-adapter-model-library-backing-store.js → fesm2022/breeze-client-adapter-model-library-backing-store.mjs} +14 -13
- package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs.map +1 -0
- package/{fesm2015/breeze-client-adapter-model-library-ko.js → fesm2022/breeze-client-adapter-model-library-ko.mjs} +14 -13
- package/fesm2022/breeze-client-adapter-model-library-ko.mjs.map +1 -0
- package/{fesm2015/breeze-client-adapter-uri-builder-json.js → fesm2022/breeze-client-adapter-uri-builder-json.mjs} +9 -8
- package/fesm2022/breeze-client-adapter-uri-builder-json.mjs.map +1 -0
- package/{fesm2015/breeze-client-adapter-uri-builder-odata.js → fesm2022/breeze-client-adapter-uri-builder-odata.mjs} +86 -86
- package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs.map +1 -0
- package/{fesm2015/breeze-client-mixin-get-entity-graph.js → fesm2022/breeze-client-mixin-get-entity-graph.mjs} +1 -1
- package/fesm2022/breeze-client-mixin-get-entity-graph.mjs.map +1 -0
- package/{fesm2015/breeze-client-mixin-save-queuing.js → fesm2022/breeze-client-mixin-save-queuing.mjs} +23 -2
- package/fesm2022/breeze-client-mixin-save-queuing.mjs.map +1 -0
- package/{fesm2015/breeze-client.js → fesm2022/breeze-client.mjs} +2126 -1577
- package/fesm2022/breeze-client.mjs.map +1 -0
- package/mixin-get-entity-graph/{breeze-client-mixin-get-entity-graph.d.ts → index.d.ts} +1 -0
- package/mixin-save-queuing/{breeze-client-mixin-save-queuing.d.ts → index.d.ts} +1 -0
- package/package.json +93 -11
- package/src/abstract-data-service-adapter.d.ts +20 -0
- package/src/config.d.ts +1 -1
- package/src/core.d.ts +1 -1
- package/src/entity-aspect.d.ts +1 -1
- package/src/entity-metadata.d.ts +8 -6
- package/src/entity-query.d.ts +18 -4
- package/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.metadata.json +0 -1
- package/adapter-ajax-angularjs/package.json +0 -13
- package/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.metadata.json +0 -1
- package/adapter-ajax-fetch/package.json +0 -13
- package/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.metadata.json +0 -1
- package/adapter-ajax-httpclient/package.json +0 -13
- package/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.metadata.json +0 -1
- package/adapter-ajax-jquery/package.json +0 -13
- package/adapter-ajax-post/breeze-client-adapter-ajax-post.metadata.json +0 -1
- package/adapter-ajax-post/package.json +0 -13
- package/adapter-data-service-odata/breeze-client-adapter-data-service-odata.metadata.json +0 -1
- package/adapter-data-service-odata/package.json +0 -13
- package/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.metadata.json +0 -1
- package/adapter-data-service-webapi/package.json +0 -13
- package/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.metadata.json +0 -1
- package/adapter-model-library-backing-store/package.json +0 -13
- package/adapter-model-library-ko/breeze-client-adapter-model-library-ko.metadata.json +0 -1
- package/adapter-model-library-ko/package.json +0 -13
- package/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.metadata.json +0 -1
- package/adapter-uri-builder-json/package.json +0 -13
- package/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.metadata.json +0 -1
- package/adapter-uri-builder-odata/package.json +0 -13
- package/breeze-client.d.ts +0 -8
- package/breeze-client.metadata.json +0 -1
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.js +0 -190
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-fetch.umd.js +0 -190
- package/bundles/breeze-client-adapter-ajax-fetch.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.js +0 -195
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-jquery.umd.js +0 -115
- package/bundles/breeze-client-adapter-ajax-jquery.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-post.umd.js +0 -92
- package/bundles/breeze-client-adapter-ajax-post.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-ajax-post.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-ajax-post.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-data-service-odata.umd.js +0 -747
- package/bundles/breeze-client-adapter-data-service-odata.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-data-service-odata.umd.min.js +0 -16
- package/bundles/breeze-client-adapter-data-service-odata.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-data-service-webapi.umd.js +0 -333
- package/bundles/breeze-client-adapter-data-service-webapi.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js +0 -16
- package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.js +0 -280
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-model-library-ko.umd.js +0 -252
- package/bundles/breeze-client-adapter-model-library-ko.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-model-library-ko.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-model-library-ko.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-uri-builder-json.umd.js +0 -96
- package/bundles/breeze-client-adapter-uri-builder-json.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js.map +0 -1
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.js +0 -262
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.js.map +0 -1
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js +0 -2
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js.map +0 -1
- package/bundles/breeze-client-mixin-get-entity-graph.umd.js +0 -258
- package/bundles/breeze-client-mixin-get-entity-graph.umd.js.map +0 -1
- package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js +0 -2
- package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js.map +0 -1
- package/bundles/breeze-client-mixin-save-queuing.umd.js +0 -579
- package/bundles/breeze-client-mixin-save-queuing.umd.js.map +0 -1
- package/bundles/breeze-client-mixin-save-queuing.umd.min.js +0 -16
- package/bundles/breeze-client-mixin-save-queuing.umd.min.js.map +0 -1
- package/bundles/breeze-client.umd.js +0 -14181
- package/bundles/breeze-client.umd.js.map +0 -1
- package/bundles/breeze-client.umd.min.js +0 -16
- package/bundles/breeze-client.umd.min.js.map +0 -1
- package/esm2015/adapter-ajax-angularjs/adapter-ajax-angularjs.js +0 -130
- package/esm2015/adapter-ajax-angularjs/adapter-core.js +0 -49
- package/esm2015/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +0 -5
- package/esm2015/adapter-ajax-fetch/adapter-ajax-fetch.js +0 -130
- package/esm2015/adapter-ajax-fetch/adapter-core.js +0 -49
- package/esm2015/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +0 -5
- package/esm2015/adapter-ajax-httpclient/adapter-ajax-httpclient.js +0 -137
- package/esm2015/adapter-ajax-httpclient/adapter-core.js +0 -49
- package/esm2015/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +0 -5
- package/esm2015/adapter-ajax-jquery/adapter-ajax-jquery.js +0 -103
- package/esm2015/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +0 -5
- package/esm2015/adapter-ajax-post/adapter-ajax-post.js +0 -77
- package/esm2015/adapter-ajax-post/breeze-client-adapter-ajax-post.js +0 -5
- package/esm2015/adapter-data-service-odata/adapter-core.js +0 -49
- package/esm2015/adapter-data-service-odata/adapter-data-service-odata.js +0 -463
- package/esm2015/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +0 -5
- package/esm2015/adapter-data-service-webapi/adapter-data-service-webapi.js +0 -100
- package/esm2015/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +0 -5
- package/esm2015/adapter-model-library-backing-store/adapter-model-library-backing-store.js +0 -268
- package/esm2015/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +0 -5
- package/esm2015/adapter-model-library-ko/adapter-model-library-ko.js +0 -240
- package/esm2015/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +0 -5
- package/esm2015/adapter-uri-builder-json/adapter-core.js +0 -49
- package/esm2015/adapter-uri-builder-json/adapter-uri-builder-json.js +0 -36
- package/esm2015/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +0 -5
- package/esm2015/adapter-uri-builder-odata/adapter-core.js +0 -49
- package/esm2015/adapter-uri-builder-odata/adapter-uri-builder-odata.js +0 -192
- package/esm2015/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +0 -5
- package/esm2015/breeze-client.js +0 -9
- package/esm2015/index.js +0 -2
- package/esm2015/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +0 -5
- package/esm2015/mixin-get-entity-graph/mixin-get-entity-graph.js +0 -269
- package/esm2015/mixin-save-queuing/breeze-client-mixin-save-queuing.js +0 -5
- package/esm2015/mixin-save-queuing/mixin-save-queuing.js +0 -400
- package/esm2015/src/abstract-data-service-adapter.js +0 -296
- package/esm2015/src/array.js +0 -4
- package/esm2015/src/assert-param.js +0 -312
- package/esm2015/src/breeze.js +0 -85
- package/esm2015/src/complex-array.js +0 -119
- package/esm2015/src/config.js +0 -223
- package/esm2015/src/core.js +0 -714
- package/esm2015/src/csdl-metadata-parser.js +0 -385
- package/esm2015/src/data-service.js +0 -203
- package/esm2015/src/data-type.js +0 -503
- package/esm2015/src/default-property-interceptor.js +0 -460
- package/esm2015/src/entity-aspect.js +0 -804
- package/esm2015/src/entity-group.js +0 -187
- package/esm2015/src/entity-key.js +0 -116
- package/esm2015/src/entity-manager.js +0 -2094
- package/esm2015/src/entity-metadata.js +0 -2109
- package/esm2015/src/entity-query.js +0 -996
- package/esm2015/src/entity-state.js +0 -107
- package/esm2015/src/enum.js +0 -141
- package/esm2015/src/event.js +0 -256
- package/esm2015/src/interface-registry.js +0 -41
- package/esm2015/src/key-generator.js +0 -108
- package/esm2015/src/local-query-comparison-options.js +0 -65
- package/esm2015/src/mapping-context.js +0 -411
- package/esm2015/src/naming-convention.js +0 -88
- package/esm2015/src/observable-array.js +0 -185
- package/esm2015/src/predicate.js +0 -1242
- package/esm2015/src/primitive-array.js +0 -87
- package/esm2015/src/query-options.js +0 -152
- package/esm2015/src/relation-array.js +0 -175
- package/esm2015/src/save-options.js +0 -41
- package/esm2015/src/unattached-children-map.js +0 -58
- package/esm2015/src/validate.js +0 -991
- package/esm2015/src/validation-options.js +0 -64
- package/esm5/adapter-ajax-angularjs/adapter-ajax-angularjs.js +0 -132
- package/esm5/adapter-ajax-angularjs/adapter-core.js +0 -49
- package/esm5/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +0 -5
- package/esm5/adapter-ajax-fetch/adapter-ajax-fetch.js +0 -132
- package/esm5/adapter-ajax-fetch/adapter-core.js +0 -49
- package/esm5/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +0 -5
- package/esm5/adapter-ajax-httpclient/adapter-ajax-httpclient.js +0 -139
- package/esm5/adapter-ajax-httpclient/adapter-core.js +0 -49
- package/esm5/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +0 -5
- package/esm5/adapter-ajax-jquery/adapter-ajax-jquery.js +0 -105
- package/esm5/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +0 -5
- package/esm5/adapter-ajax-post/adapter-ajax-post.js +0 -81
- package/esm5/adapter-ajax-post/breeze-client-adapter-ajax-post.js +0 -5
- package/esm5/adapter-data-service-odata/adapter-core.js +0 -49
- package/esm5/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +0 -5
- package/esm5/adapter-data-service-webapi/adapter-data-service-webapi.js +0 -105
- package/esm5/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +0 -5
- package/esm5/adapter-model-library-backing-store/adapter-model-library-backing-store.js +0 -270
- package/esm5/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +0 -5
- package/esm5/adapter-model-library-ko/adapter-model-library-ko.js +0 -242
- package/esm5/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +0 -5
- package/esm5/adapter-uri-builder-json/adapter-core.js +0 -49
- package/esm5/adapter-uri-builder-json/adapter-uri-builder-json.js +0 -38
- package/esm5/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +0 -5
- package/esm5/adapter-uri-builder-odata/adapter-core.js +0 -49
- package/esm5/adapter-uri-builder-odata/adapter-uri-builder-odata.js +0 -197
- package/esm5/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +0 -5
- package/esm5/breeze-client.js +0 -9
- package/esm5/index.js +0 -2
- package/esm5/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +0 -5
- package/esm5/mixin-get-entity-graph/mixin-get-entity-graph.js +0 -269
- package/esm5/mixin-save-queuing/breeze-client-mixin-save-queuing.js +0 -5
- package/esm5/mixin-save-queuing/mixin-save-queuing.js +0 -412
- package/esm5/src/abstract-data-service-adapter.js +0 -302
- package/esm5/src/array.js +0 -4
- package/esm5/src/assert-param.js +0 -317
- package/esm5/src/breeze.js +0 -85
- package/esm5/src/complex-array.js +0 -119
- package/esm5/src/config.js +0 -228
- package/esm5/src/core.js +0 -722
- package/esm5/src/csdl-metadata-parser.js +0 -385
- package/esm5/src/data-service.js +0 -207
- package/esm5/src/data-type.js +0 -510
- package/esm5/src/default-property-interceptor.js +0 -460
- package/esm5/src/entity-action.js +0 -52
- package/esm5/src/entity-aspect.js +0 -810
- package/esm5/src/entity-group.js +0 -189
- package/esm5/src/entity-key.js +0 -118
- package/esm5/src/entity-manager.js +0 -2112
- package/esm5/src/entity-metadata.js +0 -2144
- package/esm5/src/entity-query.js +0 -1023
- package/esm5/src/entity-state.js +0 -114
- package/esm5/src/enum.js +0 -144
- package/esm5/src/event.js +0 -259
- package/esm5/src/interface-registry.js +0 -43
- package/esm5/src/key-generator.js +0 -111
- package/esm5/src/local-query-comparison-options.js +0 -67
- package/esm5/src/mapping-context.js +0 -413
- package/esm5/src/observable-array.js +0 -201
- package/esm5/src/predicate.js +0 -1307
- package/esm5/src/primitive-array.js +0 -87
- package/esm5/src/query-options.js +0 -167
- package/esm5/src/relation-array.js +0 -175
- package/esm5/src/save-options.js +0 -43
- package/esm5/src/unattached-children-map.js +0 -60
- package/esm5/src/validation-options.js +0 -66
- package/fesm2015/breeze-client-adapter-ajax-angularjs.js.map +0 -1
- package/fesm2015/breeze-client-adapter-ajax-fetch.js.map +0 -1
- package/fesm2015/breeze-client-adapter-ajax-httpclient.js.map +0 -1
- package/fesm2015/breeze-client-adapter-ajax-jquery.js.map +0 -1
- package/fesm2015/breeze-client-adapter-ajax-post.js.map +0 -1
- package/fesm2015/breeze-client-adapter-data-service-odata.js.map +0 -1
- package/fesm2015/breeze-client-adapter-data-service-webapi.js.map +0 -1
- package/fesm2015/breeze-client-adapter-model-library-backing-store.js.map +0 -1
- package/fesm2015/breeze-client-adapter-model-library-ko.js.map +0 -1
- package/fesm2015/breeze-client-adapter-uri-builder-json.js.map +0 -1
- package/fesm2015/breeze-client-adapter-uri-builder-odata.js.map +0 -1
- package/fesm2015/breeze-client-mixin-get-entity-graph.js.map +0 -1
- package/fesm2015/breeze-client-mixin-save-queuing.js.map +0 -1
- package/fesm2015/breeze-client.js.map +0 -1
- package/fesm5/breeze-client-adapter-ajax-angularjs.js +0 -186
- package/fesm5/breeze-client-adapter-ajax-angularjs.js.map +0 -1
- package/fesm5/breeze-client-adapter-ajax-fetch.js +0 -186
- package/fesm5/breeze-client-adapter-ajax-fetch.js.map +0 -1
- package/fesm5/breeze-client-adapter-ajax-httpclient.js +0 -193
- package/fesm5/breeze-client-adapter-ajax-httpclient.js.map +0 -1
- package/fesm5/breeze-client-adapter-ajax-jquery.js +0 -111
- package/fesm5/breeze-client-adapter-ajax-jquery.js.map +0 -1
- package/fesm5/breeze-client-adapter-ajax-post.js +0 -86
- package/fesm5/breeze-client-adapter-ajax-post.js.map +0 -1
- package/fesm5/breeze-client-adapter-data-service-odata.js +0 -523
- package/fesm5/breeze-client-adapter-data-service-odata.js.map +0 -1
- package/fesm5/breeze-client-adapter-data-service-webapi.js +0 -111
- package/fesm5/breeze-client-adapter-data-service-webapi.js.map +0 -1
- package/fesm5/breeze-client-adapter-model-library-backing-store.js +0 -276
- package/fesm5/breeze-client-adapter-model-library-backing-store.js.map +0 -1
- package/fesm5/breeze-client-adapter-model-library-ko.js +0 -248
- package/fesm5/breeze-client-adapter-model-library-ko.js.map +0 -1
- package/fesm5/breeze-client-adapter-uri-builder-json.js +0 -92
- package/fesm5/breeze-client-adapter-uri-builder-json.js.map +0 -1
- package/fesm5/breeze-client-adapter-uri-builder-odata.js +0 -250
- package/fesm5/breeze-client-adapter-uri-builder-odata.js.map +0 -1
- package/fesm5/breeze-client-mixin-get-entity-graph.js +0 -254
- package/fesm5/breeze-client-mixin-get-entity-graph.js.map +0 -1
- package/fesm5/breeze-client-mixin-save-queuing.js +0 -356
- package/fesm5/breeze-client-mixin-save-queuing.js.map +0 -1
- package/fesm5/breeze-client.js +0 -13903
- package/fesm5/breeze-client.js.map +0 -1
- package/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.metadata.json +0 -1
- package/mixin-get-entity-graph/package.json +0 -13
- package/mixin-save-queuing/breeze-client-mixin-save-queuing.metadata.json +0 -1
- package/mixin-save-queuing/package.json +0 -13
|
@@ -1,412 +0,0 @@
|
|
|
1
|
-
import { __extends } from "tslib";
|
|
2
|
-
//#region Copyright, Version, and Description
|
|
3
|
-
/*
|
|
4
|
-
* Copyright 2015-2021 IdeaBlade, Inc. All Rights Reserved.
|
|
5
|
-
* Use, reproduction, distribution, and modification of this code is subject to the terms and
|
|
6
|
-
* conditions of the IdeaBlade Breeze license, available at http://www.breezejs.com/license
|
|
7
|
-
*
|
|
8
|
-
* Author: Ward Bell
|
|
9
|
-
* Version: 2.0.6 Steve Schmitt - convert to TypeScript, move to breeze-client repo, change enableSaveQueuing function
|
|
10
|
-
* Version: 2.0.5 Ward Bell
|
|
11
|
-
* --------------------------------------------------------------------------------
|
|
12
|
-
* Adds "Save Queuing" capability to new EntityManagers
|
|
13
|
-
*
|
|
14
|
-
* Save Queuing automatically queues and defers an EntityManager.saveChanges call
|
|
15
|
-
* when another save is in progress for that manager and the server has not yet responded.
|
|
16
|
-
* This feature is helpful when your app needs to allow rapid, continuous changes
|
|
17
|
-
* to entities that may be in the process of being saved.
|
|
18
|
-
*
|
|
19
|
-
* Without "Save Queuing", an EntityManager will throw an exception
|
|
20
|
-
* when you call saveChanges for an entity which is currently being saved.
|
|
21
|
-
*
|
|
22
|
-
* !!! Use with caution !!!
|
|
23
|
-
* It is usually better to disable user input while a save is in progress.
|
|
24
|
-
* Save Queuing may be appropriate for simple "auto-save" scenarios
|
|
25
|
-
* when the save latency is "short" (under a few seconds).
|
|
26
|
-
*
|
|
27
|
-
* Save Queuing is NOT intended for occassionally disconnected or offline scenarios.
|
|
28
|
-
*
|
|
29
|
-
* Save Queuing is experimental. It will not become a part of BreezeJS core
|
|
30
|
-
* but might become an official Breeze plugin in future
|
|
31
|
-
* although not necessarily in this form or with this API
|
|
32
|
-
*
|
|
33
|
-
* Must call EntityManager.enableSaveQueuing(true) to turn it on;
|
|
34
|
-
* EntityManager.enableSaveQueuing(false) restores the manager's original
|
|
35
|
-
* saveChanges method as it was at the time saveQueuing was first enabled.
|
|
36
|
-
*
|
|
37
|
-
* This module adds "enableSaveQueuing" to the EntityManager prototype.
|
|
38
|
-
* Calling "enableSaveQueuing(true)" adds a new _saveQueuing object
|
|
39
|
-
* to the manager instance.
|
|
40
|
-
*
|
|
41
|
-
* See DocCode:saveQueuingTests.js
|
|
42
|
-
* https://github.com/Breeze/breeze.js.samples/blob/master/net/DocCode/DocCode/tests/saveQueuingTests.js
|
|
43
|
-
*
|
|
44
|
-
* LIMITATIONS
|
|
45
|
-
* - Can't handle changes to the primary key (dangerous in any case)
|
|
46
|
-
* - Assumes promises. Does not support the (deprecated) success and fail callbacks
|
|
47
|
-
* - Does not queue saveOptions. The first one is re-used for all queued saves.
|
|
48
|
-
* - Does not deal with export/import of entities while save is inflight
|
|
49
|
-
* - Does not deal with rejectChanges while save is in flight
|
|
50
|
-
* - Does not support parallel saves even when the change-sets are independent.
|
|
51
|
-
* The native saveChanges allows such saves.
|
|
52
|
-
* SaveQueuing does not; too complex and doesn't fit the primary scenario anyway.
|
|
53
|
-
* - The resolved saveResult is the saveResult of the last completed save
|
|
54
|
-
* - A queued save that might have succeeded if saved immediately
|
|
55
|
-
* may fail because the server no longer accepts it later
|
|
56
|
-
* - Prior to Breeze v.1.5.3, a queued save that might have succeeded
|
|
57
|
-
* if saved immediately will fail if subsequently attempt to save
|
|
58
|
-
* an invalid entity. Can detect and circumvent after v.1.5.3.
|
|
59
|
-
*
|
|
60
|
-
* All members of EntityManager._saveQueuing are internal;
|
|
61
|
-
* touch them at your own risk.
|
|
62
|
-
*/
|
|
63
|
-
//#endregion
|
|
64
|
-
import { EntityState, breeze } from 'breeze-client';
|
|
65
|
-
export function enableSaveQueuing(em, enable) {
|
|
66
|
-
if (enable === void 0) { enable = true; }
|
|
67
|
-
var saveQueuing = em['_saveQueueing'] ||
|
|
68
|
-
(em['_saveQueuing'] = new SaveQueuing(em));
|
|
69
|
-
enable = (enable === undefined) ? true : enable;
|
|
70
|
-
saveQueuing._isEnabled = enable;
|
|
71
|
-
if (enable) {
|
|
72
|
-
// delegate to save changes queuing
|
|
73
|
-
em.saveChanges = saveChangesWithQueuing;
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
// revert to the native EntityManager.saveChanges
|
|
77
|
-
em.saveChanges = em['_saveQueuing'].baseSaveChanges;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Replacement for EntityManager.saveChanges
|
|
82
|
-
* This version queues saveChanges calls while a real save is in progress
|
|
83
|
-
**/
|
|
84
|
-
function saveChangesWithQueuing(entities, saveOptions) {
|
|
85
|
-
try {
|
|
86
|
-
// `this` is an EntityManager
|
|
87
|
-
var saveQueuing = this._saveQueuing;
|
|
88
|
-
if (saveQueuing.isSaving) {
|
|
89
|
-
// save in progress; queue the save for later
|
|
90
|
-
return saveQueuing.queueSaveChanges(entities);
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
// note that save is in progress; then save
|
|
94
|
-
saveQueuing.isSaving = true;
|
|
95
|
-
saveQueuing.saveOptions = saveOptions;
|
|
96
|
-
return saveQueuing.saveChanges(entities, saveOptions);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
catch (err) {
|
|
100
|
-
return Promise.reject(err);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
///////// SaveQueuing /////////
|
|
104
|
-
var SaveQueuing = /** @class */ (function () {
|
|
105
|
-
function SaveQueuing(entityManager) {
|
|
106
|
-
this.entityManager = entityManager;
|
|
107
|
-
this.baseSaveChanges = entityManager.saveChanges;
|
|
108
|
-
this.isSaving = false;
|
|
109
|
-
}
|
|
110
|
-
SaveQueuing.prototype.isEnabled = function () {
|
|
111
|
-
return this._isEnabled;
|
|
112
|
-
};
|
|
113
|
-
SaveQueuing.prototype.getSavedNothingResult = function () {
|
|
114
|
-
return { entities: [], keyMappings: [] };
|
|
115
|
-
};
|
|
116
|
-
SaveQueuing.prototype.queueSaveChanges = function (entities) {
|
|
117
|
-
var self = this; // `this` is a SaveQueuing
|
|
118
|
-
var em = self.entityManager;
|
|
119
|
-
var changes = entities || em.getChanges();
|
|
120
|
-
if (changes.length === 0) {
|
|
121
|
-
return Promise.resolve(this.getSavedNothingResult());
|
|
122
|
-
}
|
|
123
|
-
var valError = em.saveChangesValidateOnClient(changes);
|
|
124
|
-
if (valError) {
|
|
125
|
-
return Promise.reject(valError);
|
|
126
|
-
}
|
|
127
|
-
var saveMemo = self.nextSaveMemo || (self.nextSaveMemo = new SaveMemo());
|
|
128
|
-
memoizeChanges();
|
|
129
|
-
var deferred = self.nextSaveDeferred || (self.nextSaveDeferred = new Deferred());
|
|
130
|
-
return deferred.promise;
|
|
131
|
-
function memoizeChanges() {
|
|
132
|
-
if (changes.length === 0) {
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
var queuedChanges = saveMemo.queuedChanges;
|
|
136
|
-
changes.forEach(function (e) {
|
|
137
|
-
if (!e.entityAspect.isBeingSaved && queuedChanges.indexOf(e) === -1) {
|
|
138
|
-
queuedChanges.push(e);
|
|
139
|
-
}
|
|
140
|
-
});
|
|
141
|
-
saveMemo.updateEntityMemos(changes);
|
|
142
|
-
}
|
|
143
|
-
};
|
|
144
|
-
SaveQueuing.prototype.saveChanges = function (entities, saveOptions) {
|
|
145
|
-
var self = this; // `this` is a SaveQueuing
|
|
146
|
-
var promise = self.baseSaveChanges.call(self.entityManager, entities, saveOptions || self.saveOptions)
|
|
147
|
-
.then(function (saveResult) { return self.saveSucceeded(saveResult); })
|
|
148
|
-
.then(null, function (error) { console.log(error); return self.saveFailed(error); });
|
|
149
|
-
rememberAddedOriginalValues(entities); // do it after ... so don't send OrigValues to the server
|
|
150
|
-
return promise;
|
|
151
|
-
function rememberAddedOriginalValues(entities) {
|
|
152
|
-
// added entities normally don't have original values but these will now
|
|
153
|
-
var added = entities ?
|
|
154
|
-
entities.filter(function (e) { return e.entityAspect.entityState.isAdded(); }) :
|
|
155
|
-
self.entityManager.getEntities(null, EntityState.Added);
|
|
156
|
-
added.forEach(function (entity) {
|
|
157
|
-
var props = entity.entityType.dataProperties;
|
|
158
|
-
var originalValues = entity.entityAspect.originalValues;
|
|
159
|
-
props.forEach(function (dp) {
|
|
160
|
-
if (dp.isPartOfKey) {
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
originalValues[dp.name] = entity.getProperty(dp.name);
|
|
164
|
-
});
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
};
|
|
168
|
-
SaveQueuing.prototype.saveSucceeded = function (saveResult) {
|
|
169
|
-
var self = this; // `this` is a SaveQueueing
|
|
170
|
-
var activeSaveDeferred = self.activeSaveDeferred;
|
|
171
|
-
var nextSaveDeferred = self.nextSaveDeferred;
|
|
172
|
-
var nextSaveMemo = self.nextSaveMemo;
|
|
173
|
-
// prepare as if nothing queued or left to save
|
|
174
|
-
self.isSaving = false;
|
|
175
|
-
self.activeSaveDeferred = null;
|
|
176
|
-
self.activeSaveMemo = null;
|
|
177
|
-
self.nextSaveDeferred = null;
|
|
178
|
-
self.nextSaveMemo = null;
|
|
179
|
-
if (nextSaveMemo) {
|
|
180
|
-
// a save was queued since last save returned
|
|
181
|
-
nextSaveMemo.pkFixup(saveResult.keyMappings);
|
|
182
|
-
nextSaveMemo.applyToSavedEntities(self.entityManager, saveResult.entities);
|
|
183
|
-
// remove detached entities from queuedChanges
|
|
184
|
-
var queuedChanges = nextSaveMemo.queuedChanges.filter(function (e) {
|
|
185
|
-
return !e.entityAspect.entityState.isDetached();
|
|
186
|
-
});
|
|
187
|
-
if (queuedChanges.length > 0) {
|
|
188
|
-
// save again
|
|
189
|
-
self.isSaving = true;
|
|
190
|
-
// remember the queued changes that triggered this save
|
|
191
|
-
self.activeSaveDeferred = nextSaveDeferred;
|
|
192
|
-
self.activeSaveMemo = nextSaveMemo;
|
|
193
|
-
self.saveChanges(queuedChanges, this.saveOptions);
|
|
194
|
-
}
|
|
195
|
-
else if (nextSaveDeferred) {
|
|
196
|
-
nextSaveDeferred.resolve(this.getSavedNothingResult());
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
if (activeSaveDeferred) {
|
|
200
|
-
activeSaveDeferred.resolve(saveResult);
|
|
201
|
-
}
|
|
202
|
-
return saveResult; // for the current promise chain
|
|
203
|
-
};
|
|
204
|
-
SaveQueuing.prototype.saveFailed = function (error) {
|
|
205
|
-
var self = this; // `this` is a SaveQueueing
|
|
206
|
-
error = new QueuedSaveFailedError(error, self);
|
|
207
|
-
var activeSaveDeferred = self.activeSaveDeferred;
|
|
208
|
-
var nextSaveDeferred = self.nextSaveDeferred;
|
|
209
|
-
self.isSaving = false;
|
|
210
|
-
self.activeSaveDeferred = null;
|
|
211
|
-
self.activeSaveMemo = null;
|
|
212
|
-
self.nextSaveDeferred = null;
|
|
213
|
-
self.nextSaveMemo = null;
|
|
214
|
-
if (activeSaveDeferred) {
|
|
215
|
-
activeSaveDeferred.reject(error);
|
|
216
|
-
}
|
|
217
|
-
if (nextSaveDeferred) {
|
|
218
|
-
nextSaveDeferred.reject(error);
|
|
219
|
-
}
|
|
220
|
-
return Promise.reject(error); // let promise chain hear error
|
|
221
|
-
};
|
|
222
|
-
return SaveQueuing;
|
|
223
|
-
}());
|
|
224
|
-
/// for backward compat with older Promise implementation
|
|
225
|
-
var Deferred = /** @class */ (function () {
|
|
226
|
-
function Deferred() {
|
|
227
|
-
this.promise = new Promise(function (resolve, reject) {
|
|
228
|
-
this.resolve = resolve;
|
|
229
|
-
this.reject = reject;
|
|
230
|
-
}.bind(this));
|
|
231
|
-
}
|
|
232
|
-
return Deferred;
|
|
233
|
-
}());
|
|
234
|
-
////////// QueuedSaveFailedError /////////
|
|
235
|
-
// Error sub-class thrown when rejecting queued saves.
|
|
236
|
-
var QueuedSaveFailedError = /** @class */ (function (_super) {
|
|
237
|
-
__extends(QueuedSaveFailedError, _super);
|
|
238
|
-
// Error sub-class thrown when rejecting queued saves.
|
|
239
|
-
// `innerError` is the actual save error
|
|
240
|
-
// `failedSaveMemo` is the saveMemo that prompted this save
|
|
241
|
-
// `nextSaveMemo` holds queued changes accumulated since that save.
|
|
242
|
-
// You may try to recover using this info. Good luck with that.
|
|
243
|
-
function QueuedSaveFailedError(errObject, saveQueuing) {
|
|
244
|
-
var _this = _super.call(this) || this;
|
|
245
|
-
_this.name = "QueuedSaveFailedError";
|
|
246
|
-
_this.innerError = errObject;
|
|
247
|
-
_this.message = "Queued save failed: " + errObject.message;
|
|
248
|
-
_this.failedSaveMemo = saveQueuing.activeSaveMemo;
|
|
249
|
-
_this.nextSaveMemo = saveQueuing.nextSaveMemo;
|
|
250
|
-
return _this;
|
|
251
|
-
}
|
|
252
|
-
return QueuedSaveFailedError;
|
|
253
|
-
}(Error));
|
|
254
|
-
export { QueuedSaveFailedError };
|
|
255
|
-
////////// SaveMemo ////////////////
|
|
256
|
-
// SaveMemo is a record of changes for a queued save, consisting of:
|
|
257
|
-
// entityMemos: info about entities that are being saved and
|
|
258
|
-
// have been changed since the save started
|
|
259
|
-
// queuedChanges: entities that are queued for save but
|
|
260
|
-
// are not currently being saved
|
|
261
|
-
var SaveMemo = /** @class */ (function () {
|
|
262
|
-
function SaveMemo() {
|
|
263
|
-
this.entityMemos = {};
|
|
264
|
-
this.queuedChanges = [];
|
|
265
|
-
}
|
|
266
|
-
SaveMemo.prototype.applyToSavedEntities = function (entityManager, savedEntities) {
|
|
267
|
-
var _this = this;
|
|
268
|
-
var entityMemos = this.entityMemos; // `this` is a SaveMemo
|
|
269
|
-
var queuedChanges = this.queuedChanges;
|
|
270
|
-
var restorePublishing = this.disableManagerPublishing(entityManager);
|
|
271
|
-
try {
|
|
272
|
-
savedEntities.forEach(function (saved) {
|
|
273
|
-
var key = _this.makeEntityMemoKey(saved);
|
|
274
|
-
var entityMemo = entityMemos[key];
|
|
275
|
-
var resave = entityMemo && entityMemo.applyToSavedEntity(saved);
|
|
276
|
-
if (resave) {
|
|
277
|
-
queuedChanges.push(saved);
|
|
278
|
-
}
|
|
279
|
-
});
|
|
280
|
-
}
|
|
281
|
-
finally {
|
|
282
|
-
restorePublishing();
|
|
283
|
-
// D#2651 hasChanges will be wrong if changes made while save in progress
|
|
284
|
-
var hasChanges = queuedChanges.length > 0;
|
|
285
|
-
// Must use breeze internal method to properly set this flag true
|
|
286
|
-
if (hasChanges) {
|
|
287
|
-
entityManager._setHasChanges(true);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
};
|
|
291
|
-
SaveMemo.prototype.disableManagerPublishing = function (manager) {
|
|
292
|
-
var Event = breeze.Event;
|
|
293
|
-
Event.enable('entityChanged', manager, false);
|
|
294
|
-
Event.enable('hasChangesChanged', manager, false);
|
|
295
|
-
return function restorePublishing() {
|
|
296
|
-
Event.enable('entityChanged', manager, true);
|
|
297
|
-
Event.enable('hasChangesChanged', manager, true);
|
|
298
|
-
};
|
|
299
|
-
};
|
|
300
|
-
SaveMemo.prototype.pkFixup = function (keyMappings) {
|
|
301
|
-
var entityMemos = this.entityMemos; // `this` is a SaveMemo
|
|
302
|
-
keyMappings.forEach(function (km) {
|
|
303
|
-
var type = km.entityTypeName;
|
|
304
|
-
var tempKey = type + '|' + km.tempValue;
|
|
305
|
-
if (entityMemos[tempKey]) {
|
|
306
|
-
entityMemos[type + '|' + km.realValue] = entityMemos[tempKey];
|
|
307
|
-
delete entityMemos[tempKey];
|
|
308
|
-
}
|
|
309
|
-
for (var memoKey in entityMemos) {
|
|
310
|
-
entityMemos[memoKey].fkFixup(km);
|
|
311
|
-
}
|
|
312
|
-
});
|
|
313
|
-
};
|
|
314
|
-
SaveMemo.prototype.makeEntityMemoKey = function (entity) {
|
|
315
|
-
var entityKey = entity.entityAspect.getKey();
|
|
316
|
-
return entityKey.entityType.name + '|' + entityKey.values;
|
|
317
|
-
};
|
|
318
|
-
SaveMemo.prototype.updateEntityMemos = function (changes) {
|
|
319
|
-
var _this = this;
|
|
320
|
-
var entityMemos = this.entityMemos; // `this` is a SaveMemo
|
|
321
|
-
changes.forEach(function (change) {
|
|
322
|
-
// only update entityMemo for entity being save
|
|
323
|
-
if (!change.entityAspect.isBeingSaved) {
|
|
324
|
-
return;
|
|
325
|
-
}
|
|
326
|
-
var key = _this.makeEntityMemoKey(change);
|
|
327
|
-
var entityMemo = entityMemos[key] || (entityMemos[key] = new EntityMemo(change));
|
|
328
|
-
entityMemo.update();
|
|
329
|
-
});
|
|
330
|
-
};
|
|
331
|
-
return SaveMemo;
|
|
332
|
-
}());
|
|
333
|
-
///////// EntityMemo Type ///////////////
|
|
334
|
-
// Information about an entity that is being saved
|
|
335
|
-
// and which has been changed since that save started
|
|
336
|
-
var EntityMemo = /** @class */ (function () {
|
|
337
|
-
function EntityMemo(entity) {
|
|
338
|
-
this.entity = entity;
|
|
339
|
-
this.pendingChanges = {};
|
|
340
|
-
}
|
|
341
|
-
EntityMemo.prototype.applyToSavedEntity = function (saved) {
|
|
342
|
-
var entityMemo = this;
|
|
343
|
-
var aspect = saved.entityAspect;
|
|
344
|
-
if (aspect.entityState.isDetached()) {
|
|
345
|
-
return false;
|
|
346
|
-
}
|
|
347
|
-
else if (entityMemo.isDeleted) {
|
|
348
|
-
aspect.setDeleted();
|
|
349
|
-
return true;
|
|
350
|
-
}
|
|
351
|
-
// treat entity with pending changes as modified
|
|
352
|
-
var props = Object.keys(entityMemo.pendingChanges);
|
|
353
|
-
if (props.length === 0) {
|
|
354
|
-
return false;
|
|
355
|
-
}
|
|
356
|
-
var originalValues = aspect.originalValues;
|
|
357
|
-
props.forEach(function (name) {
|
|
358
|
-
originalValues[name] = saved.getProperty(name);
|
|
359
|
-
saved.setProperty(name, entityMemo.pendingChanges[name]);
|
|
360
|
-
});
|
|
361
|
-
aspect.setModified();
|
|
362
|
-
return true;
|
|
363
|
-
};
|
|
364
|
-
EntityMemo.prototype.fkFixup = function (keyMapping) {
|
|
365
|
-
var entityMemo = this;
|
|
366
|
-
var type = entityMemo.entity.entityType;
|
|
367
|
-
var fkProps = type.foreignKeyProperties;
|
|
368
|
-
fkProps.forEach(function (fkProp) {
|
|
369
|
-
if (fkProp.parentType.name === keyMapping.entityTypeName &&
|
|
370
|
-
entityMemo.pendingChanges[fkProp.name] === keyMapping.tempValue) {
|
|
371
|
-
entityMemo.pendingChanges[fkProp.name] = keyMapping.realValue;
|
|
372
|
-
}
|
|
373
|
-
});
|
|
374
|
-
};
|
|
375
|
-
// update the entityMemo of changes to an entity being saved
|
|
376
|
-
// so that we know how to save it again later
|
|
377
|
-
EntityMemo.prototype.update = function () {
|
|
378
|
-
var entityMemo = this;
|
|
379
|
-
var props;
|
|
380
|
-
var entity = entityMemo.entity;
|
|
381
|
-
var aspect = entity.entityAspect;
|
|
382
|
-
var stateName = aspect.entityState.name;
|
|
383
|
-
switch (stateName) {
|
|
384
|
-
case 'Added':
|
|
385
|
-
var originalValues_1 = aspect.originalValues;
|
|
386
|
-
props = entity.entityType.dataProperties;
|
|
387
|
-
props.forEach(function (dp) {
|
|
388
|
-
if (dp.isPartOfKey) {
|
|
389
|
-
return;
|
|
390
|
-
}
|
|
391
|
-
var name = dp.name;
|
|
392
|
-
var value = entity.getProperty(name);
|
|
393
|
-
if (originalValues_1[name] !== value) {
|
|
394
|
-
entityMemo.pendingChanges[name] = value;
|
|
395
|
-
}
|
|
396
|
-
});
|
|
397
|
-
break;
|
|
398
|
-
case 'Deleted':
|
|
399
|
-
entityMemo.isDeleted = true;
|
|
400
|
-
entityMemo.pendingChanges = {};
|
|
401
|
-
break;
|
|
402
|
-
case 'Modified':
|
|
403
|
-
props = Object.keys(aspect.originalValues);
|
|
404
|
-
props.forEach(function (name) {
|
|
405
|
-
entityMemo.pendingChanges[name] = entity.getProperty(name);
|
|
406
|
-
});
|
|
407
|
-
break;
|
|
408
|
-
}
|
|
409
|
-
};
|
|
410
|
-
return EntityMemo;
|
|
411
|
-
}());
|
|
412
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWl4aW4tc2F2ZS1xdWV1aW5nLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYnJlZXplLWNsaWVudC9taXhpbi1zYXZlLXF1ZXVpbmcvIiwic291cmNlcyI6WyJtaXhpbi1zYXZlLXF1ZXVpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDZDQUE2QztBQUM3Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyREc7QUFDSCxZQUFZO0FBQ1osT0FBTyxFQUFxQyxXQUFXLEVBQWMsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR25HLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxFQUFpQixFQUFFLE1BQXNCO0lBQXRCLHVCQUFBLEVBQUEsYUFBc0I7SUFDekUsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQztRQUNuQyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTdDLE1BQU0sR0FBRyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDaEQsV0FBVyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7SUFDaEMsSUFBSSxNQUFNLEVBQUU7UUFDVixtQ0FBbUM7UUFDbkMsRUFBRSxDQUFDLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQztLQUN6QztTQUFNO1FBQ0wsaURBQWlEO1FBQ2pELEVBQUUsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztLQUNyRDtBQUNILENBQUM7QUFFRDs7O0lBR0k7QUFDSixTQUFTLHNCQUFzQixDQUFDLFFBQXlCLEVBQUUsV0FBZ0I7SUFDekUsSUFBSTtRQUNGLDZCQUE2QjtRQUM3QixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3BDLElBQUksV0FBVyxDQUFDLFFBQVEsRUFBRTtZQUN4Qiw2Q0FBNkM7WUFDN0MsT0FBTyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDL0M7YUFBTTtZQUNMLDJDQUEyQztZQUMzQyxXQUFXLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUM1QixXQUFXLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztZQUN0QyxPQUFPLFdBQVcsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1NBQ3ZEO0tBQ0Y7SUFBQyxPQUFPLEdBQUcsRUFBRTtRQUNaLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUM1QjtBQUNILENBQUM7QUFFRCwrQkFBK0I7QUFDL0I7SUFXRSxxQkFBWSxhQUE0QjtRQUN0QyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUM7UUFDakQsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVELCtCQUFTLEdBQVQ7UUFDRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELDJDQUFxQixHQUFyQjtRQUNFLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBYyxFQUFFLFdBQVcsRUFBRSxFQUFrQixFQUFFLENBQUM7SUFDdkUsQ0FBQztJQUVELHNDQUFnQixHQUFoQixVQUFpQixRQUFrQjtRQUNqQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQywwQkFBMEI7UUFDM0MsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUU1QixJQUFJLE9BQU8sR0FBRyxRQUFRLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzFDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDeEIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7U0FDdEQ7UUFFRCxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkQsSUFBSSxRQUFRLEVBQUU7WUFDWixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDakM7UUFFRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDekUsY0FBYyxFQUFFLENBQUM7UUFDakIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksUUFBUSxFQUFjLENBQUMsQ0FBQztRQUM3RixPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFFeEIsU0FBUyxjQUFjO1lBQ3JCLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQUUsT0FBTzthQUFFO1lBQ3JDLElBQUksYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7WUFDM0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFBLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsWUFBWSxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7b0JBQ25FLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZCO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxRQUFRLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFRCxpQ0FBVyxHQUFYLFVBQVksUUFBa0IsRUFBRSxXQUFnQjtRQUM5QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQywwQkFBMEI7UUFDM0MsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUUsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUM7YUFDbkcsSUFBSSxDQUFDLFVBQVUsVUFBc0IsSUFBSSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDbEYsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLEtBQVksSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUYsMkJBQTJCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyx5REFBeUQ7UUFDaEcsT0FBTyxPQUFPLENBQUM7UUFFZixTQUFTLDJCQUEyQixDQUFDLFFBQWtCO1lBQ3JELHdFQUF3RTtZQUN4RSxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQztnQkFDcEIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxRCxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQUEsTUFBTTtnQkFDbEIsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUM7Z0JBQzdDLElBQUksY0FBYyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDO2dCQUN4RCxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQUEsRUFBRTtvQkFDZCxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7d0JBQUUsT0FBTztxQkFBRTtvQkFDL0IsY0FBYyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDeEQsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBR0QsbUNBQWEsR0FBYixVQUFjLFVBQXNCO1FBQ2xDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLDJCQUEyQjtRQUM1QyxJQUFJLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUNqRCxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM3QyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBR3JDLCtDQUErQztRQUMvQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFFekIsSUFBSSxZQUFZLEVBQUU7WUFDaEIsNkNBQTZDO1lBQzdDLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzdDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzRSw4Q0FBOEM7WUFDOUMsSUFBSSxhQUFhLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDO2dCQUNyRCxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEQsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUM1QixhQUFhO2dCQUNiLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUNyQix1REFBdUQ7Z0JBQ3ZELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxnQkFBZ0IsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxZQUFZLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNuRDtpQkFBTSxJQUFJLGdCQUFnQixFQUFFO2dCQUMzQixnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQzthQUN4RDtTQUNGO1FBRUQsSUFBSSxrQkFBa0IsRUFBRTtZQUFFLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUFFO1FBQ25FLE9BQU8sVUFBVSxDQUFDLENBQUUsZ0NBQWdDO0lBQ3RELENBQUM7SUFFRCxnQ0FBVSxHQUFWLFVBQVcsS0FBWTtRQUNyQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQywyQkFBMkI7UUFDNUMsS0FBSyxHQUFHLElBQUkscUJBQXFCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRS9DLElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBQ2pELElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBRTdDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7UUFDL0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUV6QixJQUFJLGtCQUFrQixFQUFFO1lBQUUsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQUU7UUFDN0QsSUFBSSxnQkFBZ0IsRUFBRTtZQUFFLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUFFO1FBRXpELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLCtCQUErQjtJQUMvRCxDQUFDO0lBQ0gsa0JBQUM7QUFBRCxDQUFDLEFBM0lELElBMklDO0FBRUQseURBQXlEO0FBQ3pEO0lBSUU7UUFDRSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksT0FBTyxDQUFJLFVBQVUsT0FBMkIsRUFBRSxNQUEwQjtZQUM3RixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUN2QixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUNILGVBQUM7QUFBRCxDQUFDLEFBVkQsSUFVQztBQUdELDBDQUEwQztBQUMxQyxzREFBc0Q7QUFDdEQ7SUFBMkMseUNBQUs7SUFPOUMsc0RBQXNEO0lBQ3RELHdDQUF3QztJQUN4QywyREFBMkQ7SUFDM0QsbUVBQW1FO0lBQ25FLCtEQUErRDtJQUMvRCwrQkFBWSxTQUFnQixFQUFFLFdBQWdCO1FBQTlDLFlBQ0UsaUJBQU8sU0FLUjtRQWpCRCxVQUFJLEdBQUcsdUJBQXVCLENBQUM7UUFhN0IsS0FBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsS0FBSSxDQUFDLE9BQU8sR0FBRyxzQkFBc0IsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO1FBQzFELEtBQUksQ0FBQyxjQUFjLEdBQUcsV0FBVyxDQUFDLGNBQWMsQ0FBQztRQUNqRCxLQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUM7O0lBQy9DLENBQUM7SUFDSCw0QkFBQztBQUFELENBQUMsQUFuQkQsQ0FBMkMsS0FBSyxHQW1CL0M7O0FBRUQsb0NBQW9DO0FBQ3BDLG9FQUFvRTtBQUNwRSxnRUFBZ0U7QUFDaEUsNERBQTREO0FBQzVELHlEQUF5RDtBQUN6RCxpREFBaUQ7QUFDakQ7SUFHRTtRQUNFLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCx1Q0FBb0IsR0FBcEIsVUFBcUIsYUFBNEIsRUFBRSxhQUF1QjtRQUExRSxpQkFvQkM7UUFuQkMsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLHVCQUF1QjtRQUMzRCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3ZDLElBQUksaUJBQWlCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JFLElBQUk7WUFDRixhQUFhLENBQUMsT0FBTyxDQUFDLFVBQUEsS0FBSztnQkFDekIsSUFBSSxHQUFHLEdBQUcsS0FBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QyxJQUFJLFVBQVUsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2xDLElBQUksTUFBTSxHQUFHLFVBQVUsSUFBSSxVQUFVLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hFLElBQUksTUFBTSxFQUFFO29CQUNWLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzNCO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtnQkFBUztZQUNSLGlCQUFpQixFQUFFLENBQUM7WUFDcEIseUVBQXlFO1lBQ3pFLElBQUksVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLGlFQUFpRTtZQUNqRSxJQUFJLFVBQVUsRUFBRTtnQkFBRSxhQUFhLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQUU7U0FDeEQ7SUFDSCxDQUFDO0lBRU8sMkNBQXdCLEdBQWhDLFVBQWlDLE9BQXNCO1FBQ3JELElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDekIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlDLEtBQUssQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWxELE9BQU8sU0FBUyxpQkFBaUI7WUFDL0IsS0FBSyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzdDLEtBQUssQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCwwQkFBTyxHQUFQLFVBQVEsV0FBeUI7UUFDL0IsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFFLHVCQUF1QjtRQUM1RCxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQUEsRUFBRTtZQUNwQixJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDO1lBQzdCLElBQUksT0FBTyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN4QyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDeEIsV0FBVyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDOUQsT0FBTyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDN0I7WUFDRCxLQUFLLElBQUksT0FBTyxJQUFJLFdBQVcsRUFBRTtnQkFDL0IsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNsQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG9DQUFpQixHQUFqQixVQUFrQixNQUFjO1FBQzlCLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0MsT0FBTyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUM1RCxDQUFDO0lBRUQsb0NBQWlCLEdBQWpCLFVBQWtCLE9BQWlCO1FBQW5DLGlCQVVDO1FBVEMsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFFLHVCQUF1QjtRQUM1RCxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQUEsTUFBTTtZQUNwQiwrQ0FBK0M7WUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFO2dCQUFFLE9BQU87YUFBRTtZQUVsRCxJQUFJLEdBQUcsR0FBRyxLQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekMsSUFBSSxVQUFVLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDakYsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVILGVBQUM7QUFBRCxDQUFDLEFBekVELElBeUVDO0FBSUQseUNBQXlDO0FBQ3pDLGtEQUFrRDtBQUNsRCxxREFBcUQ7QUFDckQ7SUFJRSxvQkFBWSxNQUFjO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFHRCx1Q0FBa0IsR0FBbEIsVUFBbUIsS0FBYTtRQUM5QixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUNoQyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDbkMsT0FBTyxLQUFLLENBQUM7U0FDZDthQUFNLElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRTtZQUMvQixNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELGdEQUFnRDtRQUNoRCxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNuRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3RCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxJQUFJLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO1FBQzNDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxJQUFJO1lBQ2hCLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9DLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCw0QkFBTyxHQUFQLFVBQVEsVUFBc0I7UUFDNUIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQ3hDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztRQUN4QyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQUEsTUFBTTtZQUNwQixJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxjQUFjO2dCQUN0RCxVQUFVLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVLENBQUMsU0FBUyxFQUFFO2dCQUNqRSxVQUFVLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDO2FBQy9EO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsNERBQTREO0lBQzVELDZDQUE2QztJQUM3QywyQkFBTSxHQUFOO1FBQ0UsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksS0FBSyxDQUFDO1FBQ1YsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUMvQixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQ2pDLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQ3hDLFFBQVEsU0FBUyxFQUFFO1lBQ2pCLEtBQUssT0FBTztnQkFDVixJQUFJLGdCQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztnQkFDM0MsS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDO2dCQUN6QyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQUEsRUFBRTtvQkFDZCxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7d0JBQUUsT0FBTztxQkFBRTtvQkFDL0IsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztvQkFDbkIsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDckMsSUFBSSxnQkFBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssRUFBRTt3QkFDbEMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7cUJBQ3pDO2dCQUNILENBQUMsQ0FBQyxDQUFDO2dCQUNILE1BQU07WUFFUixLQUFLLFNBQVM7Z0JBQ1osVUFBVSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQzVCLFVBQVUsQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO2dCQUMvQixNQUFNO1lBRVIsS0FBSyxVQUFVO2dCQUNiLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDM0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFBLElBQUk7b0JBQ2hCLFVBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDN0QsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUNILGlCQUFDO0FBQUQsQ0FBQyxBQWhGRCxJQWdGQyIsInNvdXJjZXNDb250ZW50IjpbIi8vI3JlZ2lvbiBDb3B5cmlnaHQsIFZlcnNpb24sIGFuZCBEZXNjcmlwdGlvblxyXG4vKlxyXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDIxIElkZWFCbGFkZSwgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICogVXNlLCByZXByb2R1Y3Rpb24sIGRpc3RyaWJ1dGlvbiwgYW5kIG1vZGlmaWNhdGlvbiBvZiB0aGlzIGNvZGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgdGhlIElkZWFCbGFkZSBCcmVlemUgbGljZW5zZSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJlZXplanMuY29tL2xpY2Vuc2VcclxuICpcclxuICogQXV0aG9yOiBXYXJkIEJlbGxcclxuICogVmVyc2lvbjogMi4wLjYgU3RldmUgU2NobWl0dCAtIGNvbnZlcnQgdG8gVHlwZVNjcmlwdCwgbW92ZSB0byBicmVlemUtY2xpZW50IHJlcG8sIGNoYW5nZSBlbmFibGVTYXZlUXVldWluZyBmdW5jdGlvblxyXG4gKiBWZXJzaW9uOiAyLjAuNSBXYXJkIEJlbGxcclxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICogQWRkcyBcIlNhdmUgUXVldWluZ1wiIGNhcGFiaWxpdHkgdG8gbmV3IEVudGl0eU1hbmFnZXJzXHJcbiAqXHJcbiAqIFNhdmUgUXVldWluZyBhdXRvbWF0aWNhbGx5IHF1ZXVlcyBhbmQgZGVmZXJzIGFuIEVudGl0eU1hbmFnZXIuc2F2ZUNoYW5nZXMgY2FsbFxyXG4gKiB3aGVuIGFub3RoZXIgc2F2ZSBpcyBpbiBwcm9ncmVzcyBmb3IgdGhhdCBtYW5hZ2VyIGFuZCB0aGUgc2VydmVyIGhhcyBub3QgeWV0IHJlc3BvbmRlZC5cclxuICogVGhpcyBmZWF0dXJlIGlzIGhlbHBmdWwgd2hlbiB5b3VyIGFwcCBuZWVkcyB0byBhbGxvdyByYXBpZCwgY29udGludW91cyBjaGFuZ2VzXHJcbiAqIHRvIGVudGl0aWVzIHRoYXQgbWF5IGJlIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHNhdmVkLlxyXG4gKlxyXG4gKiBXaXRob3V0IFwiU2F2ZSBRdWV1aW5nXCIsIGFuIEVudGl0eU1hbmFnZXIgd2lsbCB0aHJvdyBhbiBleGNlcHRpb25cclxuICogd2hlbiB5b3UgY2FsbCBzYXZlQ2hhbmdlcyBmb3IgYW4gZW50aXR5IHdoaWNoIGlzIGN1cnJlbnRseSBiZWluZyBzYXZlZC5cclxuICpcclxuICogISEhIFVzZSB3aXRoIGNhdXRpb24gISEhXHJcbiAqIEl0IGlzIHVzdWFsbHkgYmV0dGVyIHRvIGRpc2FibGUgdXNlciBpbnB1dCB3aGlsZSBhIHNhdmUgaXMgaW4gcHJvZ3Jlc3MuXHJcbiAqIFNhdmUgUXVldWluZyBtYXkgYmUgYXBwcm9wcmlhdGUgZm9yIHNpbXBsZSBcImF1dG8tc2F2ZVwiIHNjZW5hcmlvc1xyXG4gKiB3aGVuIHRoZSBzYXZlIGxhdGVuY3kgaXMgXCJzaG9ydFwiICh1bmRlciBhIGZldyBzZWNvbmRzKS5cclxuICpcclxuICogU2F2ZSBRdWV1aW5nIGlzIE5PVCBpbnRlbmRlZCBmb3Igb2NjYXNzaW9uYWxseSBkaXNjb25uZWN0ZWQgb3Igb2ZmbGluZSBzY2VuYXJpb3MuXHJcbiAqXHJcbiAqIFNhdmUgUXVldWluZyBpcyBleHBlcmltZW50YWwuIEl0IHdpbGwgbm90IGJlY29tZSBhIHBhcnQgb2YgQnJlZXplSlMgY29yZVxyXG4gKiBidXQgbWlnaHQgYmVjb21lIGFuIG9mZmljaWFsIEJyZWV6ZSBwbHVnaW4gaW4gZnV0dXJlXHJcbiAqIGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSBpbiB0aGlzIGZvcm0gb3Igd2l0aCB0aGlzIEFQSVxyXG4gKlxyXG4gKiBNdXN0IGNhbGwgRW50aXR5TWFuYWdlci5lbmFibGVTYXZlUXVldWluZyh0cnVlKSB0byB0dXJuIGl0IG9uO1xyXG4gKiBFbnRpdHlNYW5hZ2VyLmVuYWJsZVNhdmVRdWV1aW5nKGZhbHNlKSByZXN0b3JlcyB0aGUgbWFuYWdlcidzIG9yaWdpbmFsXHJcbiAqIHNhdmVDaGFuZ2VzIG1ldGhvZCBhcyBpdCB3YXMgYXQgdGhlIHRpbWUgc2F2ZVF1ZXVpbmcgd2FzIGZpcnN0IGVuYWJsZWQuXHJcbiAqXHJcbiAqIFRoaXMgbW9kdWxlIGFkZHMgXCJlbmFibGVTYXZlUXVldWluZ1wiIHRvIHRoZSBFbnRpdHlNYW5hZ2VyIHByb3RvdHlwZS5cclxuICogQ2FsbGluZyBcImVuYWJsZVNhdmVRdWV1aW5nKHRydWUpXCIgYWRkcyBhIG5ldyBfc2F2ZVF1ZXVpbmcgb2JqZWN0XHJcbiAqIHRvIHRoZSBtYW5hZ2VyIGluc3RhbmNlLlxyXG4gKlxyXG4gKiBTZWUgRG9jQ29kZTpzYXZlUXVldWluZ1Rlc3RzLmpzXHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9CcmVlemUvYnJlZXplLmpzLnNhbXBsZXMvYmxvYi9tYXN0ZXIvbmV0L0RvY0NvZGUvRG9jQ29kZS90ZXN0cy9zYXZlUXVldWluZ1Rlc3RzLmpzXHJcbiAqXHJcbiAqIExJTUlUQVRJT05TXHJcbiAqIC0gQ2FuJ3QgaGFuZGxlIGNoYW5nZXMgdG8gdGhlIHByaW1hcnkga2V5IChkYW5nZXJvdXMgaW4gYW55IGNhc2UpXHJcbiAqIC0gQXNzdW1lcyBwcm9taXNlcy4gRG9lcyBub3Qgc3VwcG9ydCB0aGUgKGRlcHJlY2F0ZWQpIHN1Y2Nlc3MgYW5kIGZhaWwgY2FsbGJhY2tzXHJcbiAqIC0gRG9lcyBub3QgcXVldWUgc2F2ZU9wdGlvbnMuIFRoZSBmaXJzdCBvbmUgaXMgcmUtdXNlZCBmb3IgYWxsIHF1ZXVlZCBzYXZlcy5cclxuICogLSBEb2VzIG5vdCBkZWFsIHdpdGggZXhwb3J0L2ltcG9ydCBvZiBlbnRpdGllcyB3aGlsZSBzYXZlIGlzIGluZmxpZ2h0XHJcbiAqIC0gRG9lcyBub3QgZGVhbCB3aXRoIHJlamVjdENoYW5nZXMgd2hpbGUgc2F2ZSBpcyBpbiBmbGlnaHRcclxuICogLSBEb2VzIG5vdCBzdXBwb3J0IHBhcmFsbGVsIHNhdmVzIGV2ZW4gd2hlbiB0aGUgY2hhbmdlLXNldHMgYXJlIGluZGVwZW5kZW50LlxyXG4gKiAgIFRoZSBuYXRpdmUgc2F2ZUNoYW5nZXMgYWxsb3dzIHN1Y2ggc2F2ZXMuXHJcbiAqICAgU2F2ZVF1ZXVpbmcgZG9lcyBub3Q7IHRvbyBjb21wbGV4IGFuZCBkb2Vzbid0IGZpdCB0aGUgcHJpbWFyeSBzY2VuYXJpbyBhbnl3YXkuXHJcbiAqIC0gVGhlIHJlc29sdmVkIHNhdmVSZXN1bHQgaXMgdGhlIHNhdmVSZXN1bHQgb2YgdGhlIGxhc3QgY29tcGxldGVkIHNhdmVcclxuICogLSBBIHF1ZXVlZCBzYXZlIHRoYXQgbWlnaHQgaGF2ZSBzdWNjZWVkZWQgaWYgc2F2ZWQgaW1tZWRpYXRlbHlcclxuICogICBtYXkgZmFpbCBiZWNhdXNlIHRoZSBzZXJ2ZXIgbm8gbG9uZ2VyIGFjY2VwdHMgaXQgbGF0ZXJcclxuICogLSBQcmlvciB0byBCcmVlemUgdi4xLjUuMywgYSBxdWV1ZWQgc2F2ZSB0aGF0IG1pZ2h0IGhhdmUgc3VjY2VlZGVkXHJcbiAqICAgaWYgc2F2ZWQgaW1tZWRpYXRlbHkgd2lsbCBmYWlsIGlmIHN1YnNlcXVlbnRseSBhdHRlbXB0IHRvIHNhdmVcclxuICogICBhbiBpbnZhbGlkIGVudGl0eS4gQ2FuIGRldGVjdCBhbmQgY2lyY3VtdmVudCBhZnRlciB2LjEuNS4zLlxyXG4gKlxyXG4gKiBBbGwgbWVtYmVycyBvZiBFbnRpdHlNYW5hZ2VyLl9zYXZlUXVldWluZyBhcmUgaW50ZXJuYWw7XHJcbiAqIHRvdWNoIHRoZW0gYXQgeW91ciBvd24gcmlzay5cclxuICovXHJcbi8vI2VuZHJlZ2lvblxyXG5pbXBvcnQgeyBFbnRpdHksIEVudGl0eU1hbmFnZXIsIEtleU1hcHBpbmcsIEVudGl0eVN0YXRlLCBTYXZlUmVzdWx0LCBicmVlemUgfSBmcm9tICdicmVlemUtY2xpZW50JztcclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlU2F2ZVF1ZXVpbmcoZW06IEVudGl0eU1hbmFnZXIsIGVuYWJsZTogYm9vbGVhbiA9IHRydWUpIHtcclxuICBsZXQgc2F2ZVF1ZXVpbmcgPSBlbVsnX3NhdmVRdWV1ZWluZyddIHx8XHJcbiAgICAoZW1bJ19zYXZlUXVldWluZyddID0gbmV3IFNhdmVRdWV1aW5nKGVtKSk7XHJcblxyXG4gIGVuYWJsZSA9IChlbmFibGUgPT09IHVuZGVmaW5lZCkgPyB0cnVlIDogZW5hYmxlO1xyXG4gIHNhdmVRdWV1aW5nLl9pc0VuYWJsZWQgPSBlbmFibGU7XHJcbiAgaWYgKGVuYWJsZSkge1xyXG4gICAgLy8gZGVsZWdhdGUgdG8gc2F2ZSBjaGFuZ2VzIHF1ZXVpbmdcclxuICAgIGVtLnNhdmVDaGFuZ2VzID0gc2F2ZUNoYW5nZXNXaXRoUXVldWluZztcclxuICB9IGVsc2Uge1xyXG4gICAgLy8gcmV2ZXJ0IHRvIHRoZSBuYXRpdmUgRW50aXR5TWFuYWdlci5zYXZlQ2hhbmdlc1xyXG4gICAgZW0uc2F2ZUNoYW5nZXMgPSBlbVsnX3NhdmVRdWV1aW5nJ10uYmFzZVNhdmVDaGFuZ2VzO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlcGxhY2VtZW50IGZvciBFbnRpdHlNYW5hZ2VyLnNhdmVDaGFuZ2VzXHJcbiAqIFRoaXMgdmVyc2lvbiBxdWV1ZXMgc2F2ZUNoYW5nZXMgY2FsbHMgd2hpbGUgYSByZWFsIHNhdmUgaXMgaW4gcHJvZ3Jlc3NcclxuICoqL1xyXG5mdW5jdGlvbiBzYXZlQ2hhbmdlc1dpdGhRdWV1aW5nKGVudGl0aWVzOiBFbnRpdHlbXSB8IG51bGwsIHNhdmVPcHRpb25zOiBhbnkpIHtcclxuICB0cnkge1xyXG4gICAgLy8gYHRoaXNgIGlzIGFuIEVudGl0eU1hbmFnZXJcclxuICAgIGxldCBzYXZlUXVldWluZyA9IHRoaXMuX3NhdmVRdWV1aW5nO1xyXG4gICAgaWYgKHNhdmVRdWV1aW5nLmlzU2F2aW5nKSB7XHJcbiAgICAgIC8vIHNhdmUgaW4gcHJvZ3Jlc3M7IHF1ZXVlIHRoZSBzYXZlIGZvciBsYXRlclxyXG4gICAgICByZXR1cm4gc2F2ZVF1ZXVpbmcucXVldWVTYXZlQ2hhbmdlcyhlbnRpdGllcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBub3RlIHRoYXQgc2F2ZSBpcyBpbiBwcm9ncmVzczsgdGhlbiBzYXZlXHJcbiAgICAgIHNhdmVRdWV1aW5nLmlzU2F2aW5nID0gdHJ1ZTtcclxuICAgICAgc2F2ZVF1ZXVpbmcuc2F2ZU9wdGlvbnMgPSBzYXZlT3B0aW9ucztcclxuICAgICAgcmV0dXJuIHNhdmVRdWV1aW5nLnNhdmVDaGFuZ2VzKGVudGl0aWVzLCBzYXZlT3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcclxuICB9XHJcbn1cclxuXHJcbi8vLy8vLy8vLyBTYXZlUXVldWluZyAvLy8vLy8vLy9cclxuY2xhc3MgU2F2ZVF1ZXVpbmcge1xyXG4gIGVudGl0eU1hbmFnZXI6IEVudGl0eU1hbmFnZXI7XHJcbiAgYmFzZVNhdmVDaGFuZ2VzOiAoKSA9PiBQcm9taXNlPGFueT47XHJcbiAgaXNTYXZpbmc6IGJvb2xlYW47XHJcbiAgX2lzRW5hYmxlZDogYm9vbGVhbjtcclxuICBhY3RpdmVTYXZlRGVmZXJyZWQ6IERlZmVycmVkPFNhdmVSZXN1bHQ+O1xyXG4gIG5leHRTYXZlRGVmZXJyZWQ6IERlZmVycmVkPFNhdmVSZXN1bHQ+O1xyXG4gIGFjdGl2ZVNhdmVNZW1vOiBTYXZlTWVtbztcclxuICBuZXh0U2F2ZU1lbW86IFNhdmVNZW1vO1xyXG4gIHNhdmVPcHRpb25zOiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGVudGl0eU1hbmFnZXI6IEVudGl0eU1hbmFnZXIpIHtcclxuICAgIHRoaXMuZW50aXR5TWFuYWdlciA9IGVudGl0eU1hbmFnZXI7XHJcbiAgICB0aGlzLmJhc2VTYXZlQ2hhbmdlcyA9IGVudGl0eU1hbmFnZXIuc2F2ZUNoYW5nZXM7XHJcbiAgICB0aGlzLmlzU2F2aW5nID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBpc0VuYWJsZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNFbmFibGVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2F2ZWROb3RoaW5nUmVzdWx0KCk6IFNhdmVSZXN1bHQge1xyXG4gICAgcmV0dXJuIHsgZW50aXRpZXM6IFtdIGFzIEVudGl0eVtdLCBrZXlNYXBwaW5nczogW10gYXMgS2V5TWFwcGluZ1tdIH07XHJcbiAgfVxyXG5cclxuICBxdWV1ZVNhdmVDaGFuZ2VzKGVudGl0aWVzOiBFbnRpdHlbXSkge1xyXG4gICAgbGV0IHNlbGYgPSB0aGlzOyAvLyBgdGhpc2AgaXMgYSBTYXZlUXVldWluZ1xyXG4gICAgbGV0IGVtID0gc2VsZi5lbnRpdHlNYW5hZ2VyO1xyXG5cclxuICAgIGxldCBjaGFuZ2VzID0gZW50aXRpZXMgfHwgZW0uZ2V0Q2hhbmdlcygpO1xyXG4gICAgaWYgKGNoYW5nZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5nZXRTYXZlZE5vdGhpbmdSZXN1bHQoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHZhbEVycm9yID0gZW0uc2F2ZUNoYW5nZXNWYWxpZGF0ZU9uQ2xpZW50KGNoYW5nZXMpO1xyXG4gICAgaWYgKHZhbEVycm9yKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh2YWxFcnJvcik7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHNhdmVNZW1vID0gc2VsZi5uZXh0U2F2ZU1lbW8gfHwgKHNlbGYubmV4dFNhdmVNZW1vID0gbmV3IFNhdmVNZW1vKCkpO1xyXG4gICAgbWVtb2l6ZUNoYW5nZXMoKTtcclxuICAgIGxldCBkZWZlcnJlZCA9IHNlbGYubmV4dFNhdmVEZWZlcnJlZCB8fCAoc2VsZi5uZXh0U2F2ZURlZmVycmVkID0gbmV3IERlZmVycmVkPFNhdmVSZXN1bHQ+KCkpO1xyXG4gICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcblxyXG4gICAgZnVuY3Rpb24gbWVtb2l6ZUNoYW5nZXMoKSB7XHJcbiAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cclxuICAgICAgbGV0IHF1ZXVlZENoYW5nZXMgPSBzYXZlTWVtby5xdWV1ZWRDaGFuZ2VzO1xyXG4gICAgICBjaGFuZ2VzLmZvckVhY2goZSA9PiB7XHJcbiAgICAgICAgaWYgKCFlLmVudGl0eUFzcGVjdC5pc0JlaW5nU2F2ZWQgJiYgcXVldWVkQ2hhbmdlcy5pbmRleE9mKGUpID09PSAtMSkge1xyXG4gICAgICAgICAgcXVldWVkQ2hhbmdlcy5wdXNoKGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBzYXZlTWVtby51cGRhdGVFbnRpdHlNZW1vcyhjaGFuZ2VzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNhdmVDaGFuZ2VzKGVudGl0aWVzOiBFbnRpdHlbXSwgc2F2ZU9wdGlvbnM6IGFueSkge1xyXG4gICAgbGV0IHNlbGYgPSB0aGlzOyAvLyBgdGhpc2AgaXMgYSBTYXZlUXVldWluZ1xyXG4gICAgbGV0IHByb21pc2UgPSBzZWxmLmJhc2VTYXZlQ2hhbmdlcy5jYWxsKHNlbGYuZW50aXR5TWFuYWdlciwgZW50aXRpZXMsIHNhdmVPcHRpb25zIHx8IHNlbGYuc2F2ZU9wdGlvbnMpXHJcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChzYXZlUmVzdWx0OiBTYXZlUmVzdWx0KSB7IHJldHVybiBzZWxmLnNhdmVTdWNjZWVkZWQoc2F2ZVJlc3VsdCk7IH0pXHJcbiAgICAgIC50aGVuKG51bGwsIGZ1bmN0aW9uIChlcnJvcjogRXJyb3IpIHsgY29uc29sZS5sb2coZXJyb3IpOyByZXR1cm4gc2VsZi5zYXZlRmFpbGVkKGVycm9yKTsgfSk7XHJcbiAgICByZW1lbWJlckFkZGVkT3JpZ2luYWxWYWx1ZXMoZW50aXRpZXMpOyAvLyBkbyBpdCBhZnRlciAuLi4gc28gZG9uJ3Qgc2VuZCBPcmlnVmFsdWVzIHRvIHRoZSBzZXJ2ZXJcclxuICAgIHJldHVybiBwcm9taXNlO1xyXG5cclxuICAgIGZ1bmN0aW9uIHJlbWVtYmVyQWRkZWRPcmlnaW5hbFZhbHVlcyhlbnRpdGllczogRW50aXR5W10pIHtcclxuICAgICAgLy8gYWRkZWQgZW50aXRpZXMgbm9ybWFsbHkgZG9uJ3QgaGF2ZSBvcmlnaW5hbCB2YWx1ZXMgYnV0IHRoZXNlIHdpbGwgbm93XHJcbiAgICAgIGxldCBhZGRlZCA9IGVudGl0aWVzID9cclxuICAgICAgICBlbnRpdGllcy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlLmlzQWRkZWQoKTsgfSkgOlxyXG4gICAgICAgIHNlbGYuZW50aXR5TWFuYWdlci5nZXRFbnRpdGllcyhudWxsLCBFbnRpdHlTdGF0ZS5BZGRlZCk7XHJcbiAgICAgIGFkZGVkLmZvckVhY2goZW50aXR5ID0+IHtcclxuICAgICAgICBsZXQgcHJvcHMgPSBlbnRpdHkuZW50aXR5VHlwZS5kYXRhUHJvcGVydGllcztcclxuICAgICAgICBsZXQgb3JpZ2luYWxWYWx1ZXMgPSBlbnRpdHkuZW50aXR5QXNwZWN0Lm9yaWdpbmFsVmFsdWVzO1xyXG4gICAgICAgIHByb3BzLmZvckVhY2goZHAgPT4ge1xyXG4gICAgICAgICAgaWYgKGRwLmlzUGFydE9mS2V5KSB7IHJldHVybjsgfVxyXG4gICAgICAgICAgb3JpZ2luYWxWYWx1ZXNbZHAubmFtZV0gPSBlbnRpdHkuZ2V0UHJvcGVydHkoZHAubmFtZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHNhdmVTdWNjZWVkZWQoc2F2ZVJlc3VsdDogU2F2ZVJlc3VsdCkge1xyXG4gICAgbGV0IHNlbGYgPSB0aGlzOyAvLyBgdGhpc2AgaXMgYSBTYXZlUXVldWVpbmdcclxuICAgIGxldCBhY3RpdmVTYXZlRGVmZXJyZWQgPSBzZWxmLmFjdGl2ZVNhdmVEZWZlcnJlZDtcclxuICAgIGxldCBuZXh0U2F2ZURlZmVycmVkID0gc2VsZi5uZXh0U2F2ZURlZmVycmVkO1xyXG4gICAgbGV0IG5leHRTYXZlTWVtbyA9IHNlbGYubmV4dFNhdmVNZW1vO1xyXG5cclxuXHJcbiAgICAvLyBwcmVwYXJlIGFzIGlmIG5vdGhpbmcgcXVldWVkIG9yIGxlZnQgdG8gc2F2ZVxyXG4gICAgc2VsZi5pc1NhdmluZyA9IGZhbHNlO1xyXG4gICAgc2VsZi5hY3RpdmVTYXZlRGVmZXJyZWQgPSBudWxsO1xyXG4gICAgc2VsZi5hY3RpdmVTYXZlTWVtbyA9IG51bGw7XHJcbiAgICBzZWxmLm5leHRTYXZlRGVmZXJyZWQgPSBudWxsO1xyXG4gICAgc2VsZi5uZXh0U2F2ZU1lbW8gPSBudWxsO1xyXG5cclxuICAgIGlmIChuZXh0U2F2ZU1lbW8pIHtcclxuICAgICAgLy8gYSBzYXZlIHdhcyBxdWV1ZWQgc2luY2UgbGFzdCBzYXZlIHJldHVybmVkXHJcbiAgICAgIG5leHRTYXZlTWVtby5wa0ZpeHVwKHNhdmVSZXN1bHQua2V5TWFwcGluZ3MpO1xyXG4gICAgICBuZXh0U2F2ZU1lbW8uYXBwbHlUb1NhdmVkRW50aXRpZXMoc2VsZi5lbnRpdHlNYW5hZ2VyLCBzYXZlUmVzdWx0LmVudGl0aWVzKTtcclxuICAgICAgLy8gcmVtb3ZlIGRldGFjaGVkIGVudGl0aWVzIGZyb20gcXVldWVkQ2hhbmdlc1xyXG4gICAgICBsZXQgcXVldWVkQ2hhbmdlcyA9IG5leHRTYXZlTWVtby5xdWV1ZWRDaGFuZ2VzLmZpbHRlcihlID0+IHtcclxuICAgICAgICByZXR1cm4gIWUuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlLmlzRGV0YWNoZWQoKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAocXVldWVkQ2hhbmdlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgLy8gc2F2ZSBhZ2FpblxyXG4gICAgICAgIHNlbGYuaXNTYXZpbmcgPSB0cnVlO1xyXG4gICAgICAgIC8vIHJlbWVtYmVyIHRoZSBxdWV1ZWQgY2hhbmdlcyB0aGF0IHRyaWdnZXJlZCB0aGlzIHNhdmVcclxuICAgICAgICBzZWxmLmFjdGl2ZVNhdmVEZWZlcnJlZCA9IG5leHRTYXZlRGVmZXJyZWQ7XHJcbiAgICAgICAgc2VsZi5hY3RpdmVTYXZlTWVtbyA9IG5leHRTYXZlTWVtbztcclxuICAgICAgICBzZWxmLnNhdmVDaGFuZ2VzKHF1ZXVlZENoYW5nZXMsIHRoaXMuc2F2ZU9wdGlvbnMpO1xyXG4gICAgICB9IGVsc2UgaWYgKG5leHRTYXZlRGVmZXJyZWQpIHtcclxuICAgICAgICBuZXh0U2F2ZURlZmVycmVkLnJlc29sdmUodGhpcy5nZXRTYXZlZE5vdGhpbmdSZXN1bHQoKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoYWN0aXZlU2F2ZURlZmVycmVkKSB7IGFjdGl2ZVNhdmVEZWZlcnJlZC5yZXNvbHZlKHNhdmVSZXN1bHQpOyB9XHJcbiAgICByZXR1cm4gc2F2ZVJlc3VsdDsgIC8vIGZvciB0aGUgY3VycmVudCBwcm9taXNlIGNoYWluXHJcbiAgfVxyXG5cclxuICBzYXZlRmFpbGVkKGVycm9yOiBFcnJvcikge1xyXG4gICAgbGV0IHNlbGYgPSB0aGlzOyAvLyBgdGhpc2AgaXMgYSBTYXZlUXVldWVpbmdcclxuICAgIGVycm9yID0gbmV3IFF1ZXVlZFNhdmVGYWlsZWRFcnJvcihlcnJvciwgc2VsZik7XHJcblxyXG4gICAgbGV0IGFjdGl2ZVNhdmVEZWZlcnJlZCA9IHNlbGYuYWN0aXZlU2F2ZURlZmVycmVkO1xyXG4gICAgbGV0IG5leHRTYXZlRGVmZXJyZWQgPSBzZWxmLm5leHRTYXZlRGVmZXJyZWQ7XHJcblxyXG4gICAgc2VsZi5pc1NhdmluZyA9IGZhbHNlO1xyXG4gICAgc2VsZi5hY3RpdmVTYXZlRGVmZXJyZWQgPSBudWxsO1xyXG4gICAgc2VsZi5hY3RpdmVTYXZlTWVtbyA9IG51bGw7XHJcbiAgICBzZWxmLm5leHRTYXZlRGVmZXJyZWQgPSBudWxsO1xyXG4gICAgc2VsZi5uZXh0U2F2ZU1lbW8gPSBudWxsO1xyXG5cclxuICAgIGlmIChhY3RpdmVTYXZlRGVmZXJyZWQpIHsgYWN0aXZlU2F2ZURlZmVycmVkLnJlamVjdChlcnJvcik7IH1cclxuICAgIGlmIChuZXh0U2F2ZURlZmVycmVkKSB7IG5leHRTYXZlRGVmZXJyZWQucmVqZWN0KGVycm9yKTsgfVxyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7IC8vIGxldCBwcm9taXNlIGNoYWluIGhlYXIgZXJyb3JcclxuICB9XHJcbn1cclxuXHJcbi8vLyBmb3IgYmFja3dhcmQgY29tcGF0IHdpdGggb2xkZXIgUHJvbWlzZSBpbXBsZW1lbnRhdGlvblxyXG5jbGFzcyBEZWZlcnJlZDxUPiB7XHJcbiAgcmVzb2x2ZTogKHZhbDogYW55KSA9PiB2b2lkO1xyXG4gIHJlamVjdDogKGVycjogYW55KSA9PiB2b2lkO1xyXG4gIHByb21pc2U6IFByb21pc2U8VD47XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZTxUPihmdW5jdGlvbiAocmVzb2x2ZTogKHZhbDogYW55KSA9PiB2b2lkLCByZWplY3Q6IChlcnI6IGFueSkgPT4gdm9pZCkge1xyXG4gICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xyXG4gICAgICB0aGlzLnJlamVjdCA9IHJlamVjdDtcclxuICAgIH0uYmluZCh0aGlzKSk7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuLy8vLy8vLy8vLyBRdWV1ZWRTYXZlRmFpbGVkRXJyb3IgLy8vLy8vLy8vXHJcbi8vIEVycm9yIHN1Yi1jbGFzcyB0aHJvd24gd2hlbiByZWplY3RpbmcgcXVldWVkIHNhdmVzLlxyXG5leHBvcnQgY2xhc3MgUXVldWVkU2F2ZUZhaWxlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gIG5hbWUgPSBcIlF1ZXVlZFNhdmVGYWlsZWRFcnJvclwiO1xyXG4gIGlubmVyRXJyb3I6IEVycm9yO1xyXG4gIG1lc3NhZ2U6IHN0cmluZztcclxuICBmYWlsZWRTYXZlTWVtbzogU2F2ZU1lbW87XHJcbiAgbmV4dFNhdmVNZW1vOiBTYXZlTWVtbztcclxuXHJcbiAgLy8gRXJyb3Igc3ViLWNsYXNzIHRocm93biB3aGVuIHJlamVjdGluZyBxdWV1ZWQgc2F2ZXMuXHJcbiAgLy8gYGlubmVyRXJyb3JgIGlzIHRoZSBhY3R1YWwgc2F2ZSBlcnJvclxyXG4gIC8vIGBmYWlsZWRTYXZlTWVtb2AgaXMgdGhlIHNhdmVNZW1vIHRoYXQgcHJvbXB0ZWQgdGhpcyBzYXZlXHJcbiAgLy8gYG5leHRTYXZlTWVtb2AgaG9sZHMgcXVldWVkIGNoYW5nZXMgYWNjdW11bGF0ZWQgc2luY2UgdGhhdCBzYXZlLlxyXG4gIC8vIFlvdSBtYXkgdHJ5IHRvIHJlY292ZXIgdXNpbmcgdGhpcyBpbmZvLiBHb29kIGx1Y2sgd2l0aCB0aGF0LlxyXG4gIGNvbnN0cnVjdG9yKGVyck9iamVjdDogRXJyb3IsIHNhdmVRdWV1aW5nOiBhbnkpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLmlubmVyRXJyb3IgPSBlcnJPYmplY3Q7XHJcbiAgICB0aGlzLm1lc3NhZ2UgPSBcIlF1ZXVlZCBzYXZlIGZhaWxlZDogXCIgKyBlcnJPYmplY3QubWVzc2FnZTtcclxuICAgIHRoaXMuZmFpbGVkU2F2ZU1lbW8gPSBzYXZlUXVldWluZy5hY3RpdmVTYXZlTWVtbztcclxuICAgIHRoaXMubmV4dFNhdmVNZW1vID0gc2F2ZVF1ZXVpbmcubmV4dFNhdmVNZW1vO1xyXG4gIH1cclxufVxyXG5cclxuLy8vLy8vLy8vLyBTYXZlTWVtbyAvLy8vLy8vLy8vLy8vLy8vXHJcbi8vIFNhdmVNZW1vIGlzIGEgcmVjb3JkIG9mIGNoYW5nZXMgZm9yIGEgcXVldWVkIHNhdmUsIGNvbnNpc3Rpbmcgb2Y6XHJcbi8vICAgZW50aXR5TWVtb3M6ICAgaW5mbyBhYm91dCBlbnRpdGllcyB0aGF0IGFyZSBiZWluZyBzYXZlZCBhbmRcclxuLy8gICAgICAgICAgICAgICAgICBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSB0aGUgc2F2ZSBzdGFydGVkXHJcbi8vICAgcXVldWVkQ2hhbmdlczogZW50aXRpZXMgdGhhdCBhcmUgcXVldWVkIGZvciBzYXZlIGJ1dFxyXG4vLyAgICAgICAgICAgICAgICAgIGFyZSBub3QgY3VycmVudGx5IGJlaW5nIHNhdmVkXHJcbmNsYXNzIFNhdmVNZW1vIHtcclxuICBlbnRpdHlNZW1vczogeyBba2V5OiBzdHJpbmddOiBFbnRpdHlNZW1vIH07XHJcbiAgcXVldWVkQ2hhbmdlczogRW50aXR5W107XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLmVudGl0eU1lbW9zID0ge307XHJcbiAgICB0aGlzLnF1ZXVlZENoYW5nZXMgPSBbXTtcclxuICB9XHJcblxyXG4gIGFwcGx5VG9TYXZlZEVudGl0aWVzKGVudGl0eU1hbmFnZXI6IEVudGl0eU1hbmFnZXIsIHNhdmVkRW50aXRpZXM6IEVudGl0eVtdKSB7XHJcbiAgICBsZXQgZW50aXR5TWVtb3MgPSB0aGlzLmVudGl0eU1lbW9zOyAvLyBgdGhpc2AgaXMgYSBTYXZlTWVtb1xyXG4gICAgbGV0IHF1ZXVlZENoYW5nZXMgPSB0aGlzLnF1ZXVlZENoYW5nZXM7XHJcbiAgICBsZXQgcmVzdG9yZVB1Ymxpc2hpbmcgPSB0aGlzLmRpc2FibGVNYW5hZ2VyUHVibGlzaGluZyhlbnRpdHlNYW5hZ2VyKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHNhdmVkRW50aXRpZXMuZm9yRWFjaChzYXZlZCA9PiB7XHJcbiAgICAgICAgbGV0IGtleSA9IHRoaXMubWFrZUVudGl0eU1lbW9LZXkoc2F2ZWQpO1xyXG4gICAgICAgIGxldCBlbnRpdHlNZW1vID0gZW50aXR5TWVtb3Nba2V5XTtcclxuICAgICAgICBsZXQgcmVzYXZlID0gZW50aXR5TWVtbyAmJiBlbnRpdHlNZW1vLmFwcGx5VG9TYXZlZEVudGl0eShzYXZlZCk7XHJcbiAgICAgICAgaWYgKHJlc2F2ZSkge1xyXG4gICAgICAgICAgcXVldWVkQ2hhbmdlcy5wdXNoKHNhdmVkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgcmVzdG9yZVB1Ymxpc2hpbmcoKTtcclxuICAgICAgLy8gRCMyNjUxIGhhc0NoYW5nZXMgd2lsbCBiZSB3cm9uZyBpZiBjaGFuZ2VzIG1hZGUgd2hpbGUgc2F2ZSBpbiBwcm9ncmVzc1xyXG4gICAgICBsZXQgaGFzQ2hhbmdlcyA9IHF1ZXVlZENoYW5nZXMubGVuZ3RoID4gMDtcclxuICAgICAgLy8gTXVzdCB1c2UgYnJlZXplIGludGVybmFsIG1ldGhvZCB0byBwcm9wZXJseSBzZXQgdGhpcyBmbGFnIHRydWVcclxuICAgICAgaWYgKGhhc0NoYW5nZXMpIHsgZW50aXR5TWFuYWdlci5fc2V0SGFzQ2hhbmdlcyh0cnVlKTsgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkaXNhYmxlTWFuYWdlclB1Ymxpc2hpbmcobWFuYWdlcjogRW50aXR5TWFuYWdlcikge1xyXG4gICAgbGV0IEV2ZW50ID0gYnJlZXplLkV2ZW50O1xyXG4gICAgRXZlbnQuZW5hYmxlKCdlbnRpdHlDaGFuZ2VkJywgbWFuYWdlciwgZmFsc2UpO1xyXG4gICAgRXZlbnQuZW5hYmxlKCdoYXNDaGFuZ2VzQ2hhbmdlZCcsIG1hbmFnZXIsIGZhbHNlKTtcclxuXHJcbiAgICByZXR1cm4gZnVuY3Rpb24gcmVzdG9yZVB1Ymxpc2hpbmcoKSB7XHJcbiAgICAgIEV2ZW50LmVuYWJsZSgnZW50aXR5Q2hhbmdlZCcsIG1hbmFnZXIsIHRydWUpO1xyXG4gICAgICBFdmVudC5lbmFibGUoJ2hhc0NoYW5nZXNDaGFuZ2VkJywgbWFuYWdlciwgdHJ1ZSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcGtGaXh1cChrZXlNYXBwaW5nczogS2V5TWFwcGluZ1tdKSB7XHJcbiAgICBsZXQgZW50aXR5TWVtb3MgPSB0aGlzLmVudGl0eU1lbW9zOyAgLy8gYHRoaXNgIGlzIGEgU2F2ZU1lbW9cclxuICAgIGtleU1hcHBpbmdzLmZvckVhY2goa20gPT4ge1xyXG4gICAgICBsZXQgdHlwZSA9IGttLmVudGl0eVR5cGVOYW1lO1xyXG4gICAgICBsZXQgdGVtcEtleSA9IHR5cGUgKyAnfCcgKyBrbS50ZW1wVmFsdWU7XHJcbiAgICAgIGlmIChlbnRpdHlNZW1vc1t0ZW1wS2V5XSkge1xyXG4gICAgICAgIGVudGl0eU1lbW9zW3R5cGUgKyAnfCcgKyBrbS5yZWFsVmFsdWVdID0gZW50aXR5TWVtb3NbdGVtcEtleV07XHJcbiAgICAgICAgZGVsZXRlIGVudGl0eU1lbW9zW3RlbXBLZXldO1xyXG4gICAgICB9XHJcbiAgICAgIGZvciAobGV0IG1lbW9LZXkgaW4gZW50aXR5TWVtb3MpIHtcclxuICAgICAgICBlbnRpdHlNZW1vc1ttZW1vS2V5XS5ma0ZpeHVwKGttKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBtYWtlRW50aXR5TWVtb0tleShlbnRpdHk6IEVudGl0eSkge1xyXG4gICAgbGV0IGVudGl0eUtleSA9IGVudGl0eS5lbnRpdHlBc3BlY3QuZ2V0S2V5KCk7XHJcbiAgICByZXR1cm4gZW50aXR5S2V5LmVudGl0eVR5cGUubmFtZSArICd8JyArIGVudGl0eUtleS52YWx1ZXM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVFbnRpdHlNZW1vcyhjaGFuZ2VzOiBFbnRpdHlbXSkge1xyXG4gICAgbGV0IGVudGl0eU1lbW9zID0gdGhpcy5lbnRpdHlNZW1vczsgIC8vIGB0aGlzYCBpcyBhIFNhdmVNZW1vXHJcbiAgICBjaGFuZ2VzLmZvckVhY2goY2hhbmdlID0+IHtcclxuICAgICAgLy8gb25seSB1cGRhdGUgZW50aXR5TWVtbyBmb3IgZW50aXR5IGJlaW5nIHNhdmVcclxuICAgICAgaWYgKCFjaGFuZ2UuZW50aXR5QXNwZWN0LmlzQmVpbmdTYXZlZCkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgIGxldCBrZXkgPSB0aGlzLm1ha2VFbnRpdHlNZW1vS2V5KGNoYW5nZSk7XHJcbiAgICAgIGxldCBlbnRpdHlNZW1vID0gZW50aXR5TWVtb3Nba2V5XSB8fCAoZW50aXR5TWVtb3Nba2V5XSA9IG5ldyBFbnRpdHlNZW1vKGNoYW5nZSkpO1xyXG4gICAgICBlbnRpdHlNZW1vLnVwZGF0ZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcblxyXG4vLy8vLy8vLy8gRW50aXR5TWVtbyBUeXBlIC8vLy8vLy8vLy8vLy8vL1xyXG4vLyBJbmZvcm1hdGlvbiBhYm91dCBhbiBlbnRpdHkgdGhhdCBpcyBiZWluZyBzYXZlZFxyXG4vLyBhbmQgd2hpY2ggaGFzIGJlZW4gY2hhbmdlZCBzaW5jZSB0aGF0IHNhdmUgc3RhcnRlZFxyXG5jbGFzcyBFbnRpdHlNZW1vIHtcclxuICBlbnRpdHk6IEVudGl0eTtcclxuICBwZW5kaW5nQ2hhbmdlczogYW55O1xyXG4gIGlzRGVsZXRlZDogYm9vbGVhbjtcclxuICBjb25zdHJ1Y3RvcihlbnRpdHk6IEVudGl0eSkge1xyXG4gICAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XHJcbiAgICB0aGlzLnBlbmRpbmdDaGFuZ2VzID0ge307XHJcbiAgfVxyXG5cclxuXHJcbiAgYXBwbHlUb1NhdmVkRW50aXR5KHNhdmVkOiBFbnRpdHkpIHtcclxuICAgIGxldCBlbnRpdHlNZW1vID0gdGhpcztcclxuICAgIGxldCBhc3BlY3QgPSBzYXZlZC5lbnRpdHlBc3BlY3Q7XHJcbiAgICBpZiAoYXNwZWN0LmVudGl0eVN0YXRlLmlzRGV0YWNoZWQoKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGVsc2UgaWYgKGVudGl0eU1lbW8uaXNEZWxldGVkKSB7XHJcbiAgICAgIGFzcGVjdC5zZXREZWxldGVkKCk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgLy8gdHJlYXQgZW50aXR5IHdpdGggcGVuZGluZyBjaGFuZ2VzIGFzIG1vZGlmaWVkXHJcbiAgICBsZXQgcHJvcHMgPSBPYmplY3Qua2V5cyhlbnRpdHlNZW1vLnBlbmRpbmdDaGFuZ2VzKTtcclxuICAgIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgbGV0IG9yaWdpbmFsVmFsdWVzID0gYXNwZWN0Lm9yaWdpbmFsVmFsdWVzO1xyXG4gICAgcHJvcHMuZm9yRWFjaChuYW1lID0+IHtcclxuICAgICAgb3JpZ2luYWxWYWx1ZXNbbmFtZV0gPSBzYXZlZC5nZXRQcm9wZXJ0eShuYW1lKTtcclxuICAgICAgc2F2ZWQuc2V0UHJvcGVydHkobmFtZSwgZW50aXR5TWVtby5wZW5kaW5nQ2hhbmdlc1tuYW1lXSk7XHJcbiAgICB9KTtcclxuICAgIGFzcGVjdC5zZXRNb2RpZmllZCgpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBma0ZpeHVwKGtleU1hcHBpbmc6IEtleU1hcHBpbmcpIHtcclxuICAgIGxldCBlbnRpdHlNZW1vID0gdGhpcztcclxuICAgIGxldCB0eXBlID0gZW50aXR5TWVtby5lbnRpdHkuZW50aXR5VHlwZTtcclxuICAgIGxldCBma1Byb3BzID0gdHlwZS5mb3JlaWduS2V5UHJvcGVydGllcztcclxuICAgIGZrUHJvcHMuZm9yRWFjaChma1Byb3AgPT4ge1xyXG4gICAgICBpZiAoZmtQcm9wLnBhcmVudFR5cGUubmFtZSA9PT0ga2V5TWFwcGluZy5lbnRpdHlUeXBlTmFtZSAmJlxyXG4gICAgICAgIGVudGl0eU1lbW8ucGVuZGluZ0NoYW5nZXNbZmtQcm9wLm5hbWVdID09PSBrZXlNYXBwaW5nLnRlbXBWYWx1ZSkge1xyXG4gICAgICAgIGVudGl0eU1lbW8ucGVuZGluZ0NoYW5nZXNbZmtQcm9wLm5hbWVdID0ga2V5TWFwcGluZy5yZWFsVmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gdXBkYXRlIHRoZSBlbnRpdHlNZW1vIG9mIGNoYW5nZXMgdG8gYW4gZW50aXR5IGJlaW5nIHNhdmVkXHJcbiAgLy8gc28gdGhhdCB3ZSBrbm93IGhvdyB0byBzYXZlIGl0IGFnYWluIGxhdGVyXHJcbiAgdXBkYXRlKCkge1xyXG4gICAgbGV0IGVudGl0eU1lbW8gPSB0aGlzO1xyXG4gICAgbGV0IHByb3BzO1xyXG4gICAgbGV0IGVudGl0eSA9IGVudGl0eU1lbW8uZW50aXR5O1xyXG4gICAgbGV0IGFzcGVjdCA9IGVudGl0eS5lbnRpdHlBc3BlY3Q7XHJcbiAgICBsZXQgc3RhdGVOYW1lID0gYXNwZWN0LmVudGl0eVN0YXRlLm5hbWU7XHJcbiAgICBzd2l0Y2ggKHN0YXRlTmFtZSkge1xyXG4gICAgICBjYXNlICdBZGRlZCc6XHJcbiAgICAgICAgbGV0IG9yaWdpbmFsVmFsdWVzID0gYXNwZWN0Lm9yaWdpbmFsVmFsdWVzO1xyXG4gICAgICAgIHByb3BzID0gZW50aXR5LmVudGl0eVR5cGUuZGF0YVByb3BlcnRpZXM7XHJcbiAgICAgICAgcHJvcHMuZm9yRWFjaChkcCA9PiB7XHJcbiAgICAgICAgICBpZiAoZHAuaXNQYXJ0T2ZLZXkpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgICBsZXQgbmFtZSA9IGRwLm5hbWU7XHJcbiAgICAgICAgICBsZXQgdmFsdWUgPSBlbnRpdHkuZ2V0UHJvcGVydHkobmFtZSk7XHJcbiAgICAgICAgICBpZiAob3JpZ2luYWxWYWx1ZXNbbmFtZV0gIT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGVudGl0eU1lbW8ucGVuZGluZ0NoYW5nZXNbbmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ0RlbGV0ZWQnOlxyXG4gICAgICAgIGVudGl0eU1lbW8uaXNEZWxldGVkID0gdHJ1ZTtcclxuICAgICAgICBlbnRpdHlNZW1vLnBlbmRpbmdDaGFuZ2VzID0ge307XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdNb2RpZmllZCc6XHJcbiAgICAgICAgcHJvcHMgPSBPYmplY3Qua2V5cyhhc3BlY3Qub3JpZ2luYWxWYWx1ZXMpO1xyXG4gICAgICAgIHByb3BzLmZvckVhY2gobmFtZSA9PiB7XHJcbiAgICAgICAgICBlbnRpdHlNZW1vLnBlbmRpbmdDaGFuZ2VzW25hbWVdID0gZW50aXR5LmdldFByb3BlcnR5KG5hbWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|