UNPKG

@jsonforms/angular

Version:

Angular module of JSON Forms

204 lines (200 loc) 30.3 kB
/* The MIT License Copyright (c) 2017-2020 EclipseSource Munich https://github.com/eclipsesource/jsonforms Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import { Actions, configReducer, coreReducer, generateDefaultUISchema, generateJsonSchema, i18nReducer, setConfig, uischemaRegistryReducer, updateI18n, defaultMiddleware, } from '@jsonforms/core'; import { BehaviorSubject } from 'rxjs'; import cloneDeep from 'lodash/cloneDeep'; export const USE_STATE_VALUE = Symbol('Marker to use state value'); export class JsonFormsAngularService { _state; state; middleware; init(initialState = { core: { data: undefined, schema: undefined, uischema: undefined, validationMode: 'ValidateAndShow', additionalErrors: undefined, }, }, middleware = defaultMiddleware) { this.middleware = middleware; this._state = initialState; this._state.config = configReducer(undefined, setConfig(this._state.config)); this._state.i18n = i18nReducer(this._state.i18n, updateI18n(this._state.i18n?.locale, this._state.i18n?.translate, this._state.i18n?.translateError)); this.state = new BehaviorSubject({ jsonforms: this._state }); const data = initialState.core.data; const schema = initialState.core.schema ?? generateJsonSchema(data); const uischema = initialState.core.uischema ?? generateDefaultUISchema(schema); this.updateCore(Actions.init(data, schema, uischema)); } get $state() { if (!this.state) { throw new Error('Please call init first!'); } return this.state.asObservable(); } /** * @deprecated use {@link JsonFormsAngularService.addRenderer} */ registerRenderer(renderer, tester) { this.addRenderer(renderer, tester); } addRenderer(renderer, tester) { this._state.renderers.push({ renderer, tester }); this.updateSubject(); } /** * @deprecated use {@link JsonFormsAngularService.setRenderer} */ registerRenderers(renderers) { this.setRenderers(renderers); } setRenderers(renderers) { this._state.renderers = renderers; this.updateSubject(); } /** * @deprecated use {@link JsonFormsAngularService.removeRenderer} */ unregisterRenderer(tester) { this.removeRenderer(tester); } removeRenderer(tester) { const findIndex = this._state.renderers.findIndex((v) => v.tester === tester); if (findIndex === -1) { return; } const renderers = this._state.renderers.filter((v) => v.tester !== tester); this._state.renderers = renderers; this.updateSubject(); } updateValidationMode(validationMode) { const coreState = this.middleware(this._state.core, Actions.setValidationMode(validationMode), coreReducer); this._state.core = coreState; this.updateSubject(); } updateI18n(i18nAction) { const i18nState = i18nReducer(this._state.i18n, i18nAction); if (i18nState !== this._state.i18n) { this._state.i18n = i18nState; this.updateSubject(); } return i18nAction; } updateCore(coreAction) { const coreState = this.middleware(this._state.core, coreAction, coreReducer); if (coreState !== this._state.core) { this._state.core = coreState; this.updateSubject(); } return coreAction; } /** * @deprecated use {@link JsonFormsAngularService.setUiSchemas} */ updateUiSchema(uischemaAction) { const uischemaState = uischemaRegistryReducer(this._state.uischemas, uischemaAction); this._state.uischemas = uischemaState; this.updateSubject(); return uischemaAction; } setUiSchemas(uischemas) { this._state.uischemas = uischemas; this.updateSubject(); } updateConfig(setConfigAction) { const configState = configReducer(this._state.config, setConfigAction); this._state.config = configState; this.updateSubject(); return setConfigAction; } setUiSchema(uischema) { const newUiSchema = uischema ?? generateDefaultUISchema(this._state.core.schema); const coreState = this.middleware(this._state.core, Actions.updateCore(this._state.core.data, this._state.core.schema, newUiSchema), coreReducer); if (coreState !== this._state.core) { this._state.core = coreState; this.updateSubject(); } } setSchema(schema) { const coreState = this.middleware(this._state.core, Actions.updateCore(this._state.core.data, schema ?? generateJsonSchema(this._state.core.data), this._state.core.uischema), coreReducer); if (coreState !== this._state.core) { this._state.core = coreState; this.updateSubject(); } } setData(data) { const coreState = this.middleware(this._state.core, Actions.updateCore(data, this._state.core.schema, this._state.core.uischema), coreReducer); if (coreState !== this._state.core) { this._state.core = coreState; this.updateSubject(); } } getLocale() { return this._state.i18n?.locale; } setLocale(locale) { this._state.i18n.locale = locale; this.updateSubject(); } setReadonly(readonly) { this._state.readonly = readonly; this.updateSubject(); } setMiddleware(middleware) { this._state.middleware = middleware; this.updateSubject(); } getState() { return cloneDeep({ jsonforms: this._state }); } getConfig() { return cloneDeep(this._state.config); } refresh() { this.updateSubject(); } updateCoreState(data, schema, uischema, ajv, validationMode, additionalErrors) { const newData = data === USE_STATE_VALUE ? this._state.core.data : data; const newSchema = schema === USE_STATE_VALUE ? this._state.core.schema : schema ?? generateJsonSchema(newData); const newUischema = uischema === USE_STATE_VALUE ? this._state.core.uischema : uischema ?? generateDefaultUISchema(newSchema); const newAjv = ajv === USE_STATE_VALUE ? this._state.core.ajv : ajv; const newValidationMode = validationMode === USE_STATE_VALUE ? this._state.core.validationMode : validationMode; const newAdditionalErrors = additionalErrors === USE_STATE_VALUE ? this._state.core.additionalErrors : additionalErrors; this.updateCore(Actions.updateCore(newData, newSchema, newUischema, { ajv: newAjv, validationMode: newValidationMode, additionalErrors: newAdditionalErrors, })); } updateSubject() { this.state.next({ jsonforms: this._state }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbmZvcm1zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGlicmFyeS9qc29uZm9ybXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUF1QkU7QUFDRixPQUFPLEVBQ0wsT0FBTyxFQUNQLGFBQWEsRUFFYixXQUFXLEVBQ1gsdUJBQXVCLEVBQ3ZCLGtCQUFrQixFQUNsQixXQUFXLEVBT1gsU0FBUyxFQUlULHVCQUF1QixFQUd2QixVQUFVLEVBRVYsaUJBQWlCLEdBQ2xCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUduRCxPQUFPLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQztBQUl6QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUM7QUFDbkUsTUFBTSxPQUFPLHVCQUF1QjtJQUMxQixNQUFNLENBQXFCO0lBQzNCLEtBQUssQ0FBa0M7SUFDdkMsVUFBVSxDQUFhO0lBRS9CLElBQUksQ0FDRixlQUFtQztRQUNqQyxJQUFJLEVBQUU7WUFDSixJQUFJLEVBQUUsU0FBUztZQUNmLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLFFBQVEsRUFBRSxTQUFTO1lBQ25CLGNBQWMsRUFBRSxpQkFBaUI7WUFDakMsZ0JBQWdCLEVBQUUsU0FBUztTQUM1QjtLQUNGLEVBQ0QsYUFBeUIsaUJBQWlCO1FBRTFDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FDaEMsU0FBUyxFQUNULFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUM5QixDQUFDO1FBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJ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LENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckQsTUFBTSxNQUFNLEdBQUcsR0FBRyxLQUFLLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDcEUsTUFBTSxpQkFBaUIsR0FDckIsY0FBYyxLQUFLLGVBQWU7WUFDaEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWM7WUFDakMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztRQUNyQixNQUFNLG1CQUFtQixHQUN2QixnQkFBZ0IsS0FBSyxlQUFlO1lBQ2xDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7WUFDbkMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQ2IsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRTtZQUNsRCxHQUFHLEVBQUUsTUFBTTtZQUNYLGNBQWMsRUFBRSxpQkFBaUI7WUFDakMsZ0JBQWdCLEVBQUUsbUJBQW1CO1NBQ3RDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVPLGFBQWE7UUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgVGhlIE1JVCBMaWNlbnNlXG4gIFxuICBDb3B5cmlnaHQgKGMpIDIwMTctMjAyMCBFY2xpcHNlU291cmNlIE11bmljaFxuICBodHRwczovL2dpdGh1Yi5jb20vZWNsaXBzZXNvdXJjZS9qc29uZm9ybXNcbiAgXG4gIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gIFxuICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAgXG4gIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAgVEhFIFNPRlRXQVJFLlxuKi9cbmltcG9ydCB7XG4gIEFjdGlvbnMsXG4gIGNvbmZpZ1JlZHVjZXIsXG4gIENvcmVBY3Rpb25zLFxuICBjb3JlUmVkdWNlcixcbiAgZ2VuZXJhdGVEZWZhdWx0VUlTY2hlbWEsXG4gIGdlbmVyYXRlSnNvblNjaGVtYSxcbiAgaTE4blJlZHVjZXIsXG4gIEpzb25Gb3Jtc1JlbmRlcmVyUmVnaXN0cnlFbnRyeSxcbiAgSnNvbkZvcm1zU3RhdGUsXG4gIEpzb25Gb3Jtc1N1YlN0YXRlcyxcbiAgSnNvblNjaGVtYSxcbiAgSTE4bkFjdGlvbnMsXG4gIFJhbmtlZFRlc3RlcixcbiAgc2V0Q29uZmlnLFxuICBTZXRDb25maWdBY3Rpb24sXG4gIFVJU2NoZW1hQWN0aW9ucyxcbiAgVUlTY2hlbWFFbGVtZW50LFxuICB1aXNjaGVtYVJlZ2lzdHJ5UmVkdWNlcixcbiAgVUlTY2hlbWFUZXN0ZXIsXG4gIFZhbGlkYXRpb25Nb2RlLFxuICB1cGRhdGVJMThuLFxuICBNaWRkbGV3YXJlLFxuICBkZWZhdWx0TWlkZGxld2FyZSxcbn0gZnJvbSAnQGpzb25mb3Jtcy9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHR5cGUgeyBKc29uRm9ybXNCYXNlUmVuZGVyZXIgfSBmcm9tICcuL2Jhc2UucmVuZGVyZXInO1xuXG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC9jbG9uZURlZXAnO1xuaW1wb3J0IHR5cGUgQWp2IGZyb20gJ2Fqdic7XG5pbXBvcnQgdHlwZSB7IEVycm9yT2JqZWN0IH0gZnJvbSAnYWp2JztcblxuZXhwb3J0IGNvbnN0IFVTRV9TVEFURV9WQUxVRSA9IFN5bWJvbCgnTWFya2VyIHRvIHVzZSBzdGF0ZSB2YWx1ZScpO1xuZXhwb3J0IGNsYXNzIEpzb25Gb3Jtc0FuZ3VsYXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfc3RhdGU6IEpzb25Gb3Jtc1N1YlN0YXRlcztcbiAgcHJpdmF0ZSBzdGF0ZTogQmVoYXZpb3JTdWJqZWN0PEpzb25Gb3Jtc1N0YXRlPjtcbiAgcHJpdmF0ZSBtaWRkbGV3YXJlOiBNaWRkbGV3YXJlO1xuXG4gIGluaXQoXG4gICAgaW5pdGlhbFN0YXRlOiBKc29uRm9ybXNTdWJTdGF0ZXMgPSB7XG4gICAgICBjb3JlOiB7XG4gICAgICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgc2NoZW1hOiB1bmRlZmluZWQsXG4gICAgICAgIHVpc2NoZW1hOiB1bmRlZmluZWQsXG4gICAgICAgIHZhbGlkYXRpb25Nb2RlOiAnVmFsaWRhdGVBbmRTaG93JyxcbiAgICAgICAgYWRkaXRpb25hbEVycm9yczogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICB9LFxuICAgIG1pZGRsZXdhcmU6IE1pZGRsZXdhcmUgPSBkZWZhdWx0TWlkZGxld2FyZVxuICApIHtcbiAgICB0aGlzLm1pZGRsZXdhcmUgPSBtaWRkbGV3YXJlO1xuICAgIHRoaXMuX3N0YXRlID0gaW5pdGlhbFN0YXRlO1xuICAgIHRoaXMuX3N0YXRlLmNvbmZpZyA9IGNvbmZpZ1JlZHVjZXIoXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBzZXRDb25maWcodGhpcy5fc3RhdGUuY29uZmlnKVxuICAgICk7XG4gICAgdGhpcy5fc3RhdGUuaTE4biA9IGkxOG5SZWR1Y2VyKFxuICAgICAgdGhpcy5fc3RhdGUuaTE4bixcbiAgICAgIHVwZGF0ZUkxOG4oXG4gICAgICAgIHRoaXMuX3N0YXRlLmkxOG4/LmxvY2FsZSxcbiAgICAgICAgdGhpcy5fc3RhdGUuaTE4bj8udHJhbnNsYXRlLFxuICAgICAgICB0aGlzLl9zdGF0ZS5pMThuPy50cmFuc2xhdGVFcnJvclxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdGF0ZSA9IG5ldyBCZWhhdmlvclN1YmplY3QoeyBqc29uZm9ybXM6IHRoaXMuX3N0YXRlIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBpbml0aWFsU3RhdGUuY29yZS5kYXRhO1xuICAgIGNvbnN0IHNjaGVtYSA9IGluaXRpYWxTdGF0ZS5jb3JlLnNjaGVtYSA/PyBnZW5lcmF0ZUpzb25TY2hlbWEoZGF0YSk7XG4gICAgY29uc3QgdWlzY2hlbWEgPVxuICAgICAgaW5pdGlhbFN0YXRlLmNvcmUudWlzY2hlbWEgPz8gZ2VuZXJhdGVEZWZhdWx0VUlTY2hlbWEoc2NoZW1hKTtcbiAgICB0aGlzLnVwZGF0ZUNvcmUoQWN0aW9ucy5pbml0KGRhdGEsIHNjaGVtYSwgdWlzY2hlbWEpKTtcbiAgfVxuXG4gIGdldCAkc3RhdGUoKTogT2JzZXJ2YWJsZTxKc29uRm9ybXNTdGF0ZT4ge1xuICAgIGlmICghdGhpcy5zdGF0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgY2FsbCBpbml0IGZpcnN0IScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIEpzb25Gb3Jtc0FuZ3VsYXJTZXJ2aWNlLmFkZFJlbmRlcmVyfVxuICAgKi9cbiAgcmVnaXN0ZXJSZW5kZXJlcihcbiAgICByZW5kZXJlcjogSnNvbkZvcm1zQmFzZVJlbmRlcmVyPFVJU2NoZW1hRWxlbWVudD4sXG4gICAgdGVzdGVyOiBSYW5rZWRUZXN0ZXJcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5hZGRSZW5kZXJlcihyZW5kZXJlciwgdGVzdGVyKTtcbiAgfVxuICBhZGRSZW5kZXJlcihcbiAgICByZW5kZXJlcjogSnNvbkZvcm1zQmFzZVJlbmRlcmVyPFVJU2NoZW1hRWxlbWVudD4sXG4gICAgdGVzdGVyOiBSYW5rZWRUZXN0ZXJcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdGUucmVuZGVyZXJzLnB1c2goeyByZW5kZXJlciwgdGVzdGVyIH0pO1xuICAgIHRoaXMudXBkYXRlU3ViamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgSnNvbkZvcm1zQW5ndWxhclNlcnZpY2Uuc2V0UmVuZGVyZXJ9XG4gICAqL1xuICByZWdpc3RlclJlbmRlcmVycyhyZW5kZXJlcnM6IEpzb25Gb3Jtc1JlbmRlcmVyUmVnaXN0cnlFbnRyeVtdKTogdm9pZCB7XG4gICAgdGhpcy5zZXRSZW5kZXJlcnMocmVuZGVyZXJzKTtcbiAgfVxuICBzZXRSZW5kZXJlcnMocmVuZGVyZXJzOiBKc29uRm9ybXNSZW5kZXJlclJlZ2lzdHJ5RW50cnlbXSk6IHZvaWQge1xuICAgIHRoaXMuX3N0YXRlLnJlbmRlcmVycyA9IHJlbmRlcmVycztcbiAgICB0aGlzLnVwZGF0ZVN1YmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIEpzb25Gb3Jtc0FuZ3VsYXJTZXJ2aWNlLnJlbW92ZVJlbmRlcmVyfVxuICAgKi9cbiAgdW5yZWdpc3RlclJlbmRlcmVyKHRlc3RlcjogUmFua2VkVGVzdGVyKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVSZW5kZXJlcih0ZXN0ZXIpO1xuICB9XG4gIHJlbW92ZVJlbmRlcmVyKHRlc3RlcjogUmFua2VkVGVzdGVyKTogdm9pZCB7XG4gICAgY29uc3QgZmluZEluZGV4ID0gdGhpcy5fc3RhdGUucmVuZGVyZXJzLmZpbmRJbmRleChcbiAgICAgICh2KSA9PiB2LnRlc3RlciA9PT0gdGVzdGVyXG4gICAgKTtcbiAgICBpZiAoZmluZEluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZW5kZXJlcnMgPSB0aGlzLl9zdGF0ZS5yZW5kZXJlcnMuZmlsdGVyKCh2KSA9PiB2LnRlc3RlciAhPT0gdGVzdGVyKTtcbiAgICB0aGlzLl9zdGF0ZS5yZW5kZXJlcnMgPSByZW5kZXJlcnM7XG4gICAgdGhpcy51cGRhdGVTdWJqZWN0KCk7XG4gIH1cblxuICB1cGRhdGVWYWxpZGF0aW9uTW9kZSh2YWxpZGF0aW9uTW9kZTogVmFsaWRhdGlvbk1vZGUpOiB2b2lkIHtcbiAgICBjb25zdCBjb3JlU3RhdGUgPSB0aGlzLm1pZGRsZXdhcmUoXG4gICAgICB0aGlzLl9zdGF0ZS5jb3JlLFxuICAgICAgQWN0aW9ucy5zZXRWYWxpZGF0aW9uTW9kZSh2YWxpZGF0aW9uTW9kZSksXG4gICAgICBjb3JlUmVkdWNlclxuICAgICk7XG4gICAgdGhpcy5fc3RhdGUuY29yZSA9IGNvcmVTdGF0ZTtcbiAgICB0aGlzLnVwZGF0ZVN1YmplY3QoKTtcbiAgfVxuXG4gIHVwZGF0ZUkxOG48VCBleHRlbmRzIEkxOG5BY3Rpb25zPihpMThuQWN0aW9uOiBUKTogVCB7XG4gICAgY29uc3QgaTE4blN0YXRlID0gaTE4blJlZHVjZXIodGhpcy5fc3RhdGUuaTE4biwgaTE4bkFjdGlvbik7XG4gICAgaWYgKGkxOG5TdGF0ZSAhPT0gdGhpcy5fc3RhdGUuaTE4bikge1xuICAgICAgdGhpcy5fc3RhdGUuaTE4biA9IGkxOG5TdGF0ZTtcbiAgICAgIHRoaXMudXBkYXRlU3ViamVjdCgpO1xuICAgIH1cbiAgICByZXR1cm4gaTE4bkFjdGlvbjtcbiAgfVxuXG4gIHVwZGF0ZUNvcmU8VCBleHRlbmRzIENvcmVBY3Rpb25zPihjb3JlQWN0aW9uOiBUKTogVCB7XG4gICAgY29uc3QgY29yZVN0YXRlID0gdGhpcy5taWRkbGV3YXJlKFxuICAgICAgdGhpcy5fc3RhdGUuY29yZSxcbiAgICAgIGNvcmVBY3Rpb24sXG4gICAgICBjb3JlUmVkdWNlclxuICAgICk7XG4gICAgaWYgKGNvcmVTdGF0ZSAhPT0gdGhpcy5fc3RhdGUuY29yZSkge1xuICAgICAgdGhpcy5fc3RhdGUuY29yZSA9IGNvcmVTdGF0ZTtcbiAgICAgIHRoaXMudXBkYXRlU3ViamVjdCgpO1xuICAgIH1cbiAgICByZXR1cm4gY29yZUFjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIEpzb25Gb3Jtc0FuZ3VsYXJTZXJ2aWNlLnNldFVpU2NoZW1hc31cbiAgICovXG4gIHVwZGF0ZVVpU2NoZW1hPFQgZXh0ZW5kcyBVSVNjaGVtYUFjdGlvbnM+KHVpc2NoZW1hQWN0aW9uOiBUKTogVCB7XG4gICAgY29uc3QgdWlzY2hlbWFTdGF0ZSA9IHVpc2NoZW1hUmVnaXN0cnlSZWR1Y2VyKFxuICAgICAgdGhpcy5fc3RhdGUudWlzY2hlbWFzLFxuICAgICAgdWlzY2hlbWFBY3Rpb25cbiAgICApO1xuICAgIHRoaXMuX3N0YXRlLnVpc2NoZW1hcyA9IHVpc2NoZW1hU3RhdGU7XG4gICAgdGhpcy51cGRhdGVTdWJqZWN0KCk7XG4gICAgcmV0dXJuIHVpc2NoZW1hQWN0aW9uO1xuICB9XG5cbiAgc2V0VWlTY2hlbWFzKFxuICAgIHVpc2NoZW1hczogeyB0ZXN0ZXI6IFVJU2NoZW1hVGVzdGVyOyB1aXNjaGVtYTogVUlTY2hlbWFFbGVtZW50IH1bXVxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9zdGF0ZS51aXNjaGVtYXMgPSB1aXNjaGVtYXM7XG4gICAgdGhpcy51cGRhdGVTdWJqZWN0KCk7XG4gIH1cblxuICB1cGRhdGVDb25maWc8VCBleHRlbmRzIFNldENvbmZpZ0FjdGlvbj4oc2V0Q29uZmlnQWN0aW9uOiBUKTogVCB7XG4gICAgY29uc3QgY29uZmlnU3RhdGUgPSBjb25maWdSZWR1Y2VyKHRoaXMuX3N0YXRlLmNvbmZpZywgc2V0Q29uZmlnQWN0aW9uKTtcbiAgICB0aGlzLl9zdGF0ZS5jb25maWcgPSBjb25maWdTdGF0ZTtcbiAgICB0aGlzLnVwZGF0ZVN1YmplY3QoKTtcbiAgICByZXR1cm4gc2V0Q29uZmlnQWN0aW9uO1xuICB9XG5cbiAgc2V0VWlTY2hlbWEodWlzY2hlbWE6IFVJU2NoZW1hRWxlbWVudCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGNvbnN0IG5ld1VpU2NoZW1hID1cbiAgICAgIHVpc2NoZW1hID8/IGdlbmVyYXRlRGVmYXVsdFVJU2NoZW1hKHRoaXMuX3N0YXRlLmNvcmUuc2NoZW1hKTtcbiAgICBjb25zdCBjb3JlU3RhdGUgPSB0aGlzLm1pZGRsZXdhcmUoXG4gICAgICB0aGlzLl9zdGF0ZS5jb3JlLFxuICAgICAgQWN0aW9ucy51cGRhdGVDb3JlKFxuICAgICAgICB0aGlzLl9zdGF0ZS5jb3JlLmRhdGEsXG4gICAgICAgIHRoaXMuX3N0YXRlLmNvcmUuc2NoZW1hLFxuICAgICAgICBuZXdVaVNjaGVtYVxuICAgICAgKSxcbiAgICAgIGNvcmVSZWR1Y2VyXG4gICAgKTtcbiAgICBpZiAoY29yZVN0YXRlICE9PSB0aGlzLl9zdGF0ZS5jb3JlKSB7XG4gICAgICB0aGlzLl9zdGF0ZS5jb3JlID0gY29yZVN0YXRlO1xuICAgICAgdGhpcy51cGRhdGVTdWJqZWN0KCk7XG4gICAgfVxuICB9XG5cbiAgc2V0U2NoZW1hKHNjaGVtYTogSnNvblNjaGVtYSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGNvbnN0IGNvcmVTdGF0ZSA9IHRoaXMubWlkZGxld2FyZShcbiAgICAgIHRoaXMuX3N0YXRlLmNvcmUsXG4gICAgICBBY3Rpb25zLnVwZGF0ZUNvcmUoXG4gICAgICAgIHRoaXMuX3N0YXRlLmNvcmUuZGF0YSxcbiAgICAgICAgc2NoZW1hID8/IGdlbmVyYXRlSnNvblNjaGVtYSh0aGlzLl9zdGF0ZS5jb3JlLmRhdGEpLFxuICAgICAgICB0aGlzLl9zdGF0ZS5jb3JlLnVpc2NoZW1hXG4gICAgICApLFxuICAgICAgY29yZVJlZHVjZXJcbiAgICApO1xuICAgIGlmIChjb3JlU3RhdGUgIT09IHRoaXMuX3N0YXRlLmNvcmUpIHtcbiAgICAgIHRoaXMuX3N0YXRlLmNvcmUgPSBjb3JlU3RhdGU7XG4gICAgICB0aGlzLnVwZGF0ZVN1YmplY3QoKTtcbiAgICB9XG4gIH1cblxuICBzZXREYXRhKGRhdGE6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGNvcmVTdGF0ZSA9IHRoaXMubWlkZGxld2FyZShcbiAgICAgIHRoaXMuX3N0YXRlLmNvcmUsXG4gICAgICBBY3Rpb25zLnVwZGF0ZUNvcmUoXG4gICAgICAgIGRhdGEsXG4gICAgICAgIHRoaXMuX3N0YXRlLmNvcmUuc2NoZW1hLFxuICAgICAgICB0aGlzLl9zdGF0ZS5jb3JlLnVpc2NoZW1hXG4gICAgICApLFxuICAgICAgY29yZVJlZHVjZXJcbiAgICApO1xuICAgIGlmIChjb3JlU3RhdGUgIT09IHRoaXMuX3N0YXRlLmNvcmUpIHtcbiAgICAgIHRoaXMuX3N0YXRlLmNvcmUgPSBjb3JlU3RhdGU7XG4gICAgICB0aGlzLnVwZGF0ZVN1YmplY3QoKTtcbiAgICB9XG4gIH1cblxuICBnZXRMb2NhbGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUuaTE4bj8ubG9jYWxlO1xuICB9XG5cbiAgc2V0TG9jYWxlKGxvY2FsZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdGUuaTE4bi5sb2NhbGUgPSBsb2NhbGU7XG4gICAgdGhpcy51cGRhdGVTdWJqZWN0KCk7XG4gIH1cblxuICBzZXRSZWFkb25seShyZWFkb25seTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX3N0YXRlLnJlYWRvbmx5ID0gcmVhZG9ubHk7XG4gICAgdGhpcy51cGRhdGVTdWJqZWN0KCk7XG4gIH1cblxuICBzZXRNaWRkbGV3YXJlKG1pZGRsZXdhcmU6IE1pZGRsZXdhcmUpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGF0ZS5taWRkbGV3YXJlID0gbWlkZGxld2FyZTtcbiAgICB0aGlzLnVwZGF0ZVN1YmplY3QoKTtcbiAgfVxuXG4gIGdldFN0YXRlKCk6IEpzb25Gb3Jtc1N0YXRlIHtcbiAgICByZXR1cm4gY2xvbmVEZWVwKHsganNvbmZvcm1zOiB0aGlzLl9zdGF0ZSB9KTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBhbnkge1xuICAgIHJldHVybiBjbG9uZURlZXAodGhpcy5fc3RhdGUuY29uZmlnKTtcbiAgfVxuXG4gIHJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVTdWJqZWN0KCk7XG4gIH1cblxuICB1cGRhdGVDb3JlU3RhdGUoXG4gICAgZGF0YTogYW55IHwgdHlwZW9mIFVTRV9TVEFURV9WQUxVRSxcbiAgICBzY2hlbWE6IEpzb25TY2hlbWEgfCB0eXBlb2YgVVNFX1NUQVRFX1ZBTFVFLFxuICAgIHVpc2NoZW1hOiBVSVNjaGVtYUVsZW1lbnQgfCB0eXBlb2YgVVNFX1NUQVRFX1ZBTFVFLFxuICAgIGFqdjogQWp2IHwgdHlwZW9mIFVTRV9TVEFURV9WQUxVRSxcbiAgICB2YWxpZGF0aW9uTW9kZTogVmFsaWRhdGlvbk1vZGUgfCB0eXBlb2YgVVNFX1NUQVRFX1ZBTFVFLFxuICAgIGFkZGl0aW9uYWxFcnJvcnM6IEVycm9yT2JqZWN0W10gfCB0eXBlb2YgVVNFX1NUQVRFX1ZBTFVFXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG5ld0RhdGEgPSBkYXRhID09PSBVU0VfU1RBVEVfVkFMVUUgPyB0aGlzLl9zdGF0ZS5jb3JlLmRhdGEgOiBkYXRhO1xuICAgIGNvbnN0IG5ld1NjaGVtYSA9XG4gICAgICBzY2hlbWEgPT09IFVTRV9TVEFURV9WQUxVRVxuICAgICAgICA/IHRoaXMuX3N0YXRlLmNvcmUuc2NoZW1hXG4gICAgICAgIDogc2NoZW1hID8/IGdlbmVyYXRlSnNvblNjaGVtYShuZXdEYXRhKTtcbiAgICBjb25zdCBuZXdVaXNjaGVtYSA9XG4gICAgICB1aXNjaGVtYSA9PT0gVVNFX1NUQVRFX1ZBTFVFXG4gICAgICAgID8gdGhpcy5fc3RhdGUuY29yZS51aXNjaGVtYVxuICAgICAgICA6IHVpc2NoZW1hID8/IGdlbmVyYXRlRGVmYXVsdFVJU2NoZW1hKG5ld1NjaGVtYSk7XG4gICAgY29uc3QgbmV3QWp2ID0gYWp2ID09PSBVU0VfU1RBVEVfVkFMVUUgPyB0aGlzLl9zdGF0ZS5jb3JlLmFqdiA6IGFqdjtcbiAgICBjb25zdCBuZXdWYWxpZGF0aW9uTW9kZSA9XG4gICAgICB2YWxpZGF0aW9uTW9kZSA9PT0gVVNFX1NUQVRFX1ZBTFVFXG4gICAgICAgID8gdGhpcy5fc3RhdGUuY29yZS52YWxpZGF0aW9uTW9kZVxuICAgICAgICA6IHZhbGlkYXRpb25Nb2RlO1xuICAgIGNvbnN0IG5ld0FkZGl0aW9uYWxFcnJvcnMgPVxuICAgICAgYWRkaXRpb25hbEVycm9ycyA9PT0gVVNFX1NUQVRFX1ZBTFVFXG4gICAgICAgID8gdGhpcy5fc3RhdGUuY29yZS5hZGRpdGlvbmFsRXJyb3JzXG4gICAgICAgIDogYWRkaXRpb25hbEVycm9ycztcbiAgICB0aGlzLnVwZGF0ZUNvcmUoXG4gICAgICBBY3Rpb25zLnVwZGF0ZUNvcmUobmV3RGF0YSwgbmV3U2NoZW1hLCBuZXdVaXNjaGVtYSwge1xuICAgICAgICBhanY6IG5ld0FqdixcbiAgICAgICAgdmFsaWRhdGlvbk1vZGU6IG5ld1ZhbGlkYXRpb25Nb2RlLFxuICAgICAgICBhZGRpdGlvbmFsRXJyb3JzOiBuZXdBZGRpdGlvbmFsRXJyb3JzLFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdWJqZWN0KCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUubmV4dCh7IGpzb25mb3JtczogdGhpcy5fc3RhdGUgfSk7XG4gIH1cbn1cbiJdfQ==