diff --git a/build/.eslintrc.cjs b/build/.eslintrc.cjs deleted file mode 100644 index 4609e2e..0000000 --- a/build/.eslintrc.cjs +++ /dev/null @@ -1,39 +0,0 @@ -module.exports = { - root: true, - env: { - es2021: true, - node: true, - }, - parser: "@typescript-eslint/parser", - parserOptions: { - project: "tsconfig.json", - tsconfigRootDir: __dirname, - }, - plugins: ["import", "@typescript-eslint", "simple-import-sort"], - extends: [ - "eslint:recommended", - "plugin:eslint-comments/recommended", - "plugin:import/recommended", - "plugin:import/typescript", - "prettier", - ], - settings: { - "import/resolver": { - typescript: { - project: "tsconfig.json", - tsconfigRootDir: __dirname, - }, - }, - }, - rules: { - "simple-import-sort/imports": "error", - "simple-import-sort/exports": "error", - "import/no-mutable-exports": "error", - "import/no-unused-modules": "error", - "no-undef": "off", - "no-prototype-builtins": "off", - "no-dupe-class-members": "off", - "@typescript-eslint/no-floating-promises": "error", - "no-unused-vars": "warn" - } -}; diff --git a/build/LICENSE b/build/LICENSE deleted file mode 100644 index 9a671be..0000000 --- a/build/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 Ahash Sritharan - -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. diff --git a/build/dist/src/TemplateFunctions.d.ts b/build/dist/src/TemplateFunctions.d.ts deleted file mode 100644 index 34ff55f..0000000 --- a/build/dist/src/TemplateFunctions.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -/// -/// -declare namespace Theia { - namespace TemplateFunctions { - function Init(executionContext: Xrm.FormContext | Xrm.Events.EventContext): Promise; - function OnLoad(executionContext: Xrm.FormContext | Xrm.Events.EventContext): Promise; - } -} diff --git a/build/dist/src/TemplateFunctions.js b/build/dist/src/TemplateFunctions.js deleted file mode 100644 index f195082..0000000 --- a/build/dist/src/TemplateFunctions.js +++ /dev/null @@ -1,257 +0,0 @@ -/// -// eslint-disable-next-line no-unused-vars -var Theia; -(function (Theia) { - let TemplateFunctions; - (function (TemplateFunctions) { - var formContext; - class Fields { - Firstname = new XrmEx.TextField("firstname"); - Lastname = new XrmEx.TextField("lastname"); - JobTitle = new XrmEx.TextField("jobtitle"); - PreferredContactMethod = new XrmEx.OptionsetField("preferredcontactmethodcode", { - Any: 1, - Email: 2, - Phone: 3, - Fax: 4, - Mail: 5, - }); - Customer = new XrmEx.LookupField("parentcustomerid"); - BusinessPhone = new XrmEx.TextField("telephone1"); - Gender = new XrmEx.OptionsetField("gendercode"); - Email = new XrmEx.TextField("emailaddress1"); - MobilePhone = new XrmEx.TextField("mobilephone"); - Owner = new XrmEx.LookupField("ownerid"); - DoNotEmail = new XrmEx.BooleanField("donotemail"); - MaritalStatus = new XrmEx.OptionsetField("familystatuscode"); - SpousePartnerName = new XrmEx.TextField("spousesname"); - Birthday = new XrmEx.DateField("birthdate"); - } - class Tabs { - General = new XrmEx.Tab("tab1", { - Section1: new XrmEx.Section("section1"), - Section2: new XrmEx.Section("section2"), - }); - Details = new XrmEx.Tab("tab2", { - Section1: new XrmEx.Section("section1"), - Section2: new XrmEx.Section("section2"), - }); - } - class Grids { - ContactSubgrid = new XrmEx.GridControl("Test"); - } - var fields; - var tabs; - var grids; - async function Init(executionContext) { - if (!XrmEx) { - let errorMessage = "XrmEx is not loaded. Please make sure you have XrmEx.js loaded in your form."; - console.error(errorMessage); - await Xrm.Navigation.openAlertDialog({ - title: "Error", - text: errorMessage, - }); - return; - } - XrmEx.Form.formContext = executionContext; - fields = new Fields(); - tabs = new Tabs(); - grids = new Grids(); - } - TemplateFunctions.Init = Init; - async function OnLoad(executionContext) { - await Init(executionContext); //Ensures XrmEx is only accessed after the OnLoad Event - try { - parent.window.XrmEx = XrmEx; - formContext = XrmEx.Form.formContext; - await sample(); - //Register one or more Functions to execute OnSave - formContext.data.entity.addOnSave(sample); - //BETTER WAY - XrmEx.Form.addOnSaveEventHandler([sample]); - //Register one or more Functions to execute OnChange of multiple fields and execute it immediately - let firstname = formContext.getAttribute("firstname"); - let lastname = formContext.getAttribute("lastname"); - firstname.addOnChange(sample); - firstname.fireOnChange(); - lastname.fireOnChange(); - //BETTER WAY - XrmEx.Form.addOnChangeEventHandler([fields.Firstname, fields.Lastname], [sample], true); - } - catch (error) { - console.error(error); - await XrmEx.openAlertDialog("Error", `Error in Theia.TemplateFunctions.${XrmEx.getMethodName()}\n` + - error.message); - } - /** - * This Framework empowers developers to DO MORE by writing LESS CODE 👈(゚ヮ゚👈) - */ - async function sample() { - try { - //Continue only on Update Form - if (formContext.ui.getFormType() != 2) - return; - //BETTER WAY - if (XrmEx.Form.IsNotUpdate) - return; - //If Firstname is empty, make it required and shows notification on the field - let firstname = formContext.getAttribute("firstname"); - if (!firstname.getValue()) { - firstname.setRequiredLevel("required"); - firstname.controls.forEach((c) => c.setNotification("This property is required", "uniqueId")); - } - //BETTER WAY - if (!fields.Lastname.Value) - fields.Firstname.setRequired(true).setNotification("This property is required", "uniqueId"); - //If Owner has Value and Lastname does not, retrieve it's lastname and set it to Lastname - let ownerid = formContext.getAttribute("ownerid"); - let lastname = formContext.getAttribute("lastname"); - if (ownerid.getValue() && !lastname.getValue()) { - let user = await Xrm.WebApi.retrieveRecord(ownerid.getValue()[0].entityType, ownerid.getValue()[0].id, "?$select=lastname"); - lastname.setValue(user.lastname); - } - //BETTER WAY - if (fields.Owner.Value && !fields.Lastname.Value) { - let user = await fields.Owner.retrieve("?$select=lastname"); - fields.Lastname.Value = user.lastname; - fields.Lastname.setValue(user.lastname); - } - //Set Optionset PreferredContactMethod to Email - fields.PreferredContactMethod.Value = - fields.PreferredContactMethod.Option.Email; - //Add Lookup Filter to Customer and remove it later - let filterFunction = function filterFunction(executionContext) { - let formContext = executionContext.getFormContext(); - let customer = formContext.getAttribute("parentcustomerid"); - customer.controls.forEach((c) => { - c.addCustomFilter(` - - `); - }); - }; - let customer = formContext.getAttribute("parentcustomerid"); - customer.controls.forEach((c) => c.addPreSearch(filterFunction)); - customer.controls.forEach((c) => c.removePreSearch(filterFunction)); - //BETTER WAY - fields.Customer.addPreFilterToLookup(` - - `); - fields.Customer.clearPreFilterFromLookup(); - fields.Lastname.setVisible(false) - .setDisabled(true) - .setRequired(false) - .setNotification("This property is required", "uniqueId"); - //SPECIAL WAY (Go to Definition to see how to achieve this) - //Add Advanced Lookup Filter - await fields.Customer.addPreFilterToLookupAdvanced("contact", "contactid", ` - - - - - - `); - //Execute bound Action - class TestActionContactRequest { - Amount; - Account; - getMetadata() { - return { - boundParameter: "entity", - operationType: 0, - operationName: "theia_TestActionContact", - parameterTypes: { - Amount: { - typeName: "Edm.Int32", - structuralProperty: 1, - }, - Account: { - typeName: "mscrm.account", - structuralProperty: 5, - }, - entity: { - typeName: "mscrm.contact", - structuralProperty: 5, - }, - }, - }; - } - } - let testActionContactRequest = new TestActionContactRequest(); - testActionContactRequest.Amount = 5; - testActionContactRequest.Account = customer.getValue()[0]; - testActionContactRequest["entity"] = - formContext.data.entity.getEntityReference(); - let response = await Xrm.WebApi.online - .execute(testActionContactRequest) - .then(function (response) { - if (response.ok) { - return response.json().catch(() => { - return response; - }); - } - }) - .then((responseBody) => responseBody); - console.log(response); - //BETTER WAY - let response2 = await XrmEx.executeAction("theia_TestActionContact", [ - { Name: "Amount", Type: "Integer", Value: 5 }, - { - Name: "Account", - Type: "EntityReference", - Value: fields.Customer.Value[0], - }, - ], XrmEx.Form.entityReference); - console.log(response2); - //Retrieve EnvironmentVariableValue - class EnvironmentVariableRequest { - DefinitionSchemaName; - constructor(definitionSchemaName) { - this.DefinitionSchemaName = definitionSchemaName; - } - getMetadata() { - return { - boundParameter: null, - operationType: 1, - operationName: "RetrieveEnvironmentVariableValue", - parameterTypes: { - DefinitionSchemaName: { - typeName: "Edm.String", - structuralProperty: 1, - }, - }, - }; - } - } - let environmentVariableRequest = new EnvironmentVariableRequest("theia_Test"); - let value = await Xrm.WebApi.online - .execute(environmentVariableRequest) - .then(function (response) { - if (response.ok) { - return response.json().catch(() => { - return response; - }); - } - }) - .then((responseBody) => responseBody); - console.log(value); - //BETTER WAY - let value2 = await XrmEx.getEnvironmentVariableValue("theia_Test"); - console.log(value2); - /** - * How to access Propoerties described in Microsofts Documentation - */ - /** You can access all Form Context Functions here: @see https://docs.microsoft.com/en-us/power-apps/developer/model-driven-apps/clientapi/clientapi-form-context*/ - XrmEx.Form.formContext.data.isValid(); - /** You can access all Column Functions here: @see https://docs.microsoft.com/en-us/power-apps/developer/model-driven-apps/clientapi/reference/attributes*/ - fields.Birthday.Attribute.getIsDirty(); - } - catch (error) { - console.error(error); - throw new Error(`.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - } - TemplateFunctions.OnLoad = OnLoad; - })(TemplateFunctions = Theia.TemplateFunctions || (Theia.TemplateFunctions = {})); -})(Theia || (Theia = {})); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVtcGxhdGVGdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvVGVtcGxhdGVGdW5jdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUNBQWlDO0FBRWpDLDBDQUEwQztBQUMxQyxJQUFVLEtBQUssQ0EyU2Q7QUEzU0QsV0FBVSxLQUFLO0lBQ2IsSUFBaUIsaUJBQWlCLENBeVNqQztJQXpTRCxXQUFpQixpQkFBaUI7UUFDaEMsSUFBSSxXQUE0QixDQUFDO1FBQ2pDLE1BQU0sTUFBTTtZQUNWLFNBQVMsR0FBRyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDN0MsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMzQyxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzNDLHNCQUFzQixHQUFHLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FDL0MsNEJBQTRCLEVBQzVCO2dCQUNFLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEtBQUssRUFBRSxDQUFDO2dCQUNSLEtBQUssRUFBRSxDQUFDO2dCQUNSLEdBQUcsRUFBRSxDQUFDO2dCQUNOLElBQUksRUFBRSxDQUFDO2FBQ1IsQ0FDRixDQUFDO1lBQ0YsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3JELGFBQWEsR0FBRyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbEQsTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNoRCxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzdDLFdBQVcsR0FBRyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7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ZXJlbmNlIHBhdGg9XCJYcm1FeC50c1wiIC8+XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xubmFtZXNwYWNlIFRoZWlhIHtcbiAgZXhwb3J0IG5hbWVzcGFjZSBUZW1wbGF0ZUZ1bmN0aW9ucyB7XG4gICAgdmFyIGZvcm1Db250ZXh0OiBYcm0uRm9ybUNvbnRleHQ7XG4gICAgY2xhc3MgRmllbGRzIHtcbiAgICAgIEZpcnN0bmFtZSA9IG5ldyBYcm1FeC5UZXh0RmllbGQoXCJmaXJzdG5hbWVcIik7XG4gICAgICBMYXN0bmFtZSA9IG5ldyBYcm1FeC5UZXh0RmllbGQoXCJsYXN0bmFtZVwiKTtcbiAgICAgIEpvYlRpdGxlID0gbmV3IFhybUV4LlRleHRGaWVsZChcImpvYnRpdGxlXCIpO1xuICAgICAgUHJlZmVycmVkQ29udGFjdE1ldGhvZCA9IG5ldyBYcm1FeC5PcHRpb25zZXRGaWVsZChcbiAgICAgICAgXCJwcmVmZXJyZWRjb250YWN0bWV0aG9kY29kZVwiLFxuICAgICAgICB7XG4gICAgICAgICAgQW55OiAxLFxuICAgICAgICAgIEVtYWlsOiAyLFxuICAgICAgICAgIFBob25lOiAzLFxuICAgICAgICAgIEZheDogNCxcbiAgICAgICAgICBNYWlsOiA1LFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgQ3VzdG9tZXIgPSBuZXcgWHJtRXguTG9va3VwRmllbGQoXCJwYXJlbnRjdXN0b21lcmlkXCIpO1xuICAgICAgQnVzaW5lc3NQaG9uZSA9IG5ldyBYcm1FeC5UZXh0RmllbGQoXCJ0ZWxlcGhvbmUxXCIpO1xuICAgICAgR2VuZGVyID0gbmV3IFhybUV4Lk9wdGlvbnNldEZpZWxkKFwiZ2VuZGVyY29kZVwiKTtcbiAgICAgIEVtYWlsID0gbmV3IFhybUV4LlRleHRGaWVsZChcImVtYWlsYWRkcmVzczFcIik7XG4gICAgICBNb2JpbGVQaG9uZSA9IG5ldyBYcm1FeC5UZXh0RmllbGQoXCJtb2JpbGVwaG9uZVwiKTtcbiAgICAgIE93bmVyID0gbmV3IFhybUV4Lkxvb2t1cEZpZWxkKFwib3duZXJpZFwiKTtcbiAgICAgIERvTm90RW1haWwgPSBuZXcgWHJtRXguQm9vbGVhbkZpZWxkKFwiZG9ub3RlbWFpbFwiKTtcbiAgICAgIE1hcml0YWxTdGF0dXMgPSBuZXcgWHJtRXguT3B0aW9uc2V0RmllbGQoXCJmYW1pbHlzdGF0dXNjb2RlXCIpO1xuICAgICAgU3BvdXNlUGFydG5lck5hbWUgPSBuZXcgWHJtRXguVGV4dEZpZWxkKFwic3BvdXNlc25hbWVcIik7XG4gICAgICBCaXJ0aGRheSA9IG5ldyBYcm1FeC5EYXRlRmllbGQoXCJiaXJ0aGRhdGVcIik7XG4gICAgfVxuICAgIGNsYXNzIFRhYnMge1xuICAgICAgR2VuZXJhbCA9IG5ldyBYcm1FeC5UYWIoXCJ0YWIxXCIsIHtcbiAgICAgICAgU2VjdGlvbjE6IG5ldyBYcm1FeC5TZWN0aW9uKFwic2VjdGlvbjFcIiksXG4gICAgICAgIFNlY3Rpb24yOiBuZXcgWHJtRXguU2VjdGlvbihcInNlY3Rpb24yXCIpLFxuICAgICAgfSk7XG4gICAgICBEZXRhaWxzID0gbmV3IFhybUV4LlRhYihcInRhYjJcIiwge1xuICAgICAgICBTZWN0aW9uMTogbmV3IFhybUV4LlNlY3Rpb24oXCJzZWN0aW9uMVwiKSxcbiAgICAgICAgU2VjdGlvbjI6IG5ldyBYcm1FeC5TZWN0aW9uKFwic2VjdGlvbjJcIiksXG4gICAgICB9KTtcbiAgICB9XG4gICAgY2xhc3MgR3JpZHMge1xuICAgICAgQ29udGFjdFN1YmdyaWQgPSBuZXcgWHJtRXguR3JpZENvbnRyb2woXCJUZXN0XCIpO1xuICAgIH1cbiAgICB2YXIgZmllbGRzOiBGaWVsZHM7XG4gICAgdmFyIHRhYnM6IFRhYnM7XG4gICAgdmFyIGdyaWRzOiBHcmlkcztcbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gSW5pdChcbiAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IFhybS5Gb3JtQ29udGV4dCB8IFhybS5FdmVudHMuRXZlbnRDb250ZXh0XG4gICAgKSB7XG4gICAgICBpZiAoIVhybUV4KSB7XG4gICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPVxuICAgICAgICAgIFwiWHJtRXggaXMgbm90IGxvYWRlZC4gUGxlYXNlIG1ha2Ugc3VyZSB5b3UgaGF2ZSBYcm1FeC5qcyBsb2FkZWQgaW4geW91ciBmb3JtLlwiO1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgIGF3YWl0IFhybS5OYXZpZ2F0aW9uLm9wZW5BbGVydERpYWxvZyh7XG4gICAgICAgICAgdGl0bGU6IFwiRXJyb3JcIixcbiAgICAgICAgICB0ZXh0OiBlcnJvck1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBYcm1FeC5Gb3JtLmZvcm1Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgICAgIGZpZWxkcyA9IG5ldyBGaWVsZHMoKTtcbiAgICAgIHRhYnMgPSBuZXcgVGFicygpO1xuICAgICAgZ3JpZHMgPSBuZXcgR3JpZHMoKTtcbiAgICB9XG5cbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gT25Mb2FkKFxuICAgICAgZXhlY3V0aW9uQ29udGV4dDogWHJtLkZvcm1Db250ZXh0IHwgWHJtLkV2ZW50cy5FdmVudENvbnRleHRcbiAgICApIHtcbiAgICAgIGF3YWl0IEluaXQoZXhlY3V0aW9uQ29udGV4dCk7IC8vRW5zdXJlcyBYcm1FeCBpcyBvbmx5IGFjY2Vzc2VkIGFmdGVyIHRoZSBPbkxvYWQgRXZlbnRcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcmVudC53aW5kb3cuWHJtRXggPSBYcm1FeDtcbiAgICAgICAgZm9ybUNvbnRleHQgPSBYcm1FeC5Gb3JtLmZvcm1Db250ZXh0O1xuXG4gICAgICAgIGF3YWl0IHNhbXBsZSgpO1xuICAgICAgICAvL1JlZ2lzdGVyIG9uZSBvciBtb3JlIEZ1bmN0aW9ucyB0byBleGVjdXRlIE9uU2F2ZVxuICAgICAgICBmb3JtQ29udGV4dC5kYXRhLmVudGl0eS5hZGRPblNhdmUoc2FtcGxlKTtcbiAgICAgICAgLy9CRVRURVIgV0FZXG4gICAgICAgIFhybUV4LkZvcm0uYWRkT25TYXZlRXZlbnRIYW5kbGVyKFtzYW1wbGVdKTtcbiAgICAgICAgLy9SZWdpc3RlciBvbmUgb3IgbW9yZSBGdW5jdGlvbnMgdG8gZXhlY3V0ZSBPbkNoYW5nZSBvZiBtdWx0aXBsZSBmaWVsZHMgYW5kIGV4ZWN1dGUgaXQgaW1tZWRpYXRlbHlcbiAgICAgICAgbGV0IGZpcnN0bmFtZSA9IGZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZShcImZpcnN0bmFtZVwiKTtcbiAgICAgICAgbGV0IGxhc3RuYW1lID0gZm9ybUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibGFzdG5hbWVcIik7XG4gICAgICAgIGZpcnN0bmFtZS5hZGRPbkNoYW5nZShzYW1wbGUpO1xuICAgICAgICBmaXJzdG5hbWUuZmlyZU9uQ2hhbmdlKCk7XG4gICAgICAgIGxhc3RuYW1lLmZpcmVPbkNoYW5nZSgpO1xuICAgICAgICAvL0JFVFRFUiBXQVlcbiAgICAgICAgWHJtRXguRm9ybS5hZGRPbkNoYW5nZUV2ZW50SGFuZGxlcihcbiAgICAgICAgICBbZmllbGRzLkZpcnN0bmFtZSwgZmllbGRzLkxhc3RuYW1lXSxcbiAgICAgICAgICBbc2FtcGxlXSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgYXdhaXQgWHJtRXgub3BlbkFsZXJ0RGlhbG9nKFxuICAgICAgICAgIFwiRXJyb3JcIixcbiAgICAgICAgICBgRXJyb3IgaW4gVGhlaWEuVGVtcGxhdGVGdW5jdGlvbnMuJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9XFxuYCArXG4gICAgICAgICAgICBlcnJvci5tZXNzYWdlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIFRoaXMgRnJhbWV3b3JrIGVtcG93ZXJzIGRldmVsb3BlcnMgdG8gRE8gTU9SRSBieSB3cml0aW5nIExFU1MgQ09ERSDwn5GIKO++n+ODru++n/CfkYgpXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNhbXBsZSgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvL0NvbnRpbnVlIG9ubHkgb24gVXBkYXRlIEZvcm1cbiAgICAgICAgICBpZiAoZm9ybUNvbnRleHQudWkuZ2V0Rm9ybVR5cGUoKSAhPSAyKSByZXR1cm47XG4gICAgICAgICAgLy9CRVRURVIgV0FZXG4gICAgICAgICAgaWYgKFhybUV4LkZvcm0uSXNOb3RVcGRhdGUpIHJldHVybjtcblxuICAgICAgICAgIC8vSWYgRmlyc3RuYW1lIGlzIGVtcHR5LCBtYWtlIGl0IHJlcXVpcmVkIGFuZCBzaG93cyBub3RpZmljYXRpb24gb24gdGhlIGZpZWxkXG4gICAgICAgICAgbGV0IGZpcnN0bmFtZSA9IGZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZShcImZpcnN0bmFtZVwiKTtcbiAgICAgICAgICBpZiAoIWZpcnN0bmFtZS5nZXRWYWx1ZSgpKSB7XG4gICAgICAgICAgICBmaXJzdG5hbWUuc2V0UmVxdWlyZWRMZXZlbChcInJlcXVpcmVkXCIpO1xuICAgICAgICAgICAgZmlyc3RuYW1lLmNvbnRyb2xzLmZvckVhY2goKGMpID0+XG4gICAgICAgICAgICAgIGMuc2V0Tm90aWZpY2F0aW9uKFwiVGhpcyBwcm9wZXJ0eSBpcyByZXF1aXJlZFwiLCBcInVuaXF1ZUlkXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvL0JFVFRFUiBXQVlcbiAgICAgICAgICBpZiAoIWZpZWxkcy5MYXN0bmFtZS5WYWx1ZSlcbiAgICAgICAgICAgIGZpZWxkcy5GaXJzdG5hbWUuc2V0UmVxdWlyZWQodHJ1ZSkuc2V0Tm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgICBcIlRoaXMgcHJvcGVydHkgaXMgcmVxdWlyZWRcIixcbiAgICAgICAgICAgICAgXCJ1bmlxdWVJZFwiXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgLy9JZiBPd25lciBoYXMgVmFsdWUgYW5kIExhc3RuYW1lIGRvZXMgbm90LCByZXRyaWV2ZSBpdCdzIGxhc3RuYW1lIGFuZCBzZXQgaXQgdG8gTGFzdG5hbWVcbiAgICAgICAgICBsZXQgb3duZXJpZCA9IGZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZShcIm93bmVyaWRcIik7XG4gICAgICAgICAgbGV0IGxhc3RuYW1lID0gZm9ybUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibGFzdG5hbWVcIik7XG4gICAgICAgICAgaWYgKG93bmVyaWQuZ2V0VmFsdWUoKSAmJiAhbGFzdG5hbWUuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgbGV0IHVzZXIgPSBhd2FpdCBYcm0uV2ViQXBpLnJldHJpZXZlUmVjb3JkKFxuICAgICAgICAgICAgICBvd25lcmlkLmdldFZhbHVlKClbMF0uZW50aXR5VHlwZSxcbiAgICAgICAgICAgICAgb3duZXJpZC5nZXRWYWx1ZSgpWzBdLmlkLFxuICAgICAgICAgICAgICBcIj8kc2VsZWN0PWxhc3RuYW1lXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsYXN0bmFtZS5zZXRWYWx1ZSh1c2VyLmxhc3RuYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9CRVRURVIgV0FZXG4gICAgICAgICAgaWYgKGZpZWxkcy5Pd25lci5WYWx1ZSAmJiAhZmllbGRzLkxhc3RuYW1lLlZhbHVlKSB7XG4gICAgICAgICAgICBsZXQgdXNlciA9IGF3YWl0IGZpZWxkcy5Pd25lci5yZXRyaWV2ZShcIj8kc2VsZWN0PWxhc3RuYW1lXCIpO1xuICAgICAgICAgICAgZmllbGRzLkxhc3RuYW1lLlZhbHVlID0gdXNlci5sYXN0bmFtZTtcbiAgICAgICAgICAgIGZpZWxkcy5MYXN0bmFtZS5zZXRWYWx1ZSh1c2VyLmxhc3RuYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9TZXQgT3B0aW9uc2V0IFByZWZlcnJlZENvbnRhY3RNZXRob2QgdG8gRW1haWxcbiAgICAgICAgICBmaWVsZHMuUHJlZmVycmVkQ29udGFjdE1ldGhvZC5WYWx1ZSA9XG4gICAgICAgICAgICBmaWVsZHMuUHJlZmVycmVkQ29udGFjdE1ldGhvZC5PcHRpb24uRW1haWw7XG5cbiAgICAgICAgICAvL0FkZCBMb29rdXAgRmlsdGVyIHRvIEN1c3RvbWVyIGFuZCByZW1vdmUgaXQgbGF0ZXJcbiAgICAgICAgICBsZXQgZmlsdGVyRnVuY3Rpb24gPSBmdW5jdGlvbiBmaWx0ZXJGdW5jdGlvbihcbiAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IFhybS5FdmVudHMuRXZlbnRDb250ZXh0XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgZm9ybUNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0LmdldEZvcm1Db250ZXh0KCk7XG4gICAgICAgICAgICBsZXQgY3VzdG9tZXI6IFhybS5BdHRyaWJ1dGVzLkxvb2t1cEF0dHJpYnV0ZSA9XG4gICAgICAgICAgICAgIGZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZShcInBhcmVudGN1c3RvbWVyaWRcIik7XG4gICAgICAgICAgICBjdXN0b21lci5jb250cm9scy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICAgIGMuYWRkQ3VzdG9tRmlsdGVyKFxuICAgICAgICAgICAgICAgIGA8ZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZGl0aW9uIGF0dHJpYnV0ZT1cImxhc3RuYW1lXCIgb3BlcmF0b3I9XCJsaWtlXCIgdmFsdWU9XCIlVGVzdCVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPmBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG4gICAgICAgICAgbGV0IGN1c3RvbWVyOiBYcm0uQXR0cmlidXRlcy5Mb29rdXBBdHRyaWJ1dGUgPVxuICAgICAgICAgICAgZm9ybUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicGFyZW50Y3VzdG9tZXJpZFwiKTtcbiAgICAgICAgICBjdXN0b21lci5jb250cm9scy5mb3JFYWNoKChjKSA9PiBjLmFkZFByZVNlYXJjaChmaWx0ZXJGdW5jdGlvbikpO1xuICAgICAgICAgIGN1c3RvbWVyLmNvbnRyb2xzLmZvckVhY2goKGMpID0+IGMucmVtb3ZlUHJlU2VhcmNoKGZpbHRlckZ1bmN0aW9uKSk7XG4gICAgICAgICAgLy9CRVRURVIgV0FZXG4gICAgICAgICAgZmllbGRzLkN1c3RvbWVyLmFkZFByZUZpbHRlclRvTG9va3VwKFxuICAgICAgICAgICAgYDxmaWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgIDxjb25kaXRpb24gYXR0cmlidXRlPVwibGFzdG5hbWVcIiBvcGVyYXRvcj1cImxpa2VcIiB2YWx1ZT1cIiVUZXN0JVwiIC8+XG4gICAgICAgICAgICAgICAgPC9maWx0ZXI+YFxuICAgICAgICAgICk7XG4gICAgICAgICAgZmllbGRzLkN1c3RvbWVyLmNsZWFyUHJlRmlsdGVyRnJvbUxvb2t1cCgpO1xuXG4gICAgICAgICAgZmllbGRzLkxhc3RuYW1lLnNldFZpc2libGUoZmFsc2UpXG4gICAgICAgICAgICAuc2V0RGlzYWJsZWQodHJ1ZSlcbiAgICAgICAgICAgIC5zZXRSZXF1aXJlZChmYWxzZSlcbiAgICAgICAgICAgIC5zZXROb3RpZmljYXRpb24oXCJUaGlzIHByb3BlcnR5IGlzIHJlcXVpcmVkXCIsIFwidW5pcXVlSWRcIik7XG5cbiAgICAgICAgICAvL1NQRUNJQUwgV0FZIChHbyB0byBEZWZpbml0aW9uIHRvIHNlZSBob3cgdG8gYWNoaWV2ZSB0aGlzKVxuICAgICAgICAgIC8vQWRkIEFkdmFuY2VkIExvb2t1cCBGaWx0ZXJcbiAgICAgICAgICBhd2FpdCBmaWVsZHMuQ3VzdG9tZXIuYWRkUHJlRmlsdGVyVG9Mb29rdXBBZHZhbmNlZChcbiAgICAgICAgICAgIFwiY29udGFjdFwiLFxuICAgICAgICAgICAgXCJjb250YWN0aWRcIixcbiAgICAgICAgICAgIGA8ZmV0Y2g+XG4gICAgICAgICAgICAgICAgICAgIDxlbnRpdHkgbmFtZT1cImNvbnRhY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmRpdGlvbiBhdHRyaWJ1dGU9XCJsYXN0bmFtZVwiIG9wZXJhdG9yPVwibGlrZVwiIHZhbHVlPVwiJVRlc3QlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcj5cbiAgICAgICAgICAgICAgICAgICAgPC9lbnRpdHk+XG4gICAgICAgICAgICAgICAgICA8L2ZldGNoPmBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy9FeGVjdXRlIGJvdW5kIEFjdGlvblxuICAgICAgICAgIGNsYXNzIFRlc3RBY3Rpb25Db250YWN0UmVxdWVzdCB7XG4gICAgICAgICAgICBBbW91bnQ6IG51bWJlcjtcbiAgICAgICAgICAgIEFjY291bnQ6IGFueTtcbiAgICAgICAgICAgIGdldE1ldGFkYXRhKCkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGJvdW5kUGFyYW1ldGVyOiBcImVudGl0eVwiLFxuICAgICAgICAgICAgICAgIG9wZXJhdGlvblR5cGU6IDAsXG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogXCJ0aGVpYV9UZXN0QWN0aW9uQ29udGFjdFwiLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlclR5cGVzOiB7XG4gICAgICAgICAgICAgICAgICBBbW91bnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWU6IFwiRWRtLkludDMyXCIsXG4gICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyYWxQcm9wZXJ0eTogMSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBBY2NvdW50OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lOiBcIm1zY3JtLmFjY291bnRcIixcbiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJhbFByb3BlcnR5OiA1LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGVudGl0eToge1xuICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZTogXCJtc2NybS5jb250YWN0XCIsXG4gICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyYWxQcm9wZXJ0eTogNSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IHRlc3RBY3Rpb25Db250YWN0UmVxdWVzdCA9IG5ldyBUZXN0QWN0aW9uQ29udGFjdFJlcXVlc3QoKTtcbiAgICAgICAgICB0ZXN0QWN0aW9uQ29udGFjdFJlcXVlc3QuQW1vdW50ID0gNTtcbiAgICAgICAgICB0ZXN0QWN0aW9uQ29udGFjdFJlcXVlc3QuQWNjb3VudCA9IGN1c3RvbWVyLmdldFZhbHVlKClbMF07XG4gICAgICAgICAgdGVzdEFjdGlvbkNvbnRhY3RSZXF1ZXN0W1wiZW50aXR5XCJdID1cbiAgICAgICAgICAgIGZvcm1Db250ZXh0LmRhdGEuZW50aXR5LmdldEVudGl0eVJlZmVyZW5jZSgpO1xuICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IFhybS5XZWJBcGkub25saW5lXG4gICAgICAgICAgICAuZXhlY3V0ZSh0ZXN0QWN0aW9uQ29udGFjdFJlcXVlc3QpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigocmVzcG9uc2VCb2R5KSA9PiByZXNwb25zZUJvZHkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcblxuICAgICAgICAgIC8vQkVUVEVSIFdBWVxuICAgICAgICAgIGxldCByZXNwb25zZTIgPSBhd2FpdCBYcm1FeC5leGVjdXRlQWN0aW9uKFxuICAgICAgICAgICAgXCJ0aGVpYV9UZXN0QWN0aW9uQ29udGFjdFwiLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICB7IE5hbWU6IFwiQW1vdW50XCIsIFR5cGU6IFwiSW50ZWdlclwiLCBWYWx1ZTogNSB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgTmFtZTogXCJBY2NvdW50XCIsXG4gICAgICAgICAgICAgICAgVHlwZTogXCJFbnRpdHlSZWZlcmVuY2VcIixcbiAgICAgICAgICAgICAgICBWYWx1ZTogZmllbGRzLkN1c3RvbWVyLlZhbHVlWzBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFhybUV4LkZvcm0uZW50aXR5UmVmZXJlbmNlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZTIpO1xuXG4gICAgICAgICAgLy9SZXRyaWV2ZSBFbnZpcm9ubWVudFZhcmlhYmxlVmFsdWVcbiAgICAgICAgICBjbGFzcyBFbnZpcm9ubWVudFZhcmlhYmxlUmVxdWVzdCB7XG4gICAgICAgICAgICBEZWZpbml0aW9uU2NoZW1hTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgY29uc3RydWN0b3IoZGVmaW5pdGlvblNjaGVtYU5hbWU6IHN0cmluZykge1xuICAgICAgICAgICAgICB0aGlzLkRlZmluaXRpb25TY2hlbWFOYW1lID0gZGVmaW5pdGlvblNjaGVtYU5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnZXRNZXRhZGF0YSgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBib3VuZFBhcmFtZXRlcjogbnVsbCxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25UeXBlOiAxLFxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IFwiUmV0cmlldmVFbnZpcm9ubWVudFZhcmlhYmxlVmFsdWVcIixcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJUeXBlczoge1xuICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvblNjaGVtYU5hbWU6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWU6IFwiRWRtLlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDEsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBlbnZpcm9ubWVudFZhcmlhYmxlUmVxdWVzdCA9IG5ldyBFbnZpcm9ubWVudFZhcmlhYmxlUmVxdWVzdChcbiAgICAgICAgICAgIFwidGhlaWFfVGVzdFwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsZXQgdmFsdWUgPSBhd2FpdCBYcm0uV2ViQXBpLm9ubGluZVxuICAgICAgICAgICAgLmV4ZWN1dGUoZW52aXJvbm1lbnRWYXJpYWJsZVJlcXVlc3QpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigocmVzcG9uc2VCb2R5KSA9PiByZXNwb25zZUJvZHkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAgICAgICAgICAvL0JFVFRFUiBXQVlcbiAgICAgICAgICBsZXQgdmFsdWUyID0gYXdhaXQgWHJtRXguZ2V0RW52aXJvbm1lbnRWYXJpYWJsZVZhbHVlKFwidGhlaWFfVGVzdFwiKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyh2YWx1ZTIpO1xuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogSG93IHRvIGFjY2VzcyBQcm9wb2VydGllcyBkZXNjcmliZWQgaW4gTWljcm9zb2Z0cyBEb2N1bWVudGF0aW9uXG4gICAgICAgICAgICovXG4gICAgICAgICAgLyoqIFlvdSBjYW4gYWNjZXNzIGFsbCBGb3JtIENvbnRleHQgRnVuY3Rpb25zIGhlcmU6IEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcG93ZXItYXBwcy9kZXZlbG9wZXIvbW9kZWwtZHJpdmVuLWFwcHMvY2xpZW50YXBpL2NsaWVudGFwaS1mb3JtLWNvbnRleHQqL1xuICAgICAgICAgIFhybUV4LkZvcm0uZm9ybUNvbnRleHQuZGF0YS5pc1ZhbGlkKCk7XG5cbiAgICAgICAgICAvKiogWW91IGNhbiBhY2Nlc3MgYWxsIENvbHVtbiBGdW5jdGlvbnMgaGVyZTogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9wb3dlci1hcHBzL2RldmVsb3Blci9tb2RlbC1kcml2ZW4tYXBwcy9jbGllbnRhcGkvcmVmZXJlbmNlL2F0dHJpYnV0ZXMqL1xuICAgICAgICAgIGZpZWxkcy5CaXJ0aGRheS5BdHRyaWJ1dGUuZ2V0SXNEaXJ0eSgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgLiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/build/dist/src/XrmEx.js b/build/dist/src/XrmEx.js deleted file mode 100644 index ebceb7e..0000000 --- a/build/dist/src/XrmEx.js +++ /dev/null @@ -1,1327 +0,0 @@ -/// -var XrmEx; -(function (XrmEx) { - /** - * Throws an error with the given error message. - * @param {string} errorMessage - The error message to throw. - * @throws {Error} - Always throws an error with the given error message. - */ - function throwError(errorMessage) { - throw new Error(errorMessage); - } - XrmEx.throwError = throwError; - /** - * Returns the name of the calling function. - * @returns {string} - The name of the calling function. - */ - function getMethodName() { - try { - const error = new Error(); - const stackTrace = error.stack?.split("\n").map((line) => line.trim()); - const callingFunctionLine = stackTrace && stackTrace.length >= 3 ? stackTrace[2] : undefined; - const functionNameMatch = callingFunctionLine?.match(/at\s+([^\s]+)\s+\(/); - const functionName = functionNameMatch ? functionNameMatch[1] : ""; - return functionName; - } - catch (error) { - throw new Error(`XrmEx.getMethodName:\n${error.message}`); - } - } - XrmEx.getMethodName = getMethodName; - /** - * Displays a notification for an app with the given message and level, and lets you specify whether to show a close button. - * @param {string} message - The message to display in the notification. - * @param {'SUCCESS' | 'ERROR' | 'WARNING' | 'INFO'} level - The level of the notification. Can be 'SUCCESS', 'ERROR', 'WARNING', or 'INFO'. - * @param {boolean} [showCloseButton=false] - Whether to show a close button on the notification. Defaults to false. - * @returns {Promise} - A promise that resolves with the ID of the created notification. - */ - async function addGlobalNotification(message, level, showCloseButton = false) { - const levelMap = { - SUCCESS: 1, - ERROR: 2, - WARNING: 3, - INFO: 4, - }; - const messageLevel = levelMap[level] || levelMap.INFO; - const notification = { - type: 2, - level: messageLevel, - message, - showCloseButton, - }; - try { - return await Xrm.App.addGlobalNotification(notification); - } - catch (error) { - throw new Error(`XrmEx.${getMethodName()}:\n${error.message}`); - } - } - XrmEx.addGlobalNotification = addGlobalNotification; - /** - * Clears a notification in the app with the given unique ID. - * @param {string} uniqueId - The unique ID of the notification to clear. - * @returns {Promise} - A promise that resolves when the notification has been cleared. - */ - async function removeGlobalNotification(uniqueId) { - try { - return await Xrm.App.clearGlobalNotification(uniqueId); - } - catch (error) { - throw new Error(`XrmEx.${getMethodName()}:\n${error.message}`); - } - } - XrmEx.removeGlobalNotification = removeGlobalNotification; - /** - * Retrieves the value of an environment variable by using its schema name as key. - * @param {string} environmentVariableSchemaName - The schema name of the environment variable to retrieve. - * @returns {Promise} - A promise that resolves with the value of the environment variable. - */ - async function getEnvironmentVariableValue(environmentVariableSchemaName) { - return executeFunction("RetrieveEnvironmentVariableValue", [ - { - Name: "DefinitionSchemaName", - Type: "String", - Value: environmentVariableSchemaName, - }, - ]); - } - XrmEx.getEnvironmentVariableValue = getEnvironmentVariableValue; - /** - * A map of CRM data types to their corresponding type names, structural properties, and JavaScript types. - * @type {Object.} - */ - let typeMap = { - String: { typeName: "Edm.String", structuralProperty: 1, jsType: "string" }, - Integer: { typeName: "Edm.Int32", structuralProperty: 1, jsType: "number" }, - Boolean: { - typeName: "Edm.Boolean", - structuralProperty: 1, - jsType: "boolean", - }, - DateTime: { - typeName: "Edm.DateTimeOffset", - structuralProperty: 1, - jsType: "object", - }, - EntityReference: { - typeName: "mscrm.crmbaseentity", - structuralProperty: 5, - jsType: "object", - }, - Decimal: { - typeName: "Edm.Decimal", - structuralProperty: 1, - jsType: "number", - }, - Entity: { - typeName: "mscrm.crmbaseentity", - structuralProperty: 5, - jsType: "object", - }, - EntityCollection: { - typeName: "Collection(mscrm.crmbaseentity)", - structuralProperty: 4, - jsType: "object", - }, - Float: { typeName: "Edm.Double", structuralProperty: 1, jsType: "number" }, - Money: { typeName: "Edm.Decimal", structuralProperty: 1, jsType: "number" }, - Picklist: { - typeName: "Edm.Int32", - structuralProperty: 1, - jsType: "number", - }, - }; - /** - * Checks if the given request parameter is of a supported type and has a valid value. - * @param {RequestParameter} requestParameter - The request parameter to check. - * @returns {void} - * @throws {Error} - Throws an error if the request parameter is not of a supported type or has an invalid value. - */ - function checkRequestParameterType(requestParameter) { - if (!typeMap[requestParameter.Type]) - throw new Error(`The property type ${requestParameter.Type} of the property ${requestParameter.Name} is not supported.`); - const expectedType = typeMap[requestParameter.Type].jsType; - const actualType = typeof requestParameter.Value; - const invalidTypeMessage = `The value ${requestParameter.Value}\nof the property ${requestParameter.Name}\nis not of the expected type ${requestParameter.Type}.`; - if (requestParameter.Type === "EntityReference" || - requestParameter.Type === "Entity") { - if (!requestParameter.Value || - !requestParameter.Value.hasOwnProperty("id") || - !requestParameter.Value.hasOwnProperty("entityType")) { - throw new Error(invalidTypeMessage); - } - typeMap[requestParameter.Type].typeName = `mscrm.${requestParameter.Value.entityType}`; - } - else if (requestParameter.Type === "EntityCollection") { - if (!Array.isArray(requestParameter.Value) || - requestParameter.Value.every((v) => typeof v !== "object" || - !v || - !v.hasOwnProperty("id") || - !v.hasOwnProperty("entityType"))) { - throw new Error(invalidTypeMessage); - } - } - else if (requestParameter.Type === "DateTime") { - if (!(requestParameter.Value instanceof Date)) { - throw new Error(invalidTypeMessage); - } - } - else { - if (actualType !== expectedType) { - throw new Error(invalidTypeMessage); - } - } - } - XrmEx.checkRequestParameterType = checkRequestParameterType; - /** - * Executes an Action. - * @param {string} actionName - The unique name of the action. - * @param {RequestParameter[]} requestParameters - An array of objects with the parameter name, type and value. - * @param {EntityReference} [boundEntity] - An optional EntityReference of the bound entity. - * @returns {Promise} - A Promise with the request response. - * @throws {Error} - Throws an error if the request parameter is not of a supported type or has an invalid value. - */ - async function executeAction(actionName, requestParameters, boundEntity) { - const parameterDefinition = {}; - if (boundEntity) - requestParameters.push({ - Name: "entity", - Value: boundEntity, - Type: "EntityReference", - }); - for (const requestParameter of requestParameters) { - checkRequestParameterType(requestParameter); - parameterDefinition[requestParameter.Name] = { - typeName: typeMap[requestParameter.Type].typeName, - structuralProperty: typeMap[requestParameter.Type].structuralProperty, - }; - } - const req = Object.assign({ - getMetadata: () => ({ - boundParameter: boundEntity ? "entity" : null, - operationType: 0, - operationName: actionName, - parameterTypes: parameterDefinition, - }), - }, ...requestParameters.map((p) => ({ [p.Name]: p.Value }))); - const response = await Xrm.WebApi.online.execute(req); - if (response.ok) - return response.json().catch(() => response); - } - XrmEx.executeAction = executeAction; - /** - * Executes a Function. - * @param {string} functionName - The unique name of the function. - * @param {RequestParameter[]} requestParameters - An array of objects with the parameter name, type and value. - * @param {EntityReference} [boundEntity] - An optional EntityReference of the bound entity. - * @returns {Promise} - A Promise with the request response. - * @throws {Error} - Throws an error if the request parameter is not of a supported type or has an invalid value. - */ - async function executeFunction(functionName, requestParameters, boundEntity) { - const parameterDefinition = {}; - if (boundEntity) - requestParameters.push({ - Name: "entity", - Value: boundEntity, - Type: "EntityReference", - }); - for (const requestParameter of requestParameters) { - checkRequestParameterType(requestParameter); - parameterDefinition[requestParameter.Name] = { - typeName: typeMap[requestParameter.Type].typeName, - structuralProperty: typeMap[requestParameter.Type].structuralProperty, - }; - } - const req = Object.assign({ - getMetadata: () => ({ - boundParameter: boundEntity ? "entity" : null, - operationType: 1, - operationName: functionName, - parameterTypes: parameterDefinition, - }), - }, ...requestParameters.map((p) => ({ [p.Name]: p.Value }))); - const response = await Xrm.WebApi.online.execute(req); - if (response.ok) - return response.json().catch(() => response); - } - XrmEx.executeFunction = executeFunction; - /** - * Makes a GUID lowercase and removes brackets. - * @param {string} guid - The GUID to normalize. - * @returns {string} - The normalized GUID. - */ - function normalizeGuid(guid) { - if (typeof guid !== "string") - throw new Error(`XrmEx.normalizeGuid:\n'${guid}' is not a string`); - return guid.toLowerCase().replace(/[{}]/g, ""); - } - XrmEx.normalizeGuid = normalizeGuid; - /** - * Opens a dialog with dynamic height and width based on text content. - * @param {string} title - The title of the dialog. - * @param {string} text - The text content of the dialog. - * @returns {Promise} - A Promise with the dialog response. - */ - async function openAlertDialog(title, text) { - try { - const rows = text.split(/\r\n|\r|\n/); - let additionalRows = 0; - rows.forEach((row) => { - let width = getTextWidth(row, "1rem Segoe UI Regular, SegoeUI, Segoe UI"); - if (width > 940) { - additionalRows += width / 940; - } - }); - const longestRow = rows.reduce((acc, row) => (row.length > acc.length ? row : acc), ""); - const width = Math.min(getTextWidth(longestRow, "1rem Segoe UI Regular, SegoeUI, Segoe UI"), 1000); - const height = 109 + (rows.length + additionalRows) * 20; - return await Xrm.Navigation.openAlertDialog({ - confirmButtonLabel: "Ok", - text, - title, - }, { - height, - width, - }); - } - catch (error) { - console.error(error.message); - throw new Error(`XrmEx.${getMethodName()}:\n${error.message}`); - } - /** - * Uses canvas.measureText to compute and return the width of the given text of given font in pixels. - * - * @param {String} text The text to be rendered. - * @param {String} font The css font descriptor that text is to be rendered with (e.g. "bold 14px verdana"). - * - * @see https://stackoverflow.com/questions/118241/calculate-text-width-with-javascript/21015393#21015393 - */ - function getTextWidth(text, font) { - const canvas = document.createElement("canvas"); - const context = canvas.getContext("2d"); - context.font = font; - const metrics = context.measureText(text); - return metrics.width; - } - } - XrmEx.openAlertDialog = openAlertDialog; - /** - * Represents a form in Dynamics 365. - */ - class Form { - static _formContext; - static _executionContext; - constructor() { } - /**Gets a reference to the current form context*/ - static get formContext() { - return this._formContext; - } - /**Gets a reference to the current executio context*/ - static get executionContext() { - return this._executionContext; - } - /**Gets a lookup value that references the record.*/ - static get entityReference() { - return Form.formContext.data.entity.getEntityReference(); - } - /**Sets a reference to the current form context*/ - static set formContext(context) { - if ("getFormContext" in context) { - this._executionContext = context; - this._formContext = context.getFormContext(); - } - else if ("data" in context) - this._formContext = context; - else - throw new Error(`XrmEx.Form.setFormContext: The executionContext or formContext was not passed to the function.`); - } - /**Sets a reference to the current execution context*/ - static set executionContext(context) { - if ("getFormContext" in context) { - this._executionContext = context; - this._formContext = context.getFormContext(); - } - else if ("data" in context) - this._formContext = context; - else - throw new Error(`XrmEx.Form.setExecutionContext: The executionContext or formContext was not passed to the function.`); - } - /**Returns true if form is from type create*/ - static get IsCreate() { - return Form.formContext.ui.getFormType() == 1; - } - /**Returns true if form is from type update*/ - static get IsUpdate() { - return Form.formContext.ui.getFormType() == 2; - } - /**Returns true if form is not from type create*/ - static get IsNotCreate() { - return Form.formContext.ui.getFormType() != 1; - } - /**Returns true if form is not from type update*/ - static get IsNotUpdate() { - return Form.formContext.ui.getFormType() != 2; - } - /** - * Displays a form level notification. Any number of notifications can be displayed and will remain until removed using clearFormNotification. - * The height of the notification area is limited so each new message will be added to the top. - * @param message The text of the notification message. - * @param level The level of the notification which defines how the message will be displayed, such as the icon. - * ERROR: Notification will use the system error icon. - * WARNING: Notification will use the system warning icon. - * INFO: Notification will use the system info icon. - * @param uniqueId Unique identifier for the notification which is used with clearFormNotification to remove the notification. - * @returns true if it succeeds, otherwise false. - */ - static addFormNotification(message, level, uniqueId) { - try { - return Form.formContext.ui.setFormNotification(message, level, uniqueId); - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Clears the form notification described by uniqueId. - * @param uniqueId Unique identifier. - * @returns True if it succeeds, otherwise false. - */ - static removeFormNotification(uniqueId) { - try { - return Form.formContext.ui.clearFormNotification(uniqueId); - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Adds a handler to be called when the record is saved. - */ - static addOnSaveEventHandler(handlers) { - try { - if (!Array.isArray(handlers)) { - handlers = [handlers]; - } - handlers.forEach((handler) => { - if (typeof handler !== "function") { - throw new Error(`'${handler}' is not a function`); - } - Form.formContext.data.entity.addOnSave(handler); - }); - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Adds a function to be called after the OnSave is complete. - * @param handler The handler. - * @remarks Added in 9.2 - * @see {@link https://docs.microsoft.com/en-us/powerapps/developer/model-driven-apps/clientapi/reference/events/postsave External Link: PostSave Event Documentation} - */ - static addOnPostSaveEventHandler(handlers) { - try { - if (!Array.isArray(handlers)) { - handlers = [handlers]; - } - handlers.forEach((handler) => { - if (typeof handler !== "function") { - throw new Error(`'${handler}' is not a function`); - } - Form.formContext.data.entity.addOnPostSave(handler); - }); - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Adds a function to be called when form data is loaded. - * @param handler The function to be executed when the form data loads. The function will be added to the bottom of the event handler pipeline. - */ - static addOnLoadEventHandler(handlers) { - try { - if (!Array.isArray(handlers)) { - handlers = [handlers]; - } - handlers.forEach((handler) => { - if (typeof handler !== "function") { - throw new Error(`'${handler}' is not a function`); - } - Form.formContext.data.addOnLoad(handler); - }); - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Adds a handler to be called when the attribute's value is changed. - * @param handler The function reference. - */ - static addOnChangeEventHandler(fields, handlers, execute) { - try { - if (!Array.isArray(handlers)) { - handlers = [handlers]; - } - handlers.forEach((handler) => { - if (typeof handler !== "function") { - throw new Error(`'${handler}' is not a function`); - } - fields.forEach((field) => { - field.addOnChange(handler); - }); - }); - if (execute) { - fields.forEach((field) => { - field.Attribute.fireOnChange(); - }); - } - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - } - XrmEx.Form = Form; - /** - * Used to execute methods related to a single Attribute - */ - class Field { - static allFields = []; - Name; - _attribute; - constructor(attributeName) { - const existingField = Field.allFields.find((f) => f.Name === attributeName); - if (existingField) { - return existingField; - } - this.Name = attributeName; - Field.allFields.push(this); - } - setValue(value) { - return this.Attribute.setValue(value); - } - getAttributeType() { - return this.Attribute.getAttributeType(); - } - getFormat() { - return this.Attribute.getFormat(); - } - getIsDirty() { - return this.Attribute.getIsDirty(); - } - getName() { - return this.Attribute.getName(); - } - getParent() { - return this.Attribute.getParent(); - } - getRequiredLevel() { - return this.Attribute.getRequiredLevel(); - } - getSubmitMode() { - return this.Attribute.getSubmitMode(); - } - getUserPrivilege() { - return this.Attribute.getUserPrivilege(); - } - removeOnChange(handler) { - return this.Attribute.removeOnChange(handler); - } - setSubmitMode(submitMode) { - return this.Attribute.setSubmitMode(submitMode); - } - getValue() { - return this.Attribute.getValue(); - } - setIsValid(isValid, message) { - return this.Attribute.setIsValid(isValid, message); - } - get Attribute() { - return (this._attribute ??= - Form.formContext.getAttribute(this.Name) ?? - XrmEx.throwError(`The attribute '${this.Name}' was not found on the form.`)); - } - get controls() { - return this.Attribute.controls; - } - /** - * Gets the value. - * @returns The value. - */ - get Value() { - return this.Attribute.getValue(); - } - set Value(value) { - this.Attribute.setValue(value); - } - /** - * Sets a control-local notification message. - * @param message The message. - * @param uniqueId Unique identifier. - * @returns true if it succeeds, false if it fails. - * @remarks When this method is used on Microsoft Dynamics CRM for tablets a red "X" icon - * appears next to the control. Tapping on the icon will display the message. - */ - setNotification(message, uniqueId) { - try { - if (!message) - throw new Error(`no message was provided.`); - if (!uniqueId) - throw new Error(`no uniqueId was provided.`); - this.controls.forEach((control) => control.setNotification(message, uniqueId)); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Sets the visibility state. - * @param visible true to show, false to hide. - */ - setVisible(visible) { - try { - this.controls.forEach((control) => control.setVisible(visible)); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Sets the state of the control to either enabled, or disabled. - * @param disabled true to disable, false to enable. - */ - setDisabled(disabled) { - try { - this.controls.forEach((control) => control.setDisabled(disabled)); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Sets the required level. - * @param requirementLevel The requirement level, as either "none", "required", or "recommended" - */ - setRequiredLevel(requirementLevel) { - try { - this.Attribute.setRequiredLevel(requirementLevel); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Sets the required level. - * @param required The requirement level, as either false for "none" or true for "required" - */ - setRequired(required) { - try { - this.Attribute.setRequiredLevel(required ? "required" : "none"); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /**Fire all "on change" event handlers. */ - fireOnChange() { - try { - this.Attribute.fireOnChange(); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Adds a handler or an array of handlers to be called when the attribute's value is changed. - * @param handlers The function reference or an array of function references. - */ - addOnChange(handlers) { - try { - if (Array.isArray(handlers)) { - for (const handler of handlers) { - if (typeof handler !== "function") - throw new Error(`'${handler}' is not a function`); - this.Attribute.removeOnChange(handler); - this.Attribute.addOnChange(handler); - } - } - else { - if (typeof handlers !== "function") - throw new Error(`'${handlers}' is not a function`); - this.Attribute.removeOnChange(handlers); - this.Attribute.addOnChange(handlers); - } - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Displays an error or recommendation notification for a control, and lets you specify actions to execute based on the notification. - */ - addNotification(message, notificationLevel, uniqueId, actions) { - try { - if (!uniqueId) - throw new Error(`no uniqueId was provided.`); - if (actions && !Array.isArray(actions)) - throw new Error(`the action parameter is not an array of ControlNotificationAction`); - this.controls.forEach((control) => { - control.addNotification({ - messages: [message], - notificationLevel: notificationLevel, - uniqueId: uniqueId, - actions: actions, - }); - }); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Clears the notification identified by uniqueId. - * @param uniqueId (Optional) Unique identifier. - * @returns true if it succeeds, false if it fails. - * @remarks If the uniqueId parameter is not used, the current notification shown will be removed. - */ - removeNotification(uniqueId) { - try { - this.controls.forEach((control) => { - control.clearNotification(uniqueId); - }); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - } - XrmEx.Field = Field; - class TextField extends Field { - constructor(attribute) { - super(attribute); - } - getMaxLength() { - return this.Attribute.getMaxLength(); - } - getFormat() { - return this.Attribute.getFormat(); - } - get Attribute() { - return (this._attribute ??= - Form.formContext.getAttribute(this.Name) ?? - XrmEx.throwError(`Field '${this.Name}' does not exist`)); - } - get controls() { - return this.Attribute.controls; - } - get Value() { - return this.Attribute.getValue() ?? null; - } - set Value(value) { - this.Attribute.setValue(value); - } - } - XrmEx.TextField = TextField; - class NumberField extends Field { - constructor(attribute) { - super(attribute); - } - getFormat() { - return this.Attribute.getFormat(); - } - getMax() { - return this.Attribute.getMax(); - } - getMin() { - return this.Attribute.getMin(); - } - getPrecision() { - return this.Attribute.getPrecision(); - } - setPrecision(precision) { - return this.Attribute.setPrecision(precision); - } - get Attribute() { - return (this._attribute ??= - Form.formContext.getAttribute(this.Name) ?? - XrmEx.throwError(`Field '${this.Name}' does not exist`)); - } - get controls() { - return this.Attribute.controls; - } - get Value() { - return this.Attribute.getValue() ?? null; - } - set Value(value) { - this.Attribute.setValue(value); - } - } - XrmEx.NumberField = NumberField; - class DateField extends Field { - constructor(attribute) { - super(attribute); - } - getFormat() { - return this.Attribute.getFormat(); - } - get Attribute() { - return (this._attribute ??= - Form.formContext.getAttribute(this.Name) ?? - XrmEx.throwError(`Field '${this.Name}' does not exist`)); - } - get controls() { - return this.Attribute.controls; - } - get Value() { - return this.Attribute.getValue() ?? null; - } - set Value(value) { - this.Attribute.setValue(value); - } - } - XrmEx.DateField = DateField; - class BooleanField extends Field { - constructor(attribute) { - super(attribute); - } - getAttributeType() { - return this.Attribute.getAttributeType(); - } - getInitialValue() { - return this.Attribute.getInitialValue(); - } - get Attribute() { - return (this._attribute ??= - Form.formContext.getAttribute(this.Name) ?? - XrmEx.throwError(`Field '${this.Name}' does not exist`)); - } - get controls() { - return this.Attribute.controls; - } - get Value() { - return this.Attribute.getValue() ?? null; - } - set Value(value) { - this.Attribute.setValue(value); - } - } - XrmEx.BooleanField = BooleanField; - class MultiSelectOptionSetField extends Field { - Option; - constructor(attributeName, option) { - super(attributeName); - this.Option = option; - } - getFormat() { - return this.Attribute.getFormat(); - } - getOption(value) { - if (typeof value === "number") { - return this.Attribute.getOption(value); - } - else { - return this.Attribute.getOption(value); - } - } - getOptions() { - return this.Attribute.getOptions(); - } - getSelectedOption() { - return this.Attribute.getSelectedOption(); - } - getText() { - return this.Attribute.getText(); - } - getInitialValue() { - return this.Attribute.getInitialValue(); - } - get Attribute() { - return (this._attribute ??= - Form.formContext.getAttribute(this.Name) ?? - XrmEx.throwError(`Field '${this.Name}' does not exist`)); - } - get controls() { - return this.Attribute.controls; - } - get Value() { - return this.Attribute.getValue(); - } - set Value(value) { - if (Array.isArray(value)) { - let values = []; - value.forEach((v) => { - if (typeof v == "number") - values.push(v); - else - values.push(this.Option[v]); - }); - this.Attribute.setValue(values); - } - else - XrmEx.throwError(`Field Value '${value}' is not an Array`); - } - } - XrmEx.MultiSelectOptionSetField = MultiSelectOptionSetField; - class LookupField extends Field { - _customFilters = []; - constructor(attribute) { - super(attribute); - } - getIsPartyList() { - return this.Attribute.getIsPartyList(); - } - get Attribute() { - return (this._attribute ??= - Form.formContext.getAttribute(this.Name) ?? - XrmEx.throwError(`Field '${this.Name}' does not exist`)); - } - get controls() { - return this.Attribute.controls; - } - /**Gets the id of the first lookup value*/ - get Id() { - return this.Value && this.Value.length > 0 - ? XrmEx.normalizeGuid(this.Value[0].id) - : null; - } - /**Gets the entityType of the first lookup value*/ - get EntityType() { - return this.Value && this.Value.length > 0 - ? this.Value[0].entityType - : null; - } - /**Gets the formatted value of the first lookup value*/ - get FormattedValue() { - return this.Value && this.Value.length > 0 ? this.Value[0].name : null; - } - get Value() { - return this.Attribute.getValue() ?? null; - } - set Value(value) { - this.Attribute.setValue(value); - } - /** - * Sets the value of a lookup - * @param id Guid of the record - * @param entityType logicalname of the entity - * @param name formatted value - * @param append if true, adds value to the array instead of replacing it - */ - setLookupValue(id, entityType, name, append = false) { - try { - if (!id) - throw new Error(`no id parameter was provided.`); - if (!entityType) - throw new Error(`no entityType parameter was provided.`); - id = XrmEx.normalizeGuid(id); - const lookupValue = { - id, - entityType, - name, - }; - this.Value = - append && this.Value ? this.Value.concat(lookupValue) : [lookupValue]; - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Retrieves an entity record. - * @param options (Optional) OData system query options, $select and $expand, to retrieve your data. - * - Use the $select system query option to limit the properties returned by including a comma-separated - * list of property names. This is an important performance best practice. If properties aren’t - * specified using $select, all properties will be returned. - * - Use the $expand system query option to control what data from related entities is returned. If you - * just include the name of the navigation property, you’ll receive all the properties for related - * records. You can limit the properties returned for related records using the $select system query - * option in parentheses after the navigation property name. Use this for both single-valued and - * collection-valued navigation properties. - * - You can also specify multiple query options by using & to separate the query options. - * @example options example: - * options: $select=name&$expand=primarycontactid($select=contactid,fullname) - * @returns On success, returns a promise containing a JSON object with the retrieved attributes and their values. - * @see {@link https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/clientapi/reference/xrm-webapi/retrieverecord External Link: retrieveRecord (Client API reference)} - */ - async retrieve(options) { - try { - if (!this.Id || !this.EntityType) - return null; - const record = await Xrm.WebApi.retrieveRecord(this.EntityType, this.Id, options); - return record; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Adds an additional custom filter to the lookup, with the "AND" filter operator. - * @param filter Specifies the filter, as a serialized FetchXML "filter" node. - * @param entityLogicalName (Optional) The logical name of the entity. - * @remarks If entityLogicalName is not specified, the filter will be applied to all entities - * valid for the Lookup control. - * @example Example filter: - * - * - */ - addPreFilterToLookup(filterXml, entityLogicalName) { - try { - _addCustomFilter.controls = this.controls; - this.controls.forEach((control) => { - control.addPreSearch(_addCustomFilter); - }); - this._customFilters.push(_addCustomFilter); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - function _addCustomFilter() { - _addCustomFilter.controls.forEach((control) => { - control.addCustomFilter(filterXml, entityLogicalName); - }); - } - } - /** - * Adds an additional custom filter to the lookup, with the "AND" filter operator. - * @param entityLogicalName (Optional) The logical name of the entity. - * @param primaryAttributeIdName (Optional) The logical name of the primary key. - * @param fetchXml Specifies the FetchXML used to filter. - * @remarks If entityLogicalName is not specified, the filter will be applied to all entities - * valid for the Lookup control. - * @example Example fetchXml: - * - * - * - * - * - * - */ - async addPreFilterToLookupAdvanced(entityLogicalName, primaryAttributeIdName, fetchXml) { - try { - const result = await Xrm.WebApi.online.retrieveMultipleRecords(entityLogicalName, "?fetchXml=" + fetchXml); - const data = result.entities; - let filteredEntities = ""; - _addCustomFilter.controls = this.controls; - data.forEach((item) => { - filteredEntities += `${item[primaryAttributeIdName]}`; - }); - fetchXml = filteredEntities - ? `${filteredEntities}` - : ``; - this.controls.forEach((control) => { - control.addPreSearch(_addCustomFilter); - }); - this._customFilters.push(_addCustomFilter); - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - function _addCustomFilter() { - _addCustomFilter.controls.forEach((control) => { - control.addCustomFilter(fetchXml, entityLogicalName); - }); - } - } - /** - * Removes all filters set on the current lookup attribute by using addPreFilterToLookup or addPreFilterToLookupAdvanced - */ - clearPreFilterFromLookup() { - try { - this._customFilters.forEach((customFilter) => { - this.controls.forEach((control) => { - control.removePreSearch(customFilter); - }); - }); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - } - XrmEx.LookupField = LookupField; - class OptionsetField extends Field { - _control; - Option; - constructor(attributeName, option) { - super(attributeName); - this.Option = option; - } - getFormat() { - return this.Attribute.getFormat(); - } - getOption(value) { - if (typeof value === "number") { - return this.Attribute.getOption(value); - } - else { - return this.Attribute.getOption(value); - } - } - getOptions() { - return this.Attribute.getOptions(); - } - getSelectedOption() { - return this.Attribute.getSelectedOption(); - } - getText() { - return this.Attribute.getText(); - } - getInitialValue() { - return this.Attribute.getInitialValue(); - } - get Attribute() { - return (this._attribute ??= - Form.formContext.getAttribute(this.Name) ?? - XrmEx.throwError(`Field '${this.Name}' does not exist`)); - } - get controls() { - return this.Attribute.controls; - } - get control() { - return (this._control ??= - Form.formContext.getControl(this.Name) ?? - XrmEx.throwError(`Control '${this.Name}' does not exist`)); - } - get Value() { - return this.Attribute.getValue(); - } - set Value(value) { - if (typeof value == "number") - this.Attribute.setValue(value); - else - this.Attribute.setValue(this.Option[value]); - } - /** - * Adds an option. - * - * @param values an array with the option values to add - * @param index (Optional) zero-based index of the option. - * - * @remarks This method does not check that the values within the options you add are valid. - * If index is not provided, the new option will be added to the end of the list. - */ - addOption(values, index) { - try { - if (!Array.isArray(values)) - throw new Error(`values is not an Array:\nvalues: '${values}'`); - const optionSetValues = this.control.getAttribute().getOptions() ?? []; - for (const element of optionSetValues) { - if (values.includes(element.value)) { - this.control.addOption(element, index); - } - } - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Removes the option matching the value. - * - * @param value The value. - */ - removeOption(values) { - try { - if (!Array.isArray(values)) - throw new Error(`values is not an Array:\nvalues: '${values}'`); - const optionSetValues = this.control.getAttribute().getOptions() ?? []; - for (const element of optionSetValues) { - if (values.includes(element.value)) { - this.control.removeOption(element.value); - } - } - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Clears all options. - */ - clearOptions() { - try { - this.control.clearOptions(); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - } - XrmEx.OptionsetField = OptionsetField; - class Section { - Name; - _section; - parentTab; - constructor(name) { - this.Name = name; - } - get Section() { - return (this._section ??= - this.parentTab.sections.get(this.Name) ?? - XrmEx.throwError(`The section '${this.Name}' was not found on the form.`)); - } - getName() { - return this.Section.getName(); - } - getParent() { - return this.Section.getParent(); - } - controls; - setVisible(visible) { - return this.Section.setVisible(visible); - } - getVisible() { - return this.Section.getVisible(); - } - getLabel() { - return this.Section.getLabel(); - } - setLabel(label) { - return this.Section.setLabel(label); - } - } - XrmEx.Section = Section; - class Tab { - Name; - _tab; - Section; - constructor(name, section) { - this.Name = name; - this.Section = section; - for (let key in section) { - section[key].parentTab = this; - } - } - sections; - get Tab() { - return (this._tab ??= - Form.formContext.ui.tabs.get(this.Name) ?? - XrmEx.throwError(`The tab '${this.Name}' was not found on the form.`)); - } - addTabStateChange(handler) { - return this.Tab.addTabStateChange(handler); - } - getDisplayState() { - return this.Tab.getDisplayState(); - } - getName() { - return this.Tab.getName(); - } - getParent() { - return this.Tab.getParent(); - } - removeTabStateChange(handler) { - return this.Tab.removeTabStateChange(handler); - } - setDisplayState(displayState) { - return this.Tab.setDisplayState(displayState); - } - setVisible(visible) { - return this.Tab.setVisible(visible); - } - getVisible() { - return this.Tab.getVisible(); - } - getLabel() { - return this.Tab.getLabel(); - } - setLabel(label) { - return this.Tab.setLabel(label); - } - setFocus() { - return this.Tab.setFocus(); - } - } - XrmEx.Tab = Tab; - class GridControl { - Name; - _gridControl; - constructor(name) { - this.Name = name; - } - get GridControl() { - return ((this._gridControl ??= - Form.formContext.getControl(this.Name)) ?? - XrmEx.throwError(`The grid '${this.Name}' was not found on the form.`)); - } - get Grid() { - return this.GridControl.getGrid(); - } - addOnLoad(handler) { - return this.GridControl.addOnLoad(handler); - } - getContextType() { - return this.GridControl.getContextType(); - } - getEntityName() { - return this.GridControl.getEntityName(); - } - getFetchXml() { - return this.GridControl.getFetchXml(); - } - getGrid() { - return this.GridControl.getGrid(); - } - getRelationship() { - return this.GridControl.getRelationship(); - } - getUrl(client) { - return this.GridControl.getUrl(client); - } - getViewSelector() { - return this.GridControl.getViewSelector(); - } - openRelatedGrid() { - return this.GridControl.openRelatedGrid(); - } - refresh() { - return this.GridControl.refresh(); - } - refreshRibbon() { - return this.GridControl.refreshRibbon(); - } - removeOnLoad(handler) { - return this.GridControl.removeOnLoad(handler); - } - getControlType() { - return this.GridControl.getControlType(); - } - getName() { - return this.GridControl.getName(); - } - getParent() { - return this.GridControl.getParent(); - } - getLabel() { - return this.GridControl.getLabel(); - } - setLabel(label) { - return this.GridControl.setLabel(label); - } - getVisible() { - return this.GridControl.getVisible(); - } - setVisible(visible) { - return this.GridControl.setVisible(visible); - } - } - XrmEx.GridControl = GridControl; -})(XrmEx || (XrmEx = {})); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWHJtRXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvWHJtRXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsOERBQThEO0FBa0M5RCxJQUFVLEtBQUssQ0FvNUNkO0FBcDVDRCxXQUFVLEtBQUs7SUFDYjs7OztPQUlHO0lBQ0gsU0FBZ0IsVUFBVSxDQUFDLFlBQW9CO1FBQzdDLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUZlLGdCQUFVLGFBRXpCLENBQUE7SUFDRDs7O09BR0c7SUFDSCxTQUFnQixhQUFhO1FBQzNCLElBQUk7WUFDRixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzFCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkUsTUFBTSxtQkFBbUIsR0FDdkIsVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNuRSxNQUFNLGlCQUFpQixHQUNyQixtQkFBbUIsRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNuRCxNQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUVuRSxPQUFPLFlBQVksQ0FBQztTQUNyQjtRQUFDLE9BQU8sS0FBVSxFQUFFO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQzNEO0lBQ0gsQ0FBQztJQWRlLG1CQUFhLGdCQWM1QixD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RSxDQUFDO1FBQ3JDLENBQUM7UUFDRCxRQUFRLENBQUMsS0FBYTtZQUNwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxVQUFVO1lBQ1IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxVQUFVLENBQUMsT0FBZ0I7WUFDekIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxDQUFDO0tBQ0Y7SUF6RVksaUJBQVcsY0F5RXZCLENBQUE7QUFDSCxDQUFDLEVBcDVDUyxLQUFLLEtBQUwsS0FBSyxRQW81Q2QiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vbm9kZV9tb2R1bGVzL0B0eXBlcy94cm0vaW5kZXguZC50c1wiIC8+XG4vKipcbiAqIFJlcHJlc2VudHMgYSBwYXJhbWV0ZXIgZm9yIGEgcmVxdWVzdC5cbiAqIEB0eXBlIHtPYmplY3R9IFJlcXVlc3RQYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlci5cbiAqIEBwcm9wZXJ0eSB7J0Jvb2xlYW4nIHwgJ0RhdGVUaW1lJyB8ICdEZWNpbWFsJyB8ICdFbnRpdHknIHwgJ0VudGl0eUNvbGxlY3Rpb24nIHwgJ0VudGl0eVJlZmVyZW5jZScgfCAnRmxvYXQnIHwgJ0ludGVnZXInIHwgJ01vbmV5JyB8ICdQaWNrbGlzdCcgfCAnU3RyaW5nJ30gVHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIuXG4gKiBAcHJvcGVydHkgeyp9IFZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuXG4gKi9cbnR5cGUgUmVxdWVzdFBhcmFtZXRlciA9IHtcbiAgTmFtZTogc3RyaW5nO1xuICBUeXBlOlxuICAgIHwgXCJCb29sZWFuXCJcbiAgICB8IFwiRGF0ZVRpbWVcIlxuICAgIHwgXCJEZWNpbWFsXCJcbiAgICB8IFwiRW50aXR5XCJcbiAgICB8IFwiRW50aXR5Q29sbGVjdGlvblwiXG4gICAgfCBcIkVudGl0eVJlZmVyZW5jZVwiXG4gICAgfCBcIkZsb2F0XCJcbiAgICB8IFwiSW50ZWdlclwiXG4gICAgfCBcIk1vbmV5XCJcbiAgICB8IFwiUGlja2xpc3RcIlxuICAgIHwgXCJTdHJpbmdcIjtcbiAgVmFsdWU6IGFueTtcbn07XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWZlcmVuY2UgdG8gYW4gZW50aXR5LlxuICogQHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFRoZSBJRCBvZiB0aGUgZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudGl0eVR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgZW50aXR5LlxuICovXG50eXBlIEVudGl0eVJlZmVyZW5jZSA9IHtcbiAgaWQ6IHN0cmluZztcbiAgZW50aXR5VHlwZTogc3RyaW5nO1xufTtcbm5hbWVzcGFjZSBYcm1FeCB7XG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVycm9yTWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlIHRvIHRocm93LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBBbHdheXMgdGhyb3dzIGFuIGVycm9yIHdpdGggdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gdGhyb3dFcnJvcihlcnJvck1lc3NhZ2U6IHN0cmluZyk6IG5ldmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbi5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRNZXRob2ROYW1lKCk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgICBjb25zdCBzdGFja1RyYWNlID0gZXJyb3Iuc3RhY2s/LnNwbGl0KFwiXFxuXCIpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpO1xuICAgICAgY29uc3QgY2FsbGluZ0Z1bmN0aW9uTGluZSA9XG4gICAgICAgIHN0YWNrVHJhY2UgJiYgc3RhY2tUcmFjZS5sZW5ndGggPj0gMyA/IHN0YWNrVHJhY2VbMl0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWVNYXRjaCA9XG4gICAgICAgIGNhbGxpbmdGdW5jdGlvbkxpbmU/Lm1hdGNoKC9hdFxccysoW15cXHNdKylcXHMrXFwoLyk7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBmdW5jdGlvbk5hbWVNYXRjaCA/IGZ1bmN0aW9uTmFtZU1hdGNoWzFdIDogXCJcIjtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uTmFtZTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LmdldE1ldGhvZE5hbWU6XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogRGlzcGxheXMgYSBub3RpZmljYXRpb24gZm9yIGFuIGFwcCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBsZXZlbCwgYW5kIGxldHMgeW91IHNwZWNpZnkgd2hldGhlciB0byBzaG93IGEgY2xvc2UgYnV0dG9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gdGhlIG5vdGlmaWNhdGlvbi5cbiAgICogQHBhcmFtIHsnU1VDQ0VTUycgfCAnRVJST1InIHwgJ1dBUk5JTkcnIHwgJ0lORk8nfSBsZXZlbCAtIFRoZSBsZXZlbCBvZiB0aGUgbm90aWZpY2F0aW9uLiBDYW4gYmUgJ1NVQ0NFU1MnLCAnRVJST1InLCAnV0FSTklORycsIG9yICdJTkZPJy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbc2hvd0Nsb3NlQnV0dG9uPWZhbHNlXSAtIFdoZXRoZXIgdG8gc2hvdyBhIGNsb3NlIGJ1dHRvbiBvbiB0aGUgbm90aWZpY2F0aW9uLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBJRCBvZiB0aGUgY3JlYXRlZCBub3RpZmljYXRpb24uXG4gICAqL1xuICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkR2xvYmFsTm90aWZpY2F0aW9uKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBsZXZlbDogXCJTVUNDRVNTXCIgfCBcIkVSUk9SXCIgfCBcIldBUk5JTkdcIiB8IFwiSU5GT1wiLFxuICAgIHNob3dDbG9zZUJ1dHRvbiA9IGZhbHNlXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbGV2ZWxNYXAgPSB7XG4gICAgICBTVUNDRVNTOiAxLFxuICAgICAgRVJST1I6IDIsXG4gICAgICBXQVJOSU5HOiAzLFxuICAgICAgSU5GTzogNCxcbiAgICB9O1xuICAgIGNvbnN0IG1lc3NhZ2VMZXZlbCA9IGxldmVsTWFwW2xldmVsXSB8fCBsZXZlbE1hcC5JTkZPO1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHtcbiAgICAgIHR5cGU6IDIsXG4gICAgICBsZXZlbDogbWVzc2FnZUxldmVsLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHNob3dDbG9zZUJ1dHRvbixcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgWHJtLkFwcC5hZGRHbG9iYWxOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7Z2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDbGVhcnMgYSBub3RpZmljYXRpb24gaW4gdGhlIGFwcCB3aXRoIHRoZSBnaXZlbiB1bmlxdWUgSUQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bmlxdWVJZCAtIFRoZSB1bmlxdWUgSUQgb2YgdGhlIG5vdGlmaWNhdGlvbiB0byBjbGVhci5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBub3RpZmljYXRpb24gaGFzIGJlZW4gY2xlYXJlZC5cbiAgICovXG4gIGV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVHbG9iYWxOb3RpZmljYXRpb24oXG4gICAgdW5pcXVlSWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgWHJtLkFwcC5jbGVhckdsb2JhbE5vdGlmaWNhdGlvbih1bmlxdWVJZCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke2dldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBieSB1c2luZyBpdHMgc2NoZW1hIG5hbWUgYXMga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW52aXJvbm1lbnRWYXJpYWJsZVNjaGVtYU5hbWUgLSBUaGUgc2NoZW1hIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICovXG4gIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRFbnZpcm9ubWVudFZhcmlhYmxlVmFsdWUoXG4gICAgZW52aXJvbm1lbnRWYXJpYWJsZVNjaGVtYU5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBleGVjdXRlRnVuY3Rpb24oXCJSZXRyaWV2ZUVudmlyb25tZW50VmFyaWFibGVWYWx1ZVwiLCBbXG4gICAgICB7XG4gICAgICAgIE5hbWU6IFwiRGVmaW5pdGlvblNjaGVtYU5hbWVcIixcbiAgICAgICAgVHlwZTogXCJTdHJpbmdcIixcbiAgICAgICAgVmFsdWU6IGVudmlyb25tZW50VmFyaWFibGVTY2hlbWFOYW1lLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuICAvKipcbiAgICogQSBtYXAgb2YgQ1JNIGRhdGEgdHlwZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyB0eXBlIG5hbWVzLCBzdHJ1Y3R1cmFsIHByb3BlcnRpZXMsIGFuZCBKYXZhU2NyaXB0IHR5cGVzLlxuICAgKiBAdHlwZSB7T2JqZWN0LjxzdHJpbmcsIHsgdHlwZU5hbWU6IHN0cmluZywgc3RydWN0dXJhbFByb3BlcnR5OiBudW1iZXIsIGpzVHlwZTogc3RyaW5nIH0+fVxuICAgKi9cbiAgbGV0IHR5cGVNYXAgPSB7XG4gICAgU3RyaW5nOiB7IHR5cGVOYW1lOiBcIkVkbS5TdHJpbmdcIiwgc3RydWN0dXJhbFByb3BlcnR5OiAxLCBqc1R5cGU6IFwic3RyaW5nXCIgfSxcbiAgICBJbnRlZ2VyOiB7IHR5cGVOYW1lOiBcIkVkbS5JbnQzMlwiLCBzdHJ1Y3R1cmFsUHJvcGVydHk6IDEsIGpzVHlwZTogXCJudW1iZXJcIiB9LFxuICAgIEJvb2xlYW46IHtcbiAgICAgIHR5cGVOYW1lOiBcIkVkbS5Cb29sZWFuXCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDEsXG4gICAgICBqc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgRGF0ZVRpbWU6IHtcbiAgICAgIHR5cGVOYW1lOiBcIkVkbS5EYXRlVGltZU9mZnNldFwiLFxuICAgICAgc3RydWN0dXJhbFByb3BlcnR5OiAxLFxuICAgICAganNUeXBlOiBcIm9iamVjdFwiLFxuICAgIH0sXG4gICAgRW50aXR5UmVmZXJlbmNlOiB7XG4gICAgICB0eXBlTmFtZTogXCJtc2NybS5jcm1iYXNlZW50aXR5XCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDUsXG4gICAgICBqc1R5cGU6IFwib2JqZWN0XCIsXG4gICAgfSxcbiAgICBEZWNpbWFsOiB7XG4gICAgICB0eXBlTmFtZTogXCJFZG0uRGVjaW1hbFwiLFxuICAgICAgc3RydWN0dXJhbFByb3BlcnR5OiAxLFxuICAgICAganNUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgRW50aXR5OiB7XG4gICAgICB0eXBlTmFtZTogXCJtc2NybS5jcm1iYXNlZW50aXR5XCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDUsXG4gICAgICBqc1R5cGU6IFwib2JqZWN0XCIsXG4gICAgfSxcbiAgICBFbnRpdHlDb2xsZWN0aW9uOiB7XG4gICAgICB0eXBlTmFtZTogXCJDb2xsZWN0aW9uKG1zY3JtLmNybWJhc2VlbnRpdHkpXCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDQsXG4gICAgICBqc1R5cGU6IFwib2JqZWN0XCIsXG4gICAgfSxcbiAgICBGbG9hdDogeyB0eXBlTmFtZTogXCJFZG0uRG91YmxlXCIsIHN0cnVjdHVyYWxQcm9wZXJ0eTogMSwganNUeXBlOiBcIm51bWJlclwiIH0sXG4gICAgTW9uZXk6IHsgdHlwZU5hbWU6IFwiRWRtLkRlY2ltYWxcIiwgc3RydWN0dXJhbFByb3BlcnR5OiAxLCBqc1R5cGU6IFwibnVtYmVyXCIgfSxcbiAgICBQaWNrbGlzdDoge1xuICAgICAgdHlwZU5hbWU6IFwiRWRtLkludDMyXCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDEsXG4gICAgICBqc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgfTtcbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcmVxdWVzdCBwYXJhbWV0ZXIgaXMgb2YgYSBzdXBwb3J0ZWQgdHlwZSBhbmQgaGFzIGEgdmFsaWQgdmFsdWUuXG4gICAqIEBwYXJhbSB7UmVxdWVzdFBhcmFtZXRlcn0gcmVxdWVzdFBhcmFtZXRlciAtIFRoZSByZXF1ZXN0IHBhcmFtZXRlciB0byBjaGVjay5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGUgcmVxdWVzdCBwYXJhbWV0ZXIgaXMgbm90IG9mIGEgc3VwcG9ydGVkIHR5cGUgb3IgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gY2hlY2tSZXF1ZXN0UGFyYW1ldGVyVHlwZShcbiAgICByZXF1ZXN0UGFyYW1ldGVyOiBSZXF1ZXN0UGFyYW1ldGVyXG4gICk6IHZvaWQge1xuICAgIGlmICghdHlwZU1hcFtyZXF1ZXN0UGFyYW1ldGVyLlR5cGVdKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIHByb3BlcnR5IHR5cGUgJHtyZXF1ZXN0UGFyYW1ldGVyLlR5cGV9IG9mIHRoZSBwcm9wZXJ0eSAke3JlcXVlc3RQYXJhbWV0ZXIuTmFtZX0gaXMgbm90IHN1cHBvcnRlZC5gXG4gICAgICApO1xuICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IHR5cGVNYXBbcmVxdWVzdFBhcmFtZXRlci5UeXBlXS5qc1R5cGU7XG4gICAgY29uc3QgYWN0dWFsVHlwZSA9IHR5cGVvZiByZXF1ZXN0UGFyYW1ldGVyLlZhbHVlO1xuICAgIGNvbnN0IGludmFsaWRUeXBlTWVzc2FnZSA9IGBUaGUgdmFsdWUgJHtyZXF1ZXN0UGFyYW1ldGVyLlZhbHVlfVxcbm9mIHRoZSBwcm9wZXJ0eSAke3JlcXVlc3RQYXJhbWV0ZXIuTmFtZX1cXG5pcyBub3Qgb2YgdGhlIGV4cGVjdGVkIHR5cGUgJHtyZXF1ZXN0UGFyYW1ldGVyLlR5cGV9LmA7XG4gICAgaWYgKFxuICAgICAgcmVxdWVzdFBhcmFtZXRlci5UeXBlID09PSBcIkVudGl0eVJlZmVyZW5jZVwiIHx8XG4gICAgICByZXF1ZXN0UGFyYW1ldGVyLlR5cGUgPT09IFwiRW50aXR5XCJcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXJlcXVlc3RQYXJhbWV0ZXIuVmFsdWUgfHxcbiAgICAgICAgIXJlcXVlc3RQYXJhbWV0ZXIuVmFsdWUuaGFzT3duUHJvcGVydHkoXCJpZFwiKSB8fFxuICAgICAgICAhcmVxdWVzdFBhcmFtZXRlci5WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcImVudGl0eVR5cGVcIilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW52YWxpZFR5cGVNZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHR5cGVNYXBbXG4gICAgICAgIHJlcXVlc3RQYXJhbWV0ZXIuVHlwZVxuICAgICAgXS50eXBlTmFtZSA9IGBtc2NybS4ke3JlcXVlc3RQYXJhbWV0ZXIuVmFsdWUuZW50aXR5VHlwZX1gO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFBhcmFtZXRlci5UeXBlID09PSBcIkVudGl0eUNvbGxlY3Rpb25cIikge1xuICAgICAgaWYgKFxuICAgICAgICAhQXJyYXkuaXNBcnJheShyZXF1ZXN0UGFyYW1ldGVyLlZhbHVlKSB8fFxuICAgICAgICByZXF1ZXN0UGFyYW1ldGVyLlZhbHVlLmV2ZXJ5KFxuICAgICAgICAgICh2KSA9PlxuICAgICAgICAgICAgdHlwZW9mIHYgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgICAgICAgICF2IHx8XG4gICAgICAgICAgICAhdi5oYXNPd25Qcm9wZXJ0eShcImlkXCIpIHx8XG4gICAgICAgICAgICAhdi5oYXNPd25Qcm9wZXJ0eShcImVudGl0eVR5cGVcIilcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihpbnZhbGlkVHlwZU1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVxdWVzdFBhcmFtZXRlci5UeXBlID09PSBcIkRhdGVUaW1lXCIpIHtcbiAgICAgIGlmICghKHJlcXVlc3RQYXJhbWV0ZXIuVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW52YWxpZFR5cGVNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGFjdHVhbFR5cGUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW52YWxpZFR5cGVNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGFuIEFjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbk5hbWUgLSBUaGUgdW5pcXVlIG5hbWUgb2YgdGhlIGFjdGlvbi5cbiAgICogQHBhcmFtIHtSZXF1ZXN0UGFyYW1ldGVyW119IHJlcXVlc3RQYXJhbWV0ZXJzIC0gQW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHRoZSBwYXJhbWV0ZXIgbmFtZSwgdHlwZSBhbmQgdmFsdWUuXG4gICAqIEBwYXJhbSB7RW50aXR5UmVmZXJlbmNlfSBbYm91bmRFbnRpdHldIC0gQW4gb3B0aW9uYWwgRW50aXR5UmVmZXJlbmNlIG9mIHRoZSBib3VuZCBlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IC0gQSBQcm9taXNlIHdpdGggdGhlIHJlcXVlc3QgcmVzcG9uc2UuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGUgcmVxdWVzdCBwYXJhbWV0ZXIgaXMgbm90IG9mIGEgc3VwcG9ydGVkIHR5cGUgb3IgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gICAqL1xuICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFjdGlvbihcbiAgICBhY3Rpb25OYW1lOiBzdHJpbmcsXG4gICAgcmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJbXSxcbiAgICBib3VuZEVudGl0eT86IEVudGl0eVJlZmVyZW5jZVxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlckRlZmluaXRpb246IGFueSA9IHt9O1xuICAgIGlmIChib3VuZEVudGl0eSlcbiAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzLnB1c2goe1xuICAgICAgICBOYW1lOiBcImVudGl0eVwiLFxuICAgICAgICBWYWx1ZTogYm91bmRFbnRpdHksXG4gICAgICAgIFR5cGU6IFwiRW50aXR5UmVmZXJlbmNlXCIsXG4gICAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RQYXJhbWV0ZXIgb2YgcmVxdWVzdFBhcmFtZXRlcnMpIHtcbiAgICAgIGNoZWNrUmVxdWVzdFBhcmFtZXRlclR5cGUocmVxdWVzdFBhcmFtZXRlcik7XG4gICAgICBwYXJhbWV0ZXJEZWZpbml0aW9uW3JlcXVlc3RQYXJhbWV0ZXIuTmFtZV0gPSB7XG4gICAgICAgIHR5cGVOYW1lOiB0eXBlTWFwW3JlcXVlc3RQYXJhbWV0ZXIuVHlwZV0udHlwZU5hbWUsXG4gICAgICAgIHN0cnVjdHVyYWxQcm9wZXJ0eTogdHlwZU1hcFtyZXF1ZXN0UGFyYW1ldGVyLlR5cGVdLnN0cnVjdHVyYWxQcm9wZXJ0eSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJlcSA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7XG4gICAgICAgIGdldE1ldGFkYXRhOiAoKSA9PiAoe1xuICAgICAgICAgIGJvdW5kUGFyYW1ldGVyOiBib3VuZEVudGl0eSA/IFwiZW50aXR5XCIgOiBudWxsLFxuICAgICAgICAgIG9wZXJhdGlvblR5cGU6IDAsXG4gICAgICAgICAgb3BlcmF0aW9uTmFtZTogYWN0aW9uTmFtZSxcbiAgICAgICAgICBwYXJhbWV0ZXJUeXBlczogcGFyYW1ldGVyRGVmaW5pdGlvbixcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgICAgLi4ucmVxdWVzdFBhcmFtZXRlcnMubWFwKChwKSA9PiAoeyBbcC5OYW1lXTogcC5WYWx1ZSB9KSlcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgWHJtLldlYkFwaS5vbmxpbmUuZXhlY3V0ZShyZXEpO1xuICAgIGlmIChyZXNwb25zZS5vaykgcmV0dXJuIHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiByZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBGdW5jdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uTmFtZSAtIFRoZSB1bmlxdWUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB7UmVxdWVzdFBhcmFtZXRlcltdfSByZXF1ZXN0UGFyYW1ldGVycyAtIEFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCB0aGUgcGFyYW1ldGVyIG5hbWUsIHR5cGUgYW5kIHZhbHVlLlxuICAgKiBAcGFyYW0ge0VudGl0eVJlZmVyZW5jZX0gW2JvdW5kRW50aXR5XSAtIEFuIG9wdGlvbmFsIEVudGl0eVJlZmVyZW5jZSBvZiB0aGUgYm91bmQgZW50aXR5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSAtIEEgUHJvbWlzZSB3aXRoIHRoZSByZXF1ZXN0IHJlc3BvbnNlLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHJlcXVlc3QgcGFyYW1ldGVyIGlzIG5vdCBvZiBhIHN1cHBvcnRlZCB0eXBlIG9yIGhhcyBhbiBpbnZhbGlkIHZhbHVlLlxuICAgKi9cbiAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVGdW5jdGlvbihcbiAgICBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgICByZXF1ZXN0UGFyYW1ldGVyczogUmVxdWVzdFBhcmFtZXRlcltdLFxuICAgIGJvdW5kRW50aXR5PzogRW50aXR5UmVmZXJlbmNlXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcGFyYW1ldGVyRGVmaW5pdGlvbjogYW55ID0ge307XG4gICAgaWYgKGJvdW5kRW50aXR5KVxuICAgICAgcmVxdWVzdFBhcmFtZXRlcnMucHVzaCh7XG4gICAgICAgIE5hbWU6IFwiZW50aXR5XCIsXG4gICAgICAgIFZhbHVlOiBib3VuZEVudGl0eSxcbiAgICAgICAgVHlwZTogXCJFbnRpdHlSZWZlcmVuY2VcIixcbiAgICAgIH0pO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdFBhcmFtZXRlciBvZiByZXF1ZXN0UGFyYW1ldGVycykge1xuICAgICAgY2hlY2tSZXF1ZXN0UGFyYW1ldGVyVHlwZShyZXF1ZXN0UGFyYW1ldGVyKTtcbiAgICAgIHBhcmFtZXRlckRlZmluaXRpb25bcmVxdWVzdFBhcmFtZXRlci5OYW1lXSA9IHtcbiAgICAgICAgdHlwZU5hbWU6IHR5cGVNYXBbcmVxdWVzdFBhcmFtZXRlci5UeXBlXS50eXBlTmFtZSxcbiAgICAgICAgc3RydWN0dXJhbFByb3BlcnR5OiB0eXBlTWFwW3JlcXVlc3RQYXJhbWV0ZXIuVHlwZV0uc3RydWN0dXJhbFByb3BlcnR5LFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVxID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHtcbiAgICAgICAgZ2V0TWV0YWRhdGE6ICgpID0+ICh7XG4gICAgICAgICAgYm91bmRQYXJhbWV0ZXI6IGJvdW5kRW50aXR5ID8gXCJlbnRpdHlcIiA6IG51bGwsXG4gICAgICAgICAgb3BlcmF0aW9uVHlwZTogMSxcbiAgICAgICAgICBvcGVyYXRpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgcGFyYW1ldGVyVHlwZXM6IHBhcmFtZXRlckRlZmluaXRpb24sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICAgIC4uLnJlcXVlc3RQYXJhbWV0ZXJzLm1hcCgocCkgPT4gKHsgW3AuTmFtZV06IHAuVmFsdWUgfSkpXG4gICAgKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IFhybS5XZWJBcGkub25saW5lLmV4ZWN1dGUocmVxKTtcbiAgICBpZiAocmVzcG9uc2Uub2spIHJldHVybiByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gcmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGEgR1VJRCBsb3dlcmNhc2UgYW5kIHJlbW92ZXMgYnJhY2tldHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIC0gVGhlIEdVSUQgdG8gbm9ybWFsaXplLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBub3JtYWxpemVkIEdVSUQuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplR3VpZChndWlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgZ3VpZCAhPT0gXCJzdHJpbmdcIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXgubm9ybWFsaXplR3VpZDpcXG4nJHtndWlkfScgaXMgbm90IGEgc3RyaW5nYCk7XG4gICAgcmV0dXJuIGd1aWQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9be31dL2csIFwiXCIpO1xuICB9XG4gIC8qKlxuICAgKiBPcGVucyBhIGRpYWxvZyB3aXRoIGR5bmFtaWMgaGVpZ2h0IGFuZCB3aWR0aCBiYXNlZCBvbiB0ZXh0IGNvbnRlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGRpYWxvZy5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gLSBBIFByb21pc2Ugd2l0aCB0aGUgZGlhbG9nIHJlc3BvbnNlLlxuICAgKi9cbiAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5BbGVydERpYWxvZyhcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHRleHQ6IHN0cmluZ1xuICApOiBQcm9taXNlPGFueT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByb3dzID0gdGV4dC5zcGxpdCgvXFxyXFxufFxccnxcXG4vKTtcbiAgICAgIGxldCBhZGRpdGlvbmFsUm93cyA9IDA7XG4gICAgICByb3dzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICBsZXQgd2lkdGggPSBnZXRUZXh0V2lkdGgoXG4gICAgICAgICAgcm93LFxuICAgICAgICAgIFwiMXJlbSBTZWdvZSBVSSBSZWd1bGFyLCBTZWdvZVVJLCBTZWdvZSBVSVwiXG4gICAgICAgICk7XG4gICAgICAgIGlmICh3aWR0aCA+IDk0MCkge1xuICAgICAgICAgIGFkZGl0aW9uYWxSb3dzICs9IHdpZHRoIC8gOTQwO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGxvbmdlc3RSb3cgPSByb3dzLnJlZHVjZShcbiAgICAgICAgKGFjYywgcm93KSA9PiAocm93Lmxlbmd0aCA+IGFjYy5sZW5ndGggPyByb3cgOiBhY2MpLFxuICAgICAgICBcIlwiXG4gICAgICApO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1pbihcbiAgICAgICAgZ2V0VGV4dFdpZHRoKGxvbmdlc3RSb3csIFwiMXJlbSBTZWdvZSBVSSBSZWd1bGFyLCBTZWdvZVVJLCBTZWdvZSBVSVwiKSxcbiAgICAgICAgMTAwMFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IDEwOSArIChyb3dzLmxlbmd0aCArIGFkZGl0aW9uYWxSb3dzKSAqIDIwO1xuICAgICAgcmV0dXJuIGF3YWl0IFhybS5OYXZpZ2F0aW9uLm9wZW5BbGVydERpYWxvZyhcbiAgICAgICAge1xuICAgICAgICAgIGNvbmZpcm1CdXR0b25MYWJlbDogXCJPa1wiLFxuICAgICAgICAgIHRleHQsXG4gICAgICAgICAgdGl0bGUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtnZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXNlcyBjYW52YXMubWVhc3VyZVRleHQgdG8gY29tcHV0ZSBhbmQgcmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgZ2l2ZW4gdGV4dCBvZiBnaXZlbiBmb250IGluIHBpeGVscy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IHRvIGJlIHJlbmRlcmVkLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmb250IFRoZSBjc3MgZm9udCBkZXNjcmlwdG9yIHRoYXQgdGV4dCBpcyB0byBiZSByZW5kZXJlZCB3aXRoIChlLmcuIFwiYm9sZCAxNHB4IHZlcmRhbmFcIikuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzExODI0MS9jYWxjdWxhdGUtdGV4dC13aWR0aC13aXRoLWphdmFzY3JpcHQvMjEwMTUzOTMjMjEwMTUzOTNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRUZXh0V2lkdGgodGV4dDogc3RyaW5nLCBmb250OiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGNvbnRleHQuZm9udCA9IGZvbnQ7XG4gICAgICBjb25zdCBtZXRyaWNzID0gY29udGV4dC5tZWFzdXJlVGV4dCh0ZXh0KTtcbiAgICAgIHJldHVybiBtZXRyaWNzLndpZHRoO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIGZvcm0gaW4gRHluYW1pY3MgMzY1LlxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEZvcm0ge1xuICAgIHByb3RlY3RlZCBzdGF0aWMgX2Zvcm1Db250ZXh0OiBYcm0uRm9ybUNvbnRleHQ7XG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfZXhlY3V0aW9uQ29udGV4dDogWHJtLkV2ZW50cy5FdmVudENvbnRleHQ7XG4gICAgY29uc3RydWN0b3IoKSB7fVxuICAgIC8qKkdldHMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZm9ybSBjb250ZXh0Ki9cbiAgICBzdGF0aWMgZ2V0IGZvcm1Db250ZXh0KCk6IFhybS5Gb3JtQ29udGV4dCB7XG4gICAgICByZXR1cm4gdGhpcy5fZm9ybUNvbnRleHQ7XG4gICAgfVxuICAgIC8qKkdldHMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZXhlY3V0aW8gY29udGV4dCovXG4gICAgc3RhdGljIGdldCBleGVjdXRpb25Db250ZXh0KCk6IFhybS5FdmVudHMuRXZlbnRDb250ZXh0IHtcbiAgICAgIHJldHVybiB0aGlzLl9leGVjdXRpb25Db250ZXh0O1xuICAgIH1cbiAgICAvKipHZXRzIGEgbG9va3VwIHZhbHVlIHRoYXQgcmVmZXJlbmNlcyB0aGUgcmVjb3JkLiovXG4gICAgc3RhdGljIGdldCBlbnRpdHlSZWZlcmVuY2UoKSB7XG4gICAgICByZXR1cm4gRm9ybS5mb3JtQ29udGV4dC5kYXRhLmVudGl0eS5nZXRFbnRpdHlSZWZlcmVuY2UoKTtcbiAgICB9XG4gICAgLyoqU2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBmb3JtIGNvbnRleHQqL1xuICAgIHN0YXRpYyBzZXQgZm9ybUNvbnRleHQoY29udGV4dDogWHJtLkZvcm1Db250ZXh0IHwgWHJtLkV2ZW50cy5FdmVudENvbnRleHQpIHtcbiAgICAgIGlmIChcImdldEZvcm1Db250ZXh0XCIgaW4gY29udGV4dCkge1xuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5fZm9ybUNvbnRleHQgPSBjb250ZXh0LmdldEZvcm1Db250ZXh0KCk7XG4gICAgICB9IGVsc2UgaWYgKFwiZGF0YVwiIGluIGNvbnRleHQpIHRoaXMuX2Zvcm1Db250ZXh0ID0gY29udGV4dDtcbiAgICAgIGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBYcm1FeC5Gb3JtLnNldEZvcm1Db250ZXh0OiBUaGUgZXhlY3V0aW9uQ29udGV4dCBvciBmb3JtQ29udGV4dCB3YXMgbm90IHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uYFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipTZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0Ki9cbiAgICBzdGF0aWMgc2V0IGV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICBjb250ZXh0OiBYcm0uRm9ybUNvbnRleHQgfCBYcm0uRXZlbnRzLkV2ZW50Q29udGV4dFxuICAgICkge1xuICAgICAgaWYgKFwiZ2V0Rm9ybUNvbnRleHRcIiBpbiBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLl9mb3JtQ29udGV4dCA9IGNvbnRleHQuZ2V0Rm9ybUNvbnRleHQoKTtcbiAgICAgIH0gZWxzZSBpZiAoXCJkYXRhXCIgaW4gY29udGV4dCkgdGhpcy5fZm9ybUNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgZWxzZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFhybUV4LkZvcm0uc2V0RXhlY3V0aW9uQ29udGV4dDogVGhlIGV4ZWN1dGlvbkNvbnRleHQgb3IgZm9ybUNvbnRleHQgd2FzIG5vdCBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLmBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqUmV0dXJucyB0cnVlIGlmIGZvcm0gaXMgZnJvbSB0eXBlIGNyZWF0ZSovXG4gICAgc3RhdGljIGdldCBJc0NyZWF0ZSgpIHtcbiAgICAgIHJldHVybiBGb3JtLmZvcm1Db250ZXh0LnVpLmdldEZvcm1UeXBlKCkgPT0gMTtcbiAgICB9XG4gICAgLyoqUmV0dXJucyB0cnVlIGlmIGZvcm0gaXMgZnJvbSB0eXBlIHVwZGF0ZSovXG4gICAgc3RhdGljIGdldCBJc1VwZGF0ZSgpIHtcbiAgICAgIHJldHVybiBGb3JtLmZvcm1Db250ZXh0LnVpLmdldEZvcm1UeXBlKCkgPT0gMjtcbiAgICB9XG4gICAgLyoqUmV0dXJucyB0cnVlIGlmIGZvcm0gaXMgbm90IGZyb20gdHlwZSBjcmVhdGUqL1xuICAgIHN0YXRpYyBnZXQgSXNOb3RDcmVhdGUoKSB7XG4gICAgICByZXR1cm4gRm9ybS5mb3JtQ29udGV4dC51aS5nZXRGb3JtVHlwZSgpICE9IDE7XG4gICAgfVxuICAgIC8qKlJldHVybnMgdHJ1ZSBpZiBmb3JtIGlzIG5vdCBmcm9tIHR5cGUgdXBkYXRlKi9cbiAgICBzdGF0aWMgZ2V0IElzTm90VXBkYXRlKCkge1xuICAgICAgcmV0dXJuIEZvcm0uZm9ybUNvbnRleHQudWkuZ2V0Rm9ybVR5cGUoKSAhPSAyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwbGF5cyBhIGZvcm0gbGV2ZWwgbm90aWZpY2F0aW9uLiBBbnkgbnVtYmVyIG9mIG5vdGlmaWNhdGlvbnMgY2FuIGJlIGRpc3BsYXllZCBhbmQgd2lsbCByZW1haW4gdW50aWwgcmVtb3ZlZCB1c2luZyBjbGVhckZvcm1Ob3RpZmljYXRpb24uXG4gICAgICogVGhlIGhlaWdodCBvZiB0aGUgbm90aWZpY2F0aW9uIGFyZWEgaXMgbGltaXRlZCBzbyBlYWNoIG5ldyBtZXNzYWdlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRvcC5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgdGV4dCBvZiB0aGUgbm90aWZpY2F0aW9uIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIGxldmVsIFRoZSBsZXZlbCBvZiB0aGUgbm90aWZpY2F0aW9uIHdoaWNoIGRlZmluZXMgaG93IHRoZSBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkLCBzdWNoIGFzIHRoZSBpY29uLlxuICAgICAqIEVSUk9SOiBOb3RpZmljYXRpb24gd2lsbCB1c2UgdGhlIHN5c3RlbSBlcnJvciBpY29uLlxuICAgICAqIFdBUk5JTkc6IE5vdGlmaWNhdGlvbiB3aWxsIHVzZSB0aGUgc3lzdGVtIHdhcm5pbmcgaWNvbi5cbiAgICAgKiBJTkZPOiBOb3RpZmljYXRpb24gd2lsbCB1c2UgdGhlIHN5c3RlbSBpbmZvIGljb24uXG4gICAgICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbm90aWZpY2F0aW9uIHdoaWNoIGlzIHVzZWQgd2l0aCBjbGVhckZvcm1Ob3RpZmljYXRpb24gdG8gcmVtb3ZlIHRoZSBub3RpZmljYXRpb24uXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBpdCBzdWNjZWVkcywgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAqL1xuICAgIHN0YXRpYyBhZGRGb3JtTm90aWZpY2F0aW9uKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgbGV2ZWw6IFhybS5Gb3JtTm90aWZpY2F0aW9uTGV2ZWwsXG4gICAgICB1bmlxdWVJZDogc3RyaW5nXG4gICAgKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gRm9ybS5mb3JtQ29udGV4dC51aS5zZXRGb3JtTm90aWZpY2F0aW9uKFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgdW5pcXVlSWRcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGZvcm0gbm90aWZpY2F0aW9uIGRlc2NyaWJlZCBieSB1bmlxdWVJZC5cbiAgICAgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiBpdCBzdWNjZWVkcywgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAqL1xuICAgIHN0YXRpYyByZW1vdmVGb3JtTm90aWZpY2F0aW9uKHVuaXF1ZUlkOiBzdHJpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBGb3JtLmZvcm1Db250ZXh0LnVpLmNsZWFyRm9ybU5vdGlmaWNhdGlvbih1bmlxdWVJZCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHJlY29yZCBpcyBzYXZlZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgYWRkT25TYXZlRXZlbnRIYW5kbGVyKFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGhhbmRsZXJzID0gW2hhbmRsZXJzXTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZGF0YS5lbnRpdHkuYWRkT25TYXZlKGhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSBPblNhdmUgaXMgY29tcGxldGUuXG4gICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIuXG4gICAgICogQHJlbWFya3MgQWRkZWQgaW4gOS4yXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcG93ZXJhcHBzL2RldmVsb3Blci9tb2RlbC1kcml2ZW4tYXBwcy9jbGllbnRhcGkvcmVmZXJlbmNlL2V2ZW50cy9wb3N0c2F2ZSBFeHRlcm5hbCBMaW5rOiBQb3N0U2F2ZSBFdmVudCBEb2N1bWVudGF0aW9ufVxuICAgICAqL1xuICAgIHN0YXRpYyBhZGRPblBvc3RTYXZlRXZlbnRIYW5kbGVyKFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGhhbmRsZXJzID0gW2hhbmRsZXJzXTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZGF0YS5lbnRpdHkuYWRkT25Qb3N0U2F2ZShoYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGZvcm0gZGF0YSBpcyBsb2FkZWQuXG4gICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGZvcm0gZGF0YSBsb2Fkcy4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgZXZlbnQgaGFuZGxlciBwaXBlbGluZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYWRkT25Mb2FkRXZlbnRIYW5kbGVyKFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGhhbmRsZXJzID0gW2hhbmRsZXJzXTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZGF0YS5hZGRPbkxvYWQoaGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZSBpcyBjaGFuZ2VkLlxuICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBmdW5jdGlvbiByZWZlcmVuY2UuXG4gICAgICovXG4gICAgc3RhdGljIGFkZE9uQ2hhbmdlRXZlbnRIYW5kbGVyKFxuICAgICAgZmllbGRzOiBGaWVsZFtdLFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXSxcbiAgICAgIGV4ZWN1dGU/OiBib29sZWFuXG4gICAgKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaGFuZGxlcnMpKSB7XG4gICAgICAgICAgaGFuZGxlcnMgPSBbaGFuZGxlcnNdO1xuICAgICAgICB9XG4gICAgICAgIGhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtoYW5kbGVyfScgaXMgbm90IGEgZnVuY3Rpb25gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBmaWVsZC5hZGRPbkNoYW5nZShoYW5kbGVyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChleGVjdXRlKSB7XG4gICAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBmaWVsZC5BdHRyaWJ1dGUuZmlyZU9uQ2hhbmdlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogVXNlZCB0byBleGVjdXRlIG1ldGhvZHMgcmVsYXRlZCB0byBhIHNpbmdsZSBBdHRyaWJ1dGVcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBGaWVsZCBpbXBsZW1lbnRzIFhybS5BdHRyaWJ1dGVzLkF0dHJpYnV0ZSB7XG4gICAgcHVibGljIHN0YXRpYyBhbGxGaWVsZHM6IEZpZWxkW10gPSBbXTtcblxuICAgIHB1YmxpYyByZWFkb25seSBOYW1lITogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfYXR0cmlidXRlPzogWHJtLkF0dHJpYnV0ZXMuQXR0cmlidXRlO1xuXG4gICAgY29uc3RydWN0b3IoYXR0cmlidXRlTmFtZTogc3RyaW5nKSB7XG4gICAgICBjb25zdCBleGlzdGluZ0ZpZWxkID0gRmllbGQuYWxsRmllbGRzLmZpbmQoXG4gICAgICAgIChmKSA9PiBmLk5hbWUgPT09IGF0dHJpYnV0ZU5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoZXhpc3RpbmdGaWVsZCkge1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdGaWVsZDtcbiAgICAgIH1cbiAgICAgIHRoaXMuTmFtZSA9IGF0dHJpYnV0ZU5hbWU7XG4gICAgICBGaWVsZC5hbGxGaWVsZHMucHVzaCh0aGlzKTtcbiAgICB9XG4gICAgc2V0VmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgZ2V0QXR0cmlidXRlVHlwZSgpOiBYcm0uQXR0cmlidXRlcy5BdHRyaWJ1dGVUeXBlIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVUeXBlKCk7XG4gICAgfVxuICAgIGdldEZvcm1hdCgpOiBYcm0uQXR0cmlidXRlcy5BdHRyaWJ1dGVGb3JtYXQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldEZvcm1hdCgpO1xuICAgIH1cbiAgICBnZXRJc0RpcnR5KCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldElzRGlydHkoKTtcbiAgICB9XG4gICAgZ2V0TmFtZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE5hbWUoKTtcbiAgICB9XG4gICAgZ2V0UGFyZW50KCk6IFhybS5FbnRpdHkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFBhcmVudCgpO1xuICAgIH1cbiAgICBnZXRSZXF1aXJlZExldmVsKCk6IFhybS5BdHRyaWJ1dGVzLlJlcXVpcmVtZW50TGV2ZWwge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFJlcXVpcmVkTGV2ZWwoKTtcbiAgICB9XG4gICAgZ2V0U3VibWl0TW9kZSgpOiBYcm0uU3VibWl0TW9kZSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0U3VibWl0TW9kZSgpO1xuICAgIH1cbiAgICBnZXRVc2VyUHJpdmlsZWdlKCk6IFhybS5Qcml2aWxlZ2Uge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFVzZXJQcml2aWxlZ2UoKTtcbiAgICB9XG4gICAgcmVtb3ZlT25DaGFuZ2UoaGFuZGxlcjogWHJtLkV2ZW50cy5BdHRyaWJ1dGUuQ2hhbmdlRXZlbnRIYW5kbGVyKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUucmVtb3ZlT25DaGFuZ2UoaGFuZGxlcik7XG4gICAgfVxuICAgIHNldFN1Ym1pdE1vZGUoc3VibWl0TW9kZTogWHJtLlN1Ym1pdE1vZGUpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5zZXRTdWJtaXRNb2RlKHN1Ym1pdE1vZGUpO1xuICAgIH1cbiAgICBnZXRWYWx1ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBzZXRJc1ZhbGlkKGlzVmFsaWQ6IGJvb2xlYW4sIG1lc3NhZ2U/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5zZXRJc1ZhbGlkKGlzVmFsaWQsIG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgQXR0cmlidXRlKCk6IFhybS5BdHRyaWJ1dGVzLkF0dHJpYnV0ZSB7XG4gICAgICByZXR1cm4gKHRoaXMuX2F0dHJpYnV0ZSA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC5nZXRBdHRyaWJ1dGUodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKFxuICAgICAgICAgIGBUaGUgYXR0cmlidXRlICcke3RoaXMuTmFtZX0nIHdhcyBub3QgZm91bmQgb24gdGhlIGZvcm0uYFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbnRyb2xzKCk6IFhybS5Db2xsZWN0aW9uLkl0ZW1Db2xsZWN0aW9uPFhybS5Db250cm9scy5TdGFuZGFyZENvbnRyb2w+IHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5jb250cm9scztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIGdldCBWYWx1ZSgpOiBhbnkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICB0aGlzLkF0dHJpYnV0ZS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGNvbnRyb2wtbG9jYWwgbm90aWZpY2F0aW9uIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgaXQgc3VjY2VlZHMsIGZhbHNlIGlmIGl0IGZhaWxzLlxuICAgICAqIEByZW1hcmtzICAgICBXaGVuIHRoaXMgbWV0aG9kIGlzIHVzZWQgb24gTWljcm9zb2Z0IER5bmFtaWNzIENSTSBmb3IgdGFibGV0cyBhIHJlZCBcIlhcIiBpY29uXG4gICAgICogICAgICAgICAgICAgIGFwcGVhcnMgbmV4dCB0byB0aGUgY29udHJvbC4gVGFwcGluZyBvbiB0aGUgaWNvbiB3aWxsIGRpc3BsYXkgdGhlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgcHVibGljIHNldE5vdGlmaWNhdGlvbihtZXNzYWdlOiBzdHJpbmcsIHVuaXF1ZUlkOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghbWVzc2FnZSkgdGhyb3cgbmV3IEVycm9yKGBubyBtZXNzYWdlIHdhcyBwcm92aWRlZC5gKTtcbiAgICAgICAgaWYgKCF1bmlxdWVJZCkgdGhyb3cgbmV3IEVycm9yKGBubyB1bmlxdWVJZCB3YXMgcHJvdmlkZWQuYCk7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT5cbiAgICAgICAgICBjb250cm9sLnNldE5vdGlmaWNhdGlvbihtZXNzYWdlLCB1bmlxdWVJZClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IHN0YXRlLlxuICAgICAqIEBwYXJhbSB2aXNpYmxlIHRydWUgdG8gc2hvdywgZmFsc2UgdG8gaGlkZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0VmlzaWJsZSh2aXNpYmxlOiBib29sZWFuKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IGNvbnRyb2wuc2V0VmlzaWJsZSh2aXNpYmxlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIGNvbnRyb2wgdG8gZWl0aGVyIGVuYWJsZWQsIG9yIGRpc2FibGVkLlxuICAgICAqIEBwYXJhbSBkaXNhYmxlZCB0cnVlIHRvIGRpc2FibGUsIGZhbHNlIHRvIGVuYWJsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWQoZGlzYWJsZWQ6IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4gY29udHJvbC5zZXREaXNhYmxlZChkaXNhYmxlZCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHJlcXVpcmVkIGxldmVsLlxuICAgICAqIEBwYXJhbSByZXF1aXJlbWVudExldmVsIFRoZSByZXF1aXJlbWVudCBsZXZlbCwgYXMgZWl0aGVyIFwibm9uZVwiLCBcInJlcXVpcmVkXCIsIG9yIFwicmVjb21tZW5kZWRcIlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRSZXF1aXJlZExldmVsKFxuICAgICAgcmVxdWlyZW1lbnRMZXZlbDogWHJtLkF0dHJpYnV0ZXMuUmVxdWlyZW1lbnRMZXZlbFxuICAgICk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5BdHRyaWJ1dGUuc2V0UmVxdWlyZWRMZXZlbChyZXF1aXJlbWVudExldmVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByZXF1aXJlZCBsZXZlbC5cbiAgICAgKiBAcGFyYW0gcmVxdWlyZWQgVGhlIHJlcXVpcmVtZW50IGxldmVsLCBhcyBlaXRoZXIgZmFsc2UgZm9yIFwibm9uZVwiIG9yIHRydWUgZm9yIFwicmVxdWlyZWRcIlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRSZXF1aXJlZChyZXF1aXJlZDogYm9vbGVhbik6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5BdHRyaWJ1dGUuc2V0UmVxdWlyZWRMZXZlbChyZXF1aXJlZCA/IFwicmVxdWlyZWRcIiA6IFwibm9uZVwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipGaXJlIGFsbCBcIm9uIGNoYW5nZVwiIGV2ZW50IGhhbmRsZXJzLiAqL1xuICAgIHB1YmxpYyBmaXJlT25DaGFuZ2UoKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLkF0dHJpYnV0ZS5maXJlT25DaGFuZ2UoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgaGFuZGxlciBvciBhbiBhcnJheSBvZiBoYW5kbGVycyB0byBiZSBjYWxsZWQgd2hlbiB0aGUgYXR0cmlidXRlJ3MgdmFsdWUgaXMgY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0gaGFuZGxlcnMgVGhlIGZ1bmN0aW9uIHJlZmVyZW5jZSBvciBhbiBhcnJheSBvZiBmdW5jdGlvbiByZWZlcmVuY2VzLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRPbkNoYW5nZShcbiAgICAgIGhhbmRsZXJzOlxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJcbiAgICAgICAgfCBYcm0uRXZlbnRzLkNvbnRleHRTZW5zaXRpdmVIYW5kbGVyW11cbiAgICApOiB0aGlzIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgICB0aGlzLkF0dHJpYnV0ZS5yZW1vdmVPbkNoYW5nZShoYW5kbGVyKTtcbiAgICAgICAgICAgIHRoaXMuQXR0cmlidXRlLmFkZE9uQ2hhbmdlKGhhbmRsZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXJzICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2hhbmRsZXJzfScgaXMgbm90IGEgZnVuY3Rpb25gKTtcbiAgICAgICAgICB0aGlzLkF0dHJpYnV0ZS5yZW1vdmVPbkNoYW5nZShoYW5kbGVycyk7XG4gICAgICAgICAgdGhpcy5BdHRyaWJ1dGUuYWRkT25DaGFuZ2UoaGFuZGxlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYW4gZXJyb3Igb3IgcmVjb21tZW5kYXRpb24gbm90aWZpY2F0aW9uIGZvciBhIGNvbnRyb2wsIGFuZCBsZXRzIHlvdSBzcGVjaWZ5IGFjdGlvbnMgdG8gZXhlY3V0ZSBiYXNlZCBvbiB0aGUgbm90aWZpY2F0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGROb3RpZmljYXRpb24oXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBub3RpZmljYXRpb25MZXZlbDogXCJFUlJPUlwiIHwgXCJSRUNPTU1FTkRBVElPTlwiLFxuICAgICAgdW5pcXVlSWQ6IHN0cmluZyxcbiAgICAgIGFjdGlvbnM/OiBYcm0uQ29udHJvbHMuQ29udHJvbE5vdGlmaWNhdGlvbkFjdGlvbltdXG4gICAgKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXVuaXF1ZUlkKSB0aHJvdyBuZXcgRXJyb3IoYG5vIHVuaXF1ZUlkIHdhcyBwcm92aWRlZC5gKTtcbiAgICAgICAgaWYgKGFjdGlvbnMgJiYgIUFycmF5LmlzQXJyYXkoYWN0aW9ucykpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHRoZSBhY3Rpb24gcGFyYW1ldGVyIGlzIG5vdCBhbiBhcnJheSBvZiBDb250cm9sTm90aWZpY2F0aW9uQWN0aW9uYFxuICAgICAgICAgICk7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnRyb2wuYWRkTm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBbbWVzc2FnZV0sXG4gICAgICAgICAgICBub3RpZmljYXRpb25MZXZlbDogbm90aWZpY2F0aW9uTGV2ZWwsXG4gICAgICAgICAgICB1bmlxdWVJZDogdW5pcXVlSWQsXG4gICAgICAgICAgICBhY3Rpb25zOiBhY3Rpb25zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBub3RpZmljYXRpb24gaWRlbnRpZmllZCBieSB1bmlxdWVJZC5cbiAgICAgKiBAcGFyYW0gdW5pcXVlSWQgKE9wdGlvbmFsKSBVbmlxdWUgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGl0IHN1Y2NlZWRzLCBmYWxzZSBpZiBpdCBmYWlscy5cbiAgICAgKiBAcmVtYXJrcyBJZiB0aGUgdW5pcXVlSWQgcGFyYW1ldGVyIGlzIG5vdCB1c2VkLCB0aGUgY3VycmVudCBub3RpZmljYXRpb24gc2hvd24gd2lsbCBiZSByZW1vdmVkLlxuICAgICAqL1xuICAgIHJlbW92ZU5vdGlmaWNhdGlvbih1bmlxdWVJZDogc3RyaW5nKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICBjb250cm9sLmNsZWFyTm90aWZpY2F0aW9uKHVuaXF1ZUlkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGV4cG9ydCBjbGFzcyBUZXh0RmllbGRcbiAgICBleHRlbmRzIEZpZWxkXG4gICAgaW1wbGVtZW50cyBYcm0uQXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGVcbiAge1xuICAgIHByb3RlY3RlZCBkZWNsYXJlIF9hdHRyaWJ1dGU6IFhybS5BdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZTtcbiAgICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGU6IHN0cmluZykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlKTtcbiAgICB9XG4gICAgZ2V0TWF4TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0TWF4TGVuZ3RoKCk7XG4gICAgfVxuICAgIGdldEZvcm1hdCgpOiBYcm0uQXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGVGb3JtYXQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldEZvcm1hdCgpIGFzIFhybS5BdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZUZvcm1hdDtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFZhbHVlKCkgPz8gbnVsbDtcbiAgICB9XG4gICAgc2V0IFZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIE51bWJlckZpZWxkXG4gICAgZXh0ZW5kcyBGaWVsZFxuICAgIGltcGxlbWVudHMgWHJtLkF0dHJpYnV0ZXMuTnVtYmVyQXR0cmlidXRlXG4gIHtcbiAgICBwcm90ZWN0ZWQgZGVjbGFyZSBfYXR0cmlidXRlOiBYcm0uQXR0cmlidXRlcy5OdW1iZXJBdHRyaWJ1dGU7XG4gICAgY29uc3RydWN0b3IoYXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICAgIHN1cGVyKGF0dHJpYnV0ZSk7XG4gICAgfVxuICAgIGdldEZvcm1hdCgpOiBYcm0uQXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlRm9ybWF0IHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRGb3JtYXQoKSBhcyBYcm0uQXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlRm9ybWF0O1xuICAgIH1cbiAgICBnZXRNYXgoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRNYXgoKTtcbiAgICB9XG4gICAgZ2V0TWluKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0TWluKCk7XG4gICAgfVxuICAgIGdldFByZWNpc2lvbigpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFByZWNpc2lvbigpO1xuICAgIH1cbiAgICBzZXRQcmVjaXNpb24ocHJlY2lzaW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5zZXRQcmVjaXNpb24ocHJlY2lzaW9uKTtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBWYWx1ZSgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFZhbHVlKCkgPz8gbnVsbDtcbiAgICB9XG4gICAgc2V0IFZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIERhdGVGaWVsZCBleHRlbmRzIEZpZWxkIGltcGxlbWVudHMgWHJtLkF0dHJpYnV0ZXMuRGF0ZUF0dHJpYnV0ZSB7XG4gICAgcHJvdGVjdGVkIGRlY2xhcmUgX2F0dHJpYnV0ZTogWHJtLkF0dHJpYnV0ZXMuRGF0ZUF0dHJpYnV0ZTtcbiAgICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGU6IHN0cmluZykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlKTtcbiAgICB9XG4gICAgZ2V0Rm9ybWF0KCk6IFhybS5BdHRyaWJ1dGVzLkRhdGVBdHRyaWJ1dGVGb3JtYXQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldEZvcm1hdCgpIGFzIFhybS5BdHRyaWJ1dGVzLkRhdGVBdHRyaWJ1dGVGb3JtYXQ7XG4gICAgfVxuICAgIGdldCBBdHRyaWJ1dGUoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuX2F0dHJpYnV0ZSA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC5nZXRBdHRyaWJ1dGUodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBGaWVsZCAnJHt0aGlzLk5hbWV9JyBkb2VzIG5vdCBleGlzdGApKTtcbiAgICB9XG4gICAgZ2V0IGNvbnRyb2xzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmNvbnRyb2xzO1xuICAgIH1cbiAgICBnZXQgVmFsdWUoKTogRGF0ZSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VmFsdWUoKSA/PyBudWxsO1xuICAgIH1cbiAgICBzZXQgVmFsdWUodmFsdWU6IERhdGUpIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIEJvb2xlYW5GaWVsZFxuICAgIGV4dGVuZHMgRmllbGRcbiAgICBpbXBsZW1lbnRzIFhybS5BdHRyaWJ1dGVzLkJvb2xlYW5BdHRyaWJ1dGVcbiAge1xuICAgIHByb3RlY3RlZCBkZWNsYXJlIF9hdHRyaWJ1dGU6IFhybS5BdHRyaWJ1dGVzLkJvb2xlYW5BdHRyaWJ1dGU7XG4gICAgY29uc3RydWN0b3IoYXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICAgIHN1cGVyKGF0dHJpYnV0ZSk7XG4gICAgfVxuICAgIGdldEF0dHJpYnV0ZVR5cGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVHlwZSgpO1xuICAgIH1cbiAgICBnZXRJbml0aWFsVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0SW5pdGlhbFZhbHVlKCk7XG4gICAgfVxuICAgIGdldCBBdHRyaWJ1dGUoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuX2F0dHJpYnV0ZSA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC5nZXRBdHRyaWJ1dGUodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBGaWVsZCAnJHt0aGlzLk5hbWV9JyBkb2VzIG5vdCBleGlzdGApKTtcbiAgICB9XG4gICAgZ2V0IGNvbnRyb2xzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmNvbnRyb2xzO1xuICAgIH1cbiAgICBnZXQgVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VmFsdWUoKSA/PyBudWxsO1xuICAgIH1cbiAgICBzZXQgVmFsdWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIE11bHRpU2VsZWN0T3B0aW9uU2V0RmllbGQ8T3B0aW9ucyBleHRlbmRzIE9wdGlvblZhbHVlcz5cbiAgICBleHRlbmRzIEZpZWxkXG4gICAgaW1wbGVtZW50cyBYcm0uQXR0cmlidXRlcy5NdWx0aVNlbGVjdE9wdGlvblNldEF0dHJpYnV0ZVxuICB7XG4gICAgcHJvdGVjdGVkIGRlY2xhcmUgX2F0dHJpYnV0ZTogWHJtLkF0dHJpYnV0ZXMuTXVsdGlTZWxlY3RPcHRpb25TZXRBdHRyaWJ1dGU7XG4gICAgT3B0aW9uOiBPcHRpb25zO1xuICAgIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgb3B0aW9uPzogT3B0aW9ucykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlTmFtZSk7XG4gICAgICB0aGlzLk9wdGlvbiA9IG9wdGlvbjtcbiAgICB9XG4gICAgZ2V0Rm9ybWF0KCk6IFhybS5BdHRyaWJ1dGVzLk9wdGlvblNldEF0dHJpYnV0ZUZvcm1hdCB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0Rm9ybWF0KCkgYXMgWHJtLkF0dHJpYnV0ZXMuT3B0aW9uU2V0QXR0cmlidXRlRm9ybWF0O1xuICAgIH1cbiAgICBnZXRPcHRpb24odmFsdWU6IG51bWJlciB8IHN0cmluZyk6IFhybS5PcHRpb25TZXRWYWx1ZSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRPcHRpb24odmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbih2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGdldE9wdGlvbnMoKTogWHJtLk9wdGlvblNldFZhbHVlW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbnMoKTtcbiAgICB9XG4gICAgZ2V0U2VsZWN0ZWRPcHRpb24oKTogWHJtLk9wdGlvblNldFZhbHVlW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFNlbGVjdGVkT3B0aW9uKCk7XG4gICAgfVxuICAgIGdldFRleHQoKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFRleHQoKTtcbiAgICB9XG4gICAgZ2V0SW5pdGlhbFZhbHVlKCk6IG51bWJlcltdIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRJbml0aWFsVmFsdWUoKTtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBWYWx1ZSgpOiBudW1iZXJbXSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VmFsdWUoKTtcbiAgICB9XG4gICAgc2V0IFZhbHVlKHZhbHVlOiAoa2V5b2YgT3B0aW9ucylbXSB8IG51bWJlcltdKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgbGV0IHZhbHVlcyA9IFtdO1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2ID09IFwibnVtYmVyXCIpIHZhbHVlcy5wdXNoKHYpO1xuICAgICAgICAgIGVsc2UgdmFsdWVzLnB1c2godGhpcy5PcHRpb25bdl0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5BdHRyaWJ1dGUuc2V0VmFsdWUodmFsdWVzKTtcbiAgICAgIH0gZWxzZSBYcm1FeC50aHJvd0Vycm9yKGBGaWVsZCBWYWx1ZSAnJHt2YWx1ZX0nIGlzIG5vdCBhbiBBcnJheWApO1xuICAgIH1cbiAgfVxuICBleHBvcnQgY2xhc3MgTG9va3VwRmllbGRcbiAgICBleHRlbmRzIEZpZWxkXG4gICAgaW1wbGVtZW50cyBYcm0uQXR0cmlidXRlcy5Mb29rdXBBdHRyaWJ1dGVcbiAge1xuICAgIHByb3RlY3RlZCBkZWNsYXJlIF9hdHRyaWJ1dGU6IFhybS5BdHRyaWJ1dGVzLkxvb2t1cEF0dHJpYnV0ZTtcbiAgICBwcm90ZWN0ZWQgX2N1c3RvbUZpbHRlcnM6IGFueSA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgICBzdXBlcihhdHRyaWJ1dGUpO1xuICAgIH1cbiAgICBnZXRJc1BhcnR5TGlzdCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRJc1BhcnR5TGlzdCgpO1xuICAgIH1cbiAgICBnZXQgQXR0cmlidXRlKCkge1xuICAgICAgcmV0dXJuICh0aGlzLl9hdHRyaWJ1dGUgPz89XG4gICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZ2V0QXR0cmlidXRlKHRoaXMuTmFtZSkgPz9cbiAgICAgICAgWHJtRXgudGhyb3dFcnJvcihgRmllbGQgJyR7dGhpcy5OYW1lfScgZG9lcyBub3QgZXhpc3RgKSk7XG4gICAgfVxuICAgIGdldCBjb250cm9scygpIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5jb250cm9scztcbiAgICB9XG4gICAgLyoqR2V0cyB0aGUgaWQgb2YgdGhlIGZpcnN0IGxvb2t1cCB2YWx1ZSovXG4gICAgZ2V0IElkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuVmFsdWUgJiYgdGhpcy5WYWx1ZS5sZW5ndGggPiAwXG4gICAgICAgID8gWHJtRXgubm9ybWFsaXplR3VpZCh0aGlzLlZhbHVlWzBdLmlkKVxuICAgICAgICA6IG51bGw7XG4gICAgfVxuICAgIC8qKkdldHMgdGhlIGVudGl0eVR5cGUgb2YgdGhlIGZpcnN0IGxvb2t1cCB2YWx1ZSovXG4gICAgZ2V0IEVudGl0eVR5cGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5WYWx1ZSAmJiB0aGlzLlZhbHVlLmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLlZhbHVlWzBdLmVudGl0eVR5cGVcbiAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICAvKipHZXRzIHRoZSBmb3JtYXR0ZWQgdmFsdWUgb2YgdGhlIGZpcnN0IGxvb2t1cCB2YWx1ZSovXG4gICAgZ2V0IEZvcm1hdHRlZFZhbHVlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuVmFsdWUgJiYgdGhpcy5WYWx1ZS5sZW5ndGggPiAwID8gdGhpcy5WYWx1ZVswXS5uYW1lIDogbnVsbDtcbiAgICB9XG4gICAgZ2V0IFZhbHVlKCk6IFhybS5Mb29rdXBWYWx1ZVtdIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRWYWx1ZSgpID8/IG51bGw7XG4gICAgfVxuICAgIHNldCBWYWx1ZSh2YWx1ZTogWHJtLkxvb2t1cFZhbHVlW10pIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBsb29rdXBcbiAgICAgKiBAcGFyYW0gaWQgR3VpZCBvZiB0aGUgcmVjb3JkXG4gICAgICogQHBhcmFtIGVudGl0eVR5cGUgbG9naWNhbG5hbWUgb2YgdGhlIGVudGl0eVxuICAgICAqIEBwYXJhbSBuYW1lIGZvcm1hdHRlZCB2YWx1ZVxuICAgICAqIEBwYXJhbSBhcHBlbmQgaWYgdHJ1ZSwgYWRkcyB2YWx1ZSB0byB0aGUgYXJyYXkgaW5zdGVhZCBvZiByZXBsYWNpbmcgaXRcbiAgICAgKi9cbiAgICBzZXRMb29rdXBWYWx1ZShcbiAgICAgIGlkOiBzdHJpbmcsXG4gICAgICBlbnRpdHlUeXBlOiBhbnksXG4gICAgICBuYW1lOiBhbnksXG4gICAgICBhcHBlbmQgPSBmYWxzZVxuICAgICk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFpZCkgdGhyb3cgbmV3IEVycm9yKGBubyBpZCBwYXJhbWV0ZXIgd2FzIHByb3ZpZGVkLmApO1xuICAgICAgICBpZiAoIWVudGl0eVR5cGUpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBlbnRpdHlUeXBlIHBhcmFtZXRlciB3YXMgcHJvdmlkZWQuYCk7XG4gICAgICAgIGlkID0gWHJtRXgubm9ybWFsaXplR3VpZChpZCk7XG4gICAgICAgIGNvbnN0IGxvb2t1cFZhbHVlID0ge1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIGVudGl0eVR5cGUsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5WYWx1ZSA9XG4gICAgICAgICAgYXBwZW5kICYmIHRoaXMuVmFsdWUgPyB0aGlzLlZhbHVlLmNvbmNhdChsb29rdXBWYWx1ZSkgOiBbbG9va3VwVmFsdWVdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYW4gZW50aXR5IHJlY29yZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAoT3B0aW9uYWwpIE9EYXRhIHN5c3RlbSBxdWVyeSBvcHRpb25zLCAkc2VsZWN0IGFuZCAkZXhwYW5kLCB0byByZXRyaWV2ZSB5b3VyIGRhdGEuXG4gICAgICogLSBVc2UgdGhlICRzZWxlY3Qgc3lzdGVtIHF1ZXJ5IG9wdGlvbiB0byBsaW1pdCB0aGUgcHJvcGVydGllcyByZXR1cm5lZCBieSBpbmNsdWRpbmcgYSBjb21tYS1zZXBhcmF0ZWRcbiAgICAgKiAgIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXMuIFRoaXMgaXMgYW4gaW1wb3J0YW50IHBlcmZvcm1hbmNlIGJlc3QgcHJhY3RpY2UuIElmIHByb3BlcnRpZXMgYXJlbuKAmXRcbiAgICAgKiAgIHNwZWNpZmllZCB1c2luZyAkc2VsZWN0LCBhbGwgcHJvcGVydGllcyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIC0gVXNlIHRoZSAkZXhwYW5kIHN5c3RlbSBxdWVyeSBvcHRpb24gdG8gY29udHJvbCB3aGF0IGRhdGEgZnJvbSByZWxhdGVkIGVudGl0aWVzIGlzIHJldHVybmVkLiBJZiB5b3VcbiAgICAgKiAgIGp1c3QgaW5jbHVkZSB0aGUgbmFtZSBvZiB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSwgeW914oCZbGwgcmVjZWl2ZSBhbGwgdGhlIHByb3BlcnRpZXMgZm9yIHJlbGF0ZWRcbiAgICAgKiAgIHJlY29yZHMuIFlvdSBjYW4gbGltaXQgdGhlIHByb3BlcnRpZXMgcmV0dXJuZWQgZm9yIHJlbGF0ZWQgcmVjb3JkcyB1c2luZyB0aGUgJHNlbGVjdCBzeXN0ZW0gcXVlcnlcbiAgICAgKiAgIG9wdGlvbiBpbiBwYXJlbnRoZXNlcyBhZnRlciB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBuYW1lLiBVc2UgdGhpcyBmb3IgYm90aCBzaW5nbGUtdmFsdWVkIGFuZFxuICAgICAqICAgY29sbGVjdGlvbi12YWx1ZWQgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzLlxuICAgICAqIC0gWW91IGNhbiBhbHNvIHNwZWNpZnkgbXVsdGlwbGUgcXVlcnkgb3B0aW9ucyBieSB1c2luZyAmIHRvIHNlcGFyYXRlIHRoZSBxdWVyeSBvcHRpb25zLlxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPm9wdGlvbnMgZXhhbXBsZTo8L2NhcHRpb24+XG4gICAgICogb3B0aW9uczogJHNlbGVjdD1uYW1lJiRleHBhbmQ9cHJpbWFyeWNvbnRhY3RpZCgkc2VsZWN0PWNvbnRhY3RpZCxmdWxsbmFtZSlcbiAgICAgKiBAcmV0dXJucyBPbiBzdWNjZXNzLCByZXR1cm5zIGEgcHJvbWlzZSBjb250YWluaW5nIGEgSlNPTiBvYmplY3Qgd2l0aCB0aGUgcmV0cmlldmVkIGF0dHJpYnV0ZXMgYW5kIHRoZWlyIHZhbHVlcy5cbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9keW5hbWljczM2NS9jdXN0b21lci1lbmdhZ2VtZW50L2RldmVsb3Blci9jbGllbnRhcGkvcmVmZXJlbmNlL3hybS13ZWJhcGkvcmV0cmlldmVyZWNvcmQgRXh0ZXJuYWwgTGluazogcmV0cmlldmVSZWNvcmQgKENsaWVudCBBUEkgcmVmZXJlbmNlKX1cbiAgICAgKi9cbiAgICBhc3luYyByZXRyaWV2ZShvcHRpb25zOiBzdHJpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghdGhpcy5JZCB8fCAhdGhpcy5FbnRpdHlUeXBlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgWHJtLldlYkFwaS5yZXRyaWV2ZVJlY29yZChcbiAgICAgICAgICB0aGlzLkVudGl0eVR5cGUsXG4gICAgICAgICAgdGhpcy5JZCxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBhZGRpdGlvbmFsIGN1c3RvbSBmaWx0ZXIgdG8gdGhlIGxvb2t1cCwgd2l0aCB0aGUgXCJBTkRcIiBmaWx0ZXIgb3BlcmF0b3IuXG4gICAgICogQHBhcmFtIGZpbHRlciBTcGVjaWZpZXMgdGhlIGZpbHRlciwgYXMgYSBzZXJpYWxpemVkIEZldGNoWE1MIFwiZmlsdGVyXCIgbm9kZS5cbiAgICAgKiBAcGFyYW0gZW50aXR5TG9naWNhbE5hbWUgKE9wdGlvbmFsKSBUaGUgbG9naWNhbCBuYW1lIG9mIHRoZSBlbnRpdHkuXG4gICAgICogQHJlbWFya3MgICAgIElmIGVudGl0eUxvZ2ljYWxOYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBmaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBlbnRpdGllc1xuICAgICAqICAgICAgICAgICAgICB2YWxpZCBmb3IgdGhlIExvb2t1cCBjb250cm9sLlxuICAgICAqIEBleGFtcGxlICAgICBFeGFtcGxlIGZpbHRlcjogPGZpbHRlciB0eXBlPVwiYW5kXCI+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZGl0aW9uIGF0dHJpYnV0ZT1cImFkZHJlc3MxX2NpdHlcIiBvcGVyYXRvcj1cImVxXCIgdmFsdWU9XCJSZWRtb25kXCIgLz5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPlxuICAgICAqL1xuICAgIGFkZFByZUZpbHRlclRvTG9va3VwKGZpbHRlclhtbDogc3RyaW5nLCBlbnRpdHlMb2dpY2FsTmFtZT86IHN0cmluZyk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgX2FkZEN1c3RvbUZpbHRlci5jb250cm9scyA9IHRoaXMuY29udHJvbHM7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnRyb2wuYWRkUHJlU2VhcmNoKF9hZGRDdXN0b21GaWx0ZXIpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fY3VzdG9tRmlsdGVycy5wdXNoKF9hZGRDdXN0b21GaWx0ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfYWRkQ3VzdG9tRmlsdGVyKCkge1xuICAgICAgICBfYWRkQ3VzdG9tRmlsdGVyLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICBjb250cm9sLmFkZEN1c3RvbUZpbHRlcihmaWx0ZXJYbWwsIGVudGl0eUxvZ2ljYWxOYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gYWRkaXRpb25hbCBjdXN0b20gZmlsdGVyIHRvIHRoZSBsb29rdXAsIHdpdGggdGhlIFwiQU5EXCIgZmlsdGVyIG9wZXJhdG9yLlxuICAgICAqIEBwYXJhbSBlbnRpdHlMb2dpY2FsTmFtZSAoT3B0aW9uYWwpIFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGVudGl0eS5cbiAgICAgKiBAcGFyYW0gcHJpbWFyeUF0dHJpYnV0ZUlkTmFtZSAoT3B0aW9uYWwpIFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5LlxuICAgICAqIEBwYXJhbSBmZXRjaFhtbCBTcGVjaWZpZXMgdGhlIEZldGNoWE1MIHVzZWQgdG8gZmlsdGVyLlxuICAgICAqIEByZW1hcmtzICAgICBJZiBlbnRpdHlMb2dpY2FsTmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZmlsdGVyIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgZW50aXRpZXNcbiAgICAgKiAgICAgICAgICAgICAgdmFsaWQgZm9yIHRoZSBMb29rdXAgY29udHJvbC5cbiAgICAgKiBAZXhhbXBsZSAgICAgRXhhbXBsZSBmZXRjaFhtbDogPGZldGNoPlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudGl0eSBuYW1lPVwiY29udGFjdFwiPlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXI+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmRpdGlvbiBhdHRyaWJ1dGU9XCJhZGRyZXNzMV9jaXR5XCIgb3BlcmF0b3I9XCJlcVwiIHZhbHVlPVwiUmVkbW9uZFwiIC8+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudGl0eT5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmV0Y2g+XG4gICAgICovXG4gICAgYXN5bmMgYWRkUHJlRmlsdGVyVG9Mb29rdXBBZHZhbmNlZChcbiAgICAgIGVudGl0eUxvZ2ljYWxOYW1lOiBzdHJpbmcsXG4gICAgICBwcmltYXJ5QXR0cmlidXRlSWROYW1lOiBzdHJpbmcsXG4gICAgICBmZXRjaFhtbDogc3RyaW5nXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBYcm0uV2ViQXBpLm9ubGluZS5yZXRyaWV2ZU11bHRpcGxlUmVjb3JkcyhcbiAgICAgICAgICBlbnRpdHlMb2dpY2FsTmFtZSxcbiAgICAgICAgICBcIj9mZXRjaFhtbD1cIiArIGZldGNoWG1sXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSByZXN1bHQuZW50aXRpZXM7XG4gICAgICAgIGxldCBmaWx0ZXJlZEVudGl0aWVzID0gXCJcIjtcbiAgICAgICAgX2FkZEN1c3RvbUZpbHRlci5jb250cm9scyA9IHRoaXMuY29udHJvbHM7XG4gICAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGZpbHRlcmVkRW50aXRpZXMgKz0gYDx2YWx1ZT4ke2l0ZW1bcHJpbWFyeUF0dHJpYnV0ZUlkTmFtZV19PC92YWx1ZT5gO1xuICAgICAgICB9KTtcbiAgICAgICAgZmV0Y2hYbWwgPSBmaWx0ZXJlZEVudGl0aWVzXG4gICAgICAgICAgPyBgPGZpbHRlcj48Y29uZGl0aW9uIGF0dHJpYnV0ZT0nJHtwcmltYXJ5QXR0cmlidXRlSWROYW1lfScgb3BlcmF0b3I9J2luJz4ke2ZpbHRlcmVkRW50aXRpZXN9PC9jb25kaXRpb24+PC9maWx0ZXI+YFxuICAgICAgICAgIDogYDxmaWx0ZXI+PGNvbmRpdGlvbiBhdHRyaWJ1dGU9JyR7cHJpbWFyeUF0dHJpYnV0ZUlkTmFtZX0nIG9wZXJhdG9yPSdudWxsJy8+PC9maWx0ZXI+YDtcbiAgICAgICAgdGhpcy5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgY29udHJvbC5hZGRQcmVTZWFyY2goX2FkZEN1c3RvbUZpbHRlcik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9jdXN0b21GaWx0ZXJzLnB1c2goX2FkZEN1c3RvbUZpbHRlcik7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9hZGRDdXN0b21GaWx0ZXIoKSB7XG4gICAgICAgIF9hZGRDdXN0b21GaWx0ZXIuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnRyb2wuYWRkQ3VzdG9tRmlsdGVyKGZldGNoWG1sLCBlbnRpdHlMb2dpY2FsTmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBmaWx0ZXJzIHNldCBvbiB0aGUgY3VycmVudCBsb29rdXAgYXR0cmlidXRlIGJ5IHVzaW5nIGFkZFByZUZpbHRlclRvTG9va3VwIG9yIGFkZFByZUZpbHRlclRvTG9va3VwQWR2YW5jZWRcbiAgICAgKi9cbiAgICBjbGVhclByZUZpbHRlckZyb21Mb29rdXAoKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9jdXN0b21GaWx0ZXJzLmZvckVhY2goXG4gICAgICAgICAgKGN1c3RvbUZpbHRlcjogWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnRyb2wucmVtb3ZlUHJlU2VhcmNoKGN1c3RvbUZpbHRlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHR5cGUgT3B0aW9uVmFsdWVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IG51bWJlcjtcbiAgfTtcbiAgZXhwb3J0IGNsYXNzIE9wdGlvbnNldEZpZWxkPE9wdGlvbnMgZXh0ZW5kcyBPcHRpb25WYWx1ZXM+XG4gICAgZXh0ZW5kcyBGaWVsZFxuICAgIGltcGxlbWVudHMgWHJtLkF0dHJpYnV0ZXMuT3B0aW9uU2V0QXR0cmlidXRlXG4gIHtcbiAgICBwcm90ZWN0ZWQgZGVjbGFyZSBfYXR0cmlidXRlOiBYcm0uQXR0cmlidXRlcy5PcHRpb25TZXRBdHRyaWJ1dGU7XG4gICAgcHJvdGVjdGVkIF9jb250cm9sITogWHJtLkNvbnRyb2xzLk9wdGlvblNldENvbnRyb2w7XG4gICAgT3B0aW9uOiBPcHRpb25zO1xuICAgIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgb3B0aW9uPzogT3B0aW9ucykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlTmFtZSk7XG4gICAgICB0aGlzLk9wdGlvbiA9IG9wdGlvbjtcbiAgICB9XG4gICAgZ2V0Rm9ybWF0KCk6IFhybS5BdHRyaWJ1dGVzLk9wdGlvblNldEF0dHJpYnV0ZUZvcm1hdCB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0Rm9ybWF0KCkgYXMgWHJtLkF0dHJpYnV0ZXMuT3B0aW9uU2V0QXR0cmlidXRlRm9ybWF0O1xuICAgIH1cbiAgICBnZXRPcHRpb24odmFsdWU6IG51bWJlciB8IHN0cmluZyk6IFhybS5PcHRpb25TZXRWYWx1ZSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRPcHRpb24odmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbih2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGdldE9wdGlvbnMoKTogWHJtLk9wdGlvblNldFZhbHVlW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbnMoKTtcbiAgICB9XG4gICAgZ2V0U2VsZWN0ZWRPcHRpb24oKTogWHJtLk9wdGlvblNldFZhbHVlIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRTZWxlY3RlZE9wdGlvbigpO1xuICAgIH1cbiAgICBnZXRUZXh0KCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VGV4dCgpO1xuICAgIH1cbiAgICBnZXRJbml0aWFsVmFsdWUoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRJbml0aWFsVmFsdWUoKTtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBjb250cm9sKCkge1xuICAgICAgcmV0dXJuICh0aGlzLl9jb250cm9sID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldENvbnRyb2wodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBDb250cm9sICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgVmFsdWUoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBzZXQgVmFsdWUodmFsdWU6IGtleW9mIE9wdGlvbnMgfCBudW1iZXIpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJudW1iZXJcIikgdGhpcy5BdHRyaWJ1dGUuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgZWxzZSB0aGlzLkF0dHJpYnV0ZS5zZXRWYWx1ZSh0aGlzLk9wdGlvblt2YWx1ZV0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIG9wdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZXMgYW4gYXJyYXkgd2l0aCB0aGUgb3B0aW9uIHZhbHVlcyB0byBhZGRcbiAgICAgKiBAcGFyYW0gaW5kZXggKE9wdGlvbmFsKSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBvcHRpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrcyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjaGVjayB0aGF0IHRoZSB2YWx1ZXMgd2l0aGluIHRoZSBvcHRpb25zIHlvdSBhZGQgYXJlIHZhbGlkLlxuICAgICAqICAgICAgICAgIElmIGluZGV4IGlzIG5vdCBwcm92aWRlZCwgdGhlIG5ldyBvcHRpb24gd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuICAgICAqL1xuICAgIGFkZE9wdGlvbih2YWx1ZXM6IG51bWJlcltdLCBpbmRleD86IG51bWJlcik6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2YWx1ZXMgaXMgbm90IGFuIEFycmF5OlxcbnZhbHVlczogJyR7dmFsdWVzfSdgKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uU2V0VmFsdWVzID0gdGhpcy5jb250cm9sLmdldEF0dHJpYnV0ZSgpLmdldE9wdGlvbnMoKSA/PyBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIG9wdGlvblNldFZhbHVlcykge1xuICAgICAgICAgIGlmICh2YWx1ZXMuaW5jbHVkZXMoZWxlbWVudC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5hZGRPcHRpb24oZWxlbWVudCwgaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBvcHRpb24gbWF0Y2hpbmcgdGhlIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZS5cbiAgICAgKi9cbiAgICByZW1vdmVPcHRpb24odmFsdWVzOiBudW1iZXJbXSk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2YWx1ZXMgaXMgbm90IGFuIEFycmF5OlxcbnZhbHVlczogJyR7dmFsdWVzfSdgKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uU2V0VmFsdWVzID0gdGhpcy5jb250cm9sLmdldEF0dHJpYnV0ZSgpLmdldE9wdGlvbnMoKSA/PyBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIG9wdGlvblNldFZhbHVlcykge1xuICAgICAgICAgIGlmICh2YWx1ZXMuaW5jbHVkZXMoZWxlbWVudC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5yZW1vdmVPcHRpb24oZWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgb3B0aW9ucy5cbiAgICAgKi9cbiAgICBjbGVhck9wdGlvbnMoKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNvbnRyb2wuY2xlYXJPcHRpb25zKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGV4cG9ydCBjbGFzcyBTZWN0aW9uIGltcGxlbWVudHMgWHJtLkNvbnRyb2xzLlNlY3Rpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSBOYW1lITogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfc2VjdGlvbj86IFhybS5Db250cm9scy5TZWN0aW9uO1xuICAgIHB1YmxpYyBwYXJlbnRUYWI/OiBYcm0uQ29udHJvbHMuVGFiO1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgICAgdGhpcy5OYW1lID0gbmFtZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBTZWN0aW9uKCk6IFhybS5Db250cm9scy5TZWN0aW9uIHtcbiAgICAgIHJldHVybiAodGhpcy5fc2VjdGlvbiA/Pz1cbiAgICAgICAgdGhpcy5wYXJlbnRUYWIuc2VjdGlvbnMuZ2V0KHRoaXMuTmFtZSkgPz9cbiAgICAgICAgWHJtRXgudGhyb3dFcnJvcihcbiAgICAgICAgICBgVGhlIHNlY3Rpb24gJyR7dGhpcy5OYW1lfScgd2FzIG5vdCBmb3VuZCBvbiB0aGUgZm9ybS5gXG4gICAgICAgICkpO1xuICAgIH1cbiAgICBnZXROYW1lKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5TZWN0aW9uLmdldE5hbWUoKTtcbiAgICB9XG4gICAgZ2V0UGFyZW50KCk6IFhybS5Db250cm9scy5UYWIge1xuICAgICAgcmV0dXJuIHRoaXMuU2VjdGlvbi5nZXRQYXJlbnQoKTtcbiAgICB9XG4gICAgY29udHJvbHM6IFhybS5Db2xsZWN0aW9uLkl0ZW1Db2xsZWN0aW9uPFhybS5Db250cm9scy5Db250cm9sPjtcbiAgICBzZXRWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLlNlY3Rpb24uc2V0VmlzaWJsZSh2aXNpYmxlKTtcbiAgICB9XG4gICAgZ2V0VmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLlNlY3Rpb24uZ2V0VmlzaWJsZSgpO1xuICAgIH1cbiAgICBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuU2VjdGlvbi5nZXRMYWJlbCgpO1xuICAgIH1cbiAgICBzZXRMYWJlbChsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5TZWN0aW9uLnNldExhYmVsKGxhYmVsKTtcbiAgICB9XG4gIH1cbiAgdHlwZSBUYWJTZWN0aW9ucyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBTZWN0aW9uO1xuICB9O1xuICBleHBvcnQgY2xhc3MgVGFiPFNlY3Rpb25zIGV4dGVuZHMgVGFiU2VjdGlvbnM+IGltcGxlbWVudHMgWHJtLkNvbnRyb2xzLlRhYiB7XG4gICAgcHVibGljIHJlYWRvbmx5IE5hbWUhOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF90YWI/OiBYcm0uQ29udHJvbHMuVGFiO1xuICAgIFNlY3Rpb246IFNlY3Rpb25zO1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgc2VjdGlvbj86IFNlY3Rpb25zKSB7XG4gICAgICB0aGlzLk5hbWUgPSBuYW1lO1xuICAgICAgdGhpcy5TZWN0aW9uID0gc2VjdGlvbjtcbiAgICAgIGZvciAobGV0IGtleSBpbiBzZWN0aW9uKSB7XG4gICAgICAgIHNlY3Rpb25ba2V5XS5wYXJlbnRUYWIgPSB0aGlzO1xuICAgICAgfVxuICAgIH1cbiAgICBzZWN0aW9uczogWHJtLkNvbGxlY3Rpb24uSXRlbUNvbGxlY3Rpb248WHJtLkNvbnRyb2xzLlNlY3Rpb24+O1xuXG4gICAgcHVibGljIGdldCBUYWIoKTogWHJtLkNvbnRyb2xzLlRhYiB7XG4gICAgICByZXR1cm4gKHRoaXMuX3RhYiA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC51aS50YWJzLmdldCh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYFRoZSB0YWIgJyR7dGhpcy5OYW1lfScgd2FzIG5vdCBmb3VuZCBvbiB0aGUgZm9ybS5gKSk7XG4gICAgfVxuICAgIGFkZFRhYlN0YXRlQ2hhbmdlKGhhbmRsZXI6IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXIpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLlRhYi5hZGRUYWJTdGF0ZUNoYW5nZShoYW5kbGVyKTtcbiAgICB9XG4gICAgZ2V0RGlzcGxheVN0YXRlKCk6IFhybS5EaXNwbGF5U3RhdGUge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLmdldERpc3BsYXlTdGF0ZSgpO1xuICAgIH1cbiAgICBnZXROYW1lKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5UYWIuZ2V0TmFtZSgpO1xuICAgIH1cbiAgICBnZXRQYXJlbnQoKTogWHJtLlVpIHtcbiAgICAgIHJldHVybiB0aGlzLlRhYi5nZXRQYXJlbnQoKTtcbiAgICB9XG4gICAgcmVtb3ZlVGFiU3RhdGVDaGFuZ2UoaGFuZGxlcjogWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlcik6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLnJlbW92ZVRhYlN0YXRlQ2hhbmdlKGhhbmRsZXIpO1xuICAgIH1cbiAgICBzZXREaXNwbGF5U3RhdGUoZGlzcGxheVN0YXRlOiBYcm0uRGlzcGxheVN0YXRlKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5UYWIuc2V0RGlzcGxheVN0YXRlKGRpc3BsYXlTdGF0ZSk7XG4gICAgfVxuICAgIHNldFZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLnNldFZpc2libGUodmlzaWJsZSk7XG4gICAgfVxuICAgIGdldFZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5UYWIuZ2V0VmlzaWJsZSgpO1xuICAgIH1cbiAgICBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLmdldExhYmVsKCk7XG4gICAgfVxuICAgIHNldExhYmVsKGxhYmVsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLlRhYi5zZXRMYWJlbChsYWJlbCk7XG4gICAgfVxuICAgIHNldEZvY3VzKCk6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLnNldEZvY3VzKCk7XG4gICAgfVxuICB9XG4gIGV4cG9ydCBjbGFzcyBHcmlkQ29udHJvbCBpbXBsZW1lbnRzIFhybS5Db250cm9scy5HcmlkQ29udHJvbCB7XG4gICAgcHVibGljIHJlYWRvbmx5IE5hbWUhOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9ncmlkQ29udHJvbD86IFhybS5Db250cm9scy5HcmlkQ29udHJvbDtcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuTmFtZSA9IG5hbWU7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgR3JpZENvbnRyb2woKTogWHJtLkNvbnRyb2xzLkdyaWRDb250cm9sIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgICh0aGlzLl9ncmlkQ29udHJvbCA/Pz1cbiAgICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldENvbnRyb2w8WHJtLkNvbnRyb2xzLkdyaWRDb250cm9sPih0aGlzLk5hbWUpKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBUaGUgZ3JpZCAnJHt0aGlzLk5hbWV9JyB3YXMgbm90IGZvdW5kIG9uIHRoZSBmb3JtLmApXG4gICAgICApO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IEdyaWQoKTogWHJtLkNvbnRyb2xzLkdyaWQge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0R3JpZCgpO1xuICAgIH1cbiAgICBhZGRPbkxvYWQoaGFuZGxlcjogWHJtLkV2ZW50cy5HcmlkQ29udHJvbC5Mb2FkRXZlbnRIYW5kbGVyKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5HcmlkQ29udHJvbC5hZGRPbkxvYWQoaGFuZGxlcik7XG4gICAgfVxuICAgIGdldENvbnRleHRUeXBlKCk6IFhybUVudW0uR3JpZENvbnRyb2xDb250ZXh0IHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldENvbnRleHRUeXBlKCk7XG4gICAgfVxuICAgIGdldEVudGl0eU5hbWUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldEVudGl0eU5hbWUoKTtcbiAgICB9XG4gICAgZ2V0RmV0Y2hYbWwoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldEZldGNoWG1sKCk7XG4gICAgfVxuICAgIGdldEdyaWQoKTogWHJtLkNvbnRyb2xzLkdyaWQge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0R3JpZCgpO1xuICAgIH1cbiAgICBnZXRSZWxhdGlvbnNoaXAoKTogWHJtLkNvbnRyb2xzLkdyaWRSZWxhdGlvbnNoaXAge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0UmVsYXRpb25zaGlwKCk7XG4gICAgfVxuICAgIGdldFVybChjbGllbnQ/OiBYcm1FbnVtLkdyaWRDbGllbnQpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0VXJsKGNsaWVudCk7XG4gICAgfVxuICAgIGdldFZpZXdTZWxlY3RvcigpOiBYcm0uQ29udHJvbHMuVmlld1NlbGVjdG9yIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldFZpZXdTZWxlY3RvcigpO1xuICAgIH1cbiAgICBvcGVuUmVsYXRlZEdyaWQoKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5HcmlkQ29udHJvbC5vcGVuUmVsYXRlZEdyaWQoKTtcbiAgICB9XG4gICAgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnJlZnJlc2goKTtcbiAgICB9XG4gICAgcmVmcmVzaFJpYmJvbigpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnJlZnJlc2hSaWJib24oKTtcbiAgICB9XG4gICAgcmVtb3ZlT25Mb2FkKGhhbmRsZXI6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnJlbW92ZU9uTG9hZChoYW5kbGVyKTtcbiAgICB9XG4gICAgZ2V0Q29udHJvbFR5cGUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldENvbnRyb2xUeXBlKCk7XG4gICAgfVxuICAgIGdldE5hbWUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldE5hbWUoKTtcbiAgICB9XG4gICAgZ2V0UGFyZW50KCk6IFhybS5Db250cm9scy5TZWN0aW9uIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldFBhcmVudCgpO1xuICAgIH1cbiAgICBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0TGFiZWwoKTtcbiAgICB9XG4gICAgc2V0TGFiZWwobGFiZWw6IHN0cmluZyk6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuc2V0TGFiZWwobGFiZWwpO1xuICAgIH1cbiAgICBnZXRWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0VmlzaWJsZSgpO1xuICAgIH1cbiAgICBzZXRWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnNldFZpc2libGUodmlzaWJsZSk7XG4gICAgfVxuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/build/package.json b/build/package.json index 173045d..e151fd7 100644 --- a/build/package.json +++ b/build/package.json @@ -33,65 +33,9 @@ "access": "public" }, "scripts": { - "build": "npm run clean && npm run type:dts && npm run build:main && npm run format && npm run docs && npm run copy && npm run postbuild && npm run zip", - "build:main": "tsc --build", - "clean": "rimraf build/dist coverage nyc_output", - "docs": "npx typedoc --plugin typedoc-plugin-markdown --out docs src/XrmEx.ts", - "copy": "npm run copyPackage && npm run copyReadme && npm run copyEslint", - "copyPackage": "node -e \"require('fs').cpSync('./package.json', './build/package.json');\"", - "copyReadme": "node -e \"require('fs').cpSync('./README.md', './build/README.md');\"", - "copyEslint": "node -e \"require('fs').cpSync('./.eslintrc.cjs', './build/.eslintrc.cjs');\"", - "postbuild": "rimraf build/dist/tests", - "zip": "npm-build-zip --destination=release/ --name=xrm-ex --name_only=true", - "type:dts": "tsc --emitDeclarationOnly --project tsconfig.build.json", - "type:check": "tsc --noEmit", - "format": "prettier \"src/**/*.ts\" --write", - "format:check": "prettier \"src/**/*.ts\" --check", - "lint": "eslint src --ext .ts --fix", - "lint:check": "eslint src --ext .ts", - "test": "vitest run", - "test:watch": "vitest watch", - "test:coverage": "vitest run --coverage", - "spell:check": "cspell \"{README.md,CODE_OF_CONDUCT.md,CONTRIBUTING.md,.github/*.md,src/**/*.ts}\"", - "cz": "cz", - "semantic-release": "semantic-release" + "build": "tsc --build" }, "devDependencies": { - "@aashutoshrathi/word-wrap": "^1.2.6", - "@playwright/test": "^1.37.0", - "@semantic-release/changelog": "^6.0.3", - "@semantic-release/commit-analyzer": "^10.0.1", - "@semantic-release/github": "^9.0.3", - "@semantic-release/npm": "^10.0.4", - "@semantic-release/release-notes-generator": "^11.0.3", - "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.66", - "@types/node": "^18.16.3", - "@types/prompts": "^2.4.4", - "@types/xrm": "^9.0.73", - "@typescript-eslint/eslint-plugin": "^5.60.1", - "@typescript-eslint/parser": "^5.60.0", - "c8": "^8.0.0", - "cspell": "^6.31.1", - "eslint": "^8.43.0", - "eslint-config-prettier": "^8.8.0", - "eslint-import-resolver-typescript": "^3.5.5", - "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-simple-import-sort": "^10.0.0", - "nyc": "^15.1.0", - "prettier": "^2.8.8", - "rimraf": "^5.0.1", - "semantic-release": "^21.0.5", - "source-map-support": "^0.5.21", - "typedoc": "^0.24.8", - "typedoc-plugin-markdown": "^3.15.3", - "typescript": "^5.1.3", - "vitest": "^0.32.2", - "npm-build-zip": "^1.0.4" - }, - "overrides": { - "semver": "~7.5.3", - "word-wrap": "npm:@aashutoshrathi/word-wrap" + "@types/xrm": "^9.0.73" } } \ No newline at end of file diff --git a/build/dist/src/XrmEx.d.ts b/build/src/XrmEx.d.ts similarity index 100% rename from build/dist/src/XrmEx.d.ts rename to build/src/XrmEx.d.ts diff --git a/build/src/XrmEx.js b/build/src/XrmEx.js new file mode 100644 index 0000000..1e16590 --- /dev/null +++ b/build/src/XrmEx.js @@ -0,0 +1,1327 @@ +/// +var XrmEx; +(function (XrmEx) { + /** + * Throws an error with the given error message. + * @param {string} errorMessage - The error message to throw. + * @throws {Error} - Always throws an error with the given error message. + */ + function throwError(errorMessage) { + throw new Error(errorMessage); + } + XrmEx.throwError = throwError; + /** + * Returns the name of the calling function. + * @returns {string} - The name of the calling function. + */ + function getMethodName() { + try { + const error = new Error(); + const stackTrace = error.stack?.split("\n").map((line) => line.trim()); + const callingFunctionLine = stackTrace && stackTrace.length >= 3 ? stackTrace[2] : undefined; + const functionNameMatch = callingFunctionLine?.match(/at\s+([^\s]+)\s+\(/); + const functionName = functionNameMatch ? functionNameMatch[1] : ""; + return functionName; + } + catch (error) { + throw new Error(`XrmEx.getMethodName:\n${error.message}`); + } + } + XrmEx.getMethodName = getMethodName; + /** + * Displays a notification for an app with the given message and level, and lets you specify whether to show a close button. + * @param {string} message - The message to display in the notification. + * @param {'SUCCESS' | 'ERROR' | 'WARNING' | 'INFO'} level - The level of the notification. Can be 'SUCCESS', 'ERROR', 'WARNING', or 'INFO'. + * @param {boolean} [showCloseButton=false] - Whether to show a close button on the notification. Defaults to false. + * @returns {Promise} - A promise that resolves with the ID of the created notification. + */ + async function addGlobalNotification(message, level, showCloseButton = false) { + const levelMap = { + SUCCESS: 1, + ERROR: 2, + WARNING: 3, + INFO: 4, + }; + const messageLevel = levelMap[level] || levelMap.INFO; + const notification = { + type: 2, + level: messageLevel, + message, + showCloseButton, + }; + try { + return await Xrm.App.addGlobalNotification(notification); + } + catch (error) { + throw new Error(`XrmEx.${getMethodName()}:\n${error.message}`); + } + } + XrmEx.addGlobalNotification = addGlobalNotification; + /** + * Clears a notification in the app with the given unique ID. + * @param {string} uniqueId - The unique ID of the notification to clear. + * @returns {Promise} - A promise that resolves when the notification has been cleared. + */ + async function removeGlobalNotification(uniqueId) { + try { + return await Xrm.App.clearGlobalNotification(uniqueId); + } + catch (error) { + throw new Error(`XrmEx.${getMethodName()}:\n${error.message}`); + } + } + XrmEx.removeGlobalNotification = removeGlobalNotification; + /** + * Retrieves the value of an environment variable by using its schema name as key. + * @param {string} environmentVariableSchemaName - The schema name of the environment variable to retrieve. + * @returns {Promise} - A promise that resolves with the value of the environment variable. + */ + async function getEnvironmentVariableValue(environmentVariableSchemaName) { + return executeFunction("RetrieveEnvironmentVariableValue", [ + { + Name: "DefinitionSchemaName", + Type: "String", + Value: environmentVariableSchemaName, + }, + ]); + } + XrmEx.getEnvironmentVariableValue = getEnvironmentVariableValue; + /** + * A map of CRM data types to their corresponding type names, structural properties, and JavaScript types. + * @type {Object.} + */ + let typeMap = { + String: { typeName: "Edm.String", structuralProperty: 1, jsType: "string" }, + Integer: { typeName: "Edm.Int32", structuralProperty: 1, jsType: "number" }, + Boolean: { + typeName: "Edm.Boolean", + structuralProperty: 1, + jsType: "boolean", + }, + DateTime: { + typeName: "Edm.DateTimeOffset", + structuralProperty: 1, + jsType: "object", + }, + EntityReference: { + typeName: "mscrm.crmbaseentity", + structuralProperty: 5, + jsType: "object", + }, + Decimal: { + typeName: "Edm.Decimal", + structuralProperty: 1, + jsType: "number", + }, + Entity: { + typeName: "mscrm.crmbaseentity", + structuralProperty: 5, + jsType: "object", + }, + EntityCollection: { + typeName: "Collection(mscrm.crmbaseentity)", + structuralProperty: 4, + jsType: "object", + }, + Float: { typeName: "Edm.Double", structuralProperty: 1, jsType: "number" }, + Money: { typeName: "Edm.Decimal", structuralProperty: 1, jsType: "number" }, + Picklist: { + typeName: "Edm.Int32", + structuralProperty: 1, + jsType: "number", + }, + }; + /** + * Checks if the given request parameter is of a supported type and has a valid value. + * @param {RequestParameter} requestParameter - The request parameter to check. + * @returns {void} + * @throws {Error} - Throws an error if the request parameter is not of a supported type or has an invalid value. + */ + function checkRequestParameterType(requestParameter) { + if (!typeMap[requestParameter.Type]) + throw new Error(`The property type ${requestParameter.Type} of the property ${requestParameter.Name} is not supported.`); + const expectedType = typeMap[requestParameter.Type].jsType; + const actualType = typeof requestParameter.Value; + const invalidTypeMessage = `The value ${requestParameter.Value}\nof the property ${requestParameter.Name}\nis not of the expected type ${requestParameter.Type}.`; + if (requestParameter.Type === "EntityReference" || + requestParameter.Type === "Entity") { + if (!requestParameter.Value || + !requestParameter.Value.hasOwnProperty("id") || + !requestParameter.Value.hasOwnProperty("entityType")) { + throw new Error(invalidTypeMessage); + } + typeMap[requestParameter.Type].typeName = `mscrm.${requestParameter.Value.entityType}`; + } + else if (requestParameter.Type === "EntityCollection") { + if (!Array.isArray(requestParameter.Value) || + requestParameter.Value.every((v) => typeof v !== "object" || + !v || + !v.hasOwnProperty("id") || + !v.hasOwnProperty("entityType"))) { + throw new Error(invalidTypeMessage); + } + } + else if (requestParameter.Type === "DateTime") { + if (!(requestParameter.Value instanceof Date)) { + throw new Error(invalidTypeMessage); + } + } + else { + if (actualType !== expectedType) { + throw new Error(invalidTypeMessage); + } + } + } + XrmEx.checkRequestParameterType = checkRequestParameterType; + /** + * Executes an Action. + * @param {string} actionName - The unique name of the action. + * @param {RequestParameter[]} requestParameters - An array of objects with the parameter name, type and value. + * @param {EntityReference} [boundEntity] - An optional EntityReference of the bound entity. + * @returns {Promise} - A Promise with the request response. + * @throws {Error} - Throws an error if the request parameter is not of a supported type or has an invalid value. + */ + async function executeAction(actionName, requestParameters, boundEntity) { + const parameterDefinition = {}; + if (boundEntity) + requestParameters.push({ + Name: "entity", + Value: boundEntity, + Type: "EntityReference", + }); + for (const requestParameter of requestParameters) { + checkRequestParameterType(requestParameter); + parameterDefinition[requestParameter.Name] = { + typeName: typeMap[requestParameter.Type].typeName, + structuralProperty: typeMap[requestParameter.Type].structuralProperty, + }; + } + const req = Object.assign({ + getMetadata: () => ({ + boundParameter: boundEntity ? "entity" : null, + operationType: 0, + operationName: actionName, + parameterTypes: parameterDefinition, + }), + }, ...requestParameters.map((p) => ({ [p.Name]: p.Value }))); + const response = await Xrm.WebApi.online.execute(req); + if (response.ok) + return response.json().catch(() => response); + } + XrmEx.executeAction = executeAction; + /** + * Executes a Function. + * @param {string} functionName - The unique name of the function. + * @param {RequestParameter[]} requestParameters - An array of objects with the parameter name, type and value. + * @param {EntityReference} [boundEntity] - An optional EntityReference of the bound entity. + * @returns {Promise} - A Promise with the request response. + * @throws {Error} - Throws an error if the request parameter is not of a supported type or has an invalid value. + */ + async function executeFunction(functionName, requestParameters, boundEntity) { + const parameterDefinition = {}; + if (boundEntity) + requestParameters.push({ + Name: "entity", + Value: boundEntity, + Type: "EntityReference", + }); + for (const requestParameter of requestParameters) { + checkRequestParameterType(requestParameter); + parameterDefinition[requestParameter.Name] = { + typeName: typeMap[requestParameter.Type].typeName, + structuralProperty: typeMap[requestParameter.Type].structuralProperty, + }; + } + const req = Object.assign({ + getMetadata: () => ({ + boundParameter: boundEntity ? "entity" : null, + operationType: 1, + operationName: functionName, + parameterTypes: parameterDefinition, + }), + }, ...requestParameters.map((p) => ({ [p.Name]: p.Value }))); + const response = await Xrm.WebApi.online.execute(req); + if (response.ok) + return response.json().catch(() => response); + } + XrmEx.executeFunction = executeFunction; + /** + * Makes a GUID lowercase and removes brackets. + * @param {string} guid - The GUID to normalize. + * @returns {string} - The normalized GUID. + */ + function normalizeGuid(guid) { + if (typeof guid !== "string") + throw new Error(`XrmEx.normalizeGuid:\n'${guid}' is not a string`); + return guid.toLowerCase().replace(/[{}]/g, ""); + } + XrmEx.normalizeGuid = normalizeGuid; + /** + * Opens a dialog with dynamic height and width based on text content. + * @param {string} title - The title of the dialog. + * @param {string} text - The text content of the dialog. + * @returns {Promise} - A Promise with the dialog response. + */ + async function openAlertDialog(title, text) { + try { + const rows = text.split(/\r\n|\r|\n/); + let additionalRows = 0; + rows.forEach((row) => { + let width = getTextWidth(row, "1rem Segoe UI Regular, SegoeUI, Segoe UI"); + if (width > 940) { + additionalRows += width / 940; + } + }); + const longestRow = rows.reduce((acc, row) => (row.length > acc.length ? row : acc), ""); + const width = Math.min(getTextWidth(longestRow, "1rem Segoe UI Regular, SegoeUI, Segoe UI"), 1000); + const height = 109 + (rows.length + additionalRows) * 20; + return await Xrm.Navigation.openAlertDialog({ + confirmButtonLabel: "Ok", + text, + title, + }, { + height, + width, + }); + } + catch (error) { + console.error(error.message); + throw new Error(`XrmEx.${getMethodName()}:\n${error.message}`); + } + /** + * Uses canvas.measureText to compute and return the width of the given text of given font in pixels. + * + * @param {String} text The text to be rendered. + * @param {String} font The css font descriptor that text is to be rendered with (e.g. "bold 14px verdana"). + * + * @see https://stackoverflow.com/questions/118241/calculate-text-width-with-javascript/21015393#21015393 + */ + function getTextWidth(text, font) { + const canvas = document.createElement("canvas"); + const context = canvas.getContext("2d"); + context.font = font; + const metrics = context.measureText(text); + return metrics.width; + } + } + XrmEx.openAlertDialog = openAlertDialog; + /** + * Represents a form in Dynamics 365. + */ + class Form { + static _formContext; + static _executionContext; + constructor() { } + /**Gets a reference to the current form context*/ + static get formContext() { + return this._formContext; + } + /**Gets a reference to the current executio context*/ + static get executionContext() { + return this._executionContext; + } + /**Gets a lookup value that references the record.*/ + static get entityReference() { + return Form.formContext.data.entity.getEntityReference(); + } + /**Sets a reference to the current form context*/ + static set formContext(context) { + if ("getFormContext" in context) { + this._executionContext = context; + this._formContext = context.getFormContext(); + } + else if ("data" in context) + this._formContext = context; + else + throw new Error(`XrmEx.Form.setFormContext: The executionContext or formContext was not passed to the function.`); + } + /**Sets a reference to the current execution context*/ + static set executionContext(context) { + if ("getFormContext" in context) { + this._executionContext = context; + this._formContext = context.getFormContext(); + } + else if ("data" in context) + this._formContext = context; + else + throw new Error(`XrmEx.Form.setExecutionContext: The executionContext or formContext was not passed to the function.`); + } + /**Returns true if form is from type create*/ + static get IsCreate() { + return Form.formContext.ui.getFormType() == 1; + } + /**Returns true if form is from type update*/ + static get IsUpdate() { + return Form.formContext.ui.getFormType() == 2; + } + /**Returns true if form is not from type create*/ + static get IsNotCreate() { + return Form.formContext.ui.getFormType() != 1; + } + /**Returns true if form is not from type update*/ + static get IsNotUpdate() { + return Form.formContext.ui.getFormType() != 2; + } + /** + * Displays a form level notification. Any number of notifications can be displayed and will remain until removed using clearFormNotification. + * The height of the notification area is limited so each new message will be added to the top. + * @param message The text of the notification message. + * @param level The level of the notification which defines how the message will be displayed, such as the icon. + * ERROR: Notification will use the system error icon. + * WARNING: Notification will use the system warning icon. + * INFO: Notification will use the system info icon. + * @param uniqueId Unique identifier for the notification which is used with clearFormNotification to remove the notification. + * @returns true if it succeeds, otherwise false. + */ + static addFormNotification(message, level, uniqueId) { + try { + return Form.formContext.ui.setFormNotification(message, level, uniqueId); + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Clears the form notification described by uniqueId. + * @param uniqueId Unique identifier. + * @returns True if it succeeds, otherwise false. + */ + static removeFormNotification(uniqueId) { + try { + return Form.formContext.ui.clearFormNotification(uniqueId); + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Adds a handler to be called when the record is saved. + */ + static addOnSaveEventHandler(handlers) { + try { + if (!Array.isArray(handlers)) { + handlers = [handlers]; + } + handlers.forEach((handler) => { + if (typeof handler !== "function") { + throw new Error(`'${handler}' is not a function`); + } + Form.formContext.data.entity.addOnSave(handler); + }); + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Adds a function to be called after the OnSave is complete. + * @param handler The handler. + * @remarks Added in 9.2 + * @see {@link https://docs.microsoft.com/en-us/powerapps/developer/model-driven-apps/clientapi/reference/events/postsave External Link: PostSave Event Documentation} + */ + static addOnPostSaveEventHandler(handlers) { + try { + if (!Array.isArray(handlers)) { + handlers = [handlers]; + } + handlers.forEach((handler) => { + if (typeof handler !== "function") { + throw new Error(`'${handler}' is not a function`); + } + Form.formContext.data.entity.addOnPostSave(handler); + }); + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Adds a function to be called when form data is loaded. + * @param handler The function to be executed when the form data loads. The function will be added to the bottom of the event handler pipeline. + */ + static addOnLoadEventHandler(handlers) { + try { + if (!Array.isArray(handlers)) { + handlers = [handlers]; + } + handlers.forEach((handler) => { + if (typeof handler !== "function") { + throw new Error(`'${handler}' is not a function`); + } + Form.formContext.data.addOnLoad(handler); + }); + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Adds a handler to be called when the attribute's value is changed. + * @param handler The function reference. + */ + static addOnChangeEventHandler(fields, handlers, execute) { + try { + if (!Array.isArray(handlers)) { + handlers = [handlers]; + } + handlers.forEach((handler) => { + if (typeof handler !== "function") { + throw new Error(`'${handler}' is not a function`); + } + fields.forEach((field) => { + field.addOnChange(handler); + }); + }); + if (execute) { + fields.forEach((field) => { + field.Attribute.fireOnChange(); + }); + } + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + } + XrmEx.Form = Form; + /** + * Used to execute methods related to a single Attribute + */ + class Field { + static allFields = []; + Name; + _attribute; + constructor(attributeName) { + const existingField = Field.allFields.find((f) => f.Name === attributeName); + if (existingField) { + return existingField; + } + this.Name = attributeName; + Field.allFields.push(this); + } + setValue(value) { + return this.Attribute.setValue(value); + } + getAttributeType() { + return this.Attribute.getAttributeType(); + } + getFormat() { + return this.Attribute.getFormat(); + } + getIsDirty() { + return this.Attribute.getIsDirty(); + } + getName() { + return this.Attribute.getName(); + } + getParent() { + return this.Attribute.getParent(); + } + getRequiredLevel() { + return this.Attribute.getRequiredLevel(); + } + getSubmitMode() { + return this.Attribute.getSubmitMode(); + } + getUserPrivilege() { + return this.Attribute.getUserPrivilege(); + } + removeOnChange(handler) { + return this.Attribute.removeOnChange(handler); + } + setSubmitMode(submitMode) { + return this.Attribute.setSubmitMode(submitMode); + } + getValue() { + return this.Attribute.getValue(); + } + setIsValid(isValid, message) { + return this.Attribute.setIsValid(isValid, message); + } + get Attribute() { + return (this._attribute ??= + Form.formContext.getAttribute(this.Name) ?? + XrmEx.throwError(`The attribute '${this.Name}' was not found on the form.`)); + } + get controls() { + return this.Attribute.controls; + } + /** + * Gets the value. + * @returns The value. + */ + get Value() { + return this.Attribute.getValue(); + } + set Value(value) { + this.Attribute.setValue(value); + } + /** + * Sets a control-local notification message. + * @param message The message. + * @param uniqueId Unique identifier. + * @returns true if it succeeds, false if it fails. + * @remarks When this method is used on Microsoft Dynamics CRM for tablets a red "X" icon + * appears next to the control. Tapping on the icon will display the message. + */ + setNotification(message, uniqueId) { + try { + if (!message) + throw new Error(`no message was provided.`); + if (!uniqueId) + throw new Error(`no uniqueId was provided.`); + this.controls.forEach((control) => control.setNotification(message, uniqueId)); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Sets the visibility state. + * @param visible true to show, false to hide. + */ + setVisible(visible) { + try { + this.controls.forEach((control) => control.setVisible(visible)); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Sets the state of the control to either enabled, or disabled. + * @param disabled true to disable, false to enable. + */ + setDisabled(disabled) { + try { + this.controls.forEach((control) => control.setDisabled(disabled)); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Sets the required level. + * @param requirementLevel The requirement level, as either "none", "required", or "recommended" + */ + setRequiredLevel(requirementLevel) { + try { + this.Attribute.setRequiredLevel(requirementLevel); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Sets the required level. + * @param required The requirement level, as either false for "none" or true for "required" + */ + setRequired(required) { + try { + this.Attribute.setRequiredLevel(required ? "required" : "none"); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /**Fire all "on change" event handlers. */ + fireOnChange() { + try { + this.Attribute.fireOnChange(); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Adds a handler or an array of handlers to be called when the attribute's value is changed. + * @param handlers The function reference or an array of function references. + */ + addOnChange(handlers) { + try { + if (Array.isArray(handlers)) { + for (const handler of handlers) { + if (typeof handler !== "function") + throw new Error(`'${handler}' is not a function`); + this.Attribute.removeOnChange(handler); + this.Attribute.addOnChange(handler); + } + } + else { + if (typeof handlers !== "function") + throw new Error(`'${handlers}' is not a function`); + this.Attribute.removeOnChange(handlers); + this.Attribute.addOnChange(handlers); + } + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Displays an error or recommendation notification for a control, and lets you specify actions to execute based on the notification. + */ + addNotification(message, notificationLevel, uniqueId, actions) { + try { + if (!uniqueId) + throw new Error(`no uniqueId was provided.`); + if (actions && !Array.isArray(actions)) + throw new Error(`the action parameter is not an array of ControlNotificationAction`); + this.controls.forEach((control) => { + control.addNotification({ + messages: [message], + notificationLevel: notificationLevel, + uniqueId: uniqueId, + actions: actions, + }); + }); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Clears the notification identified by uniqueId. + * @param uniqueId (Optional) Unique identifier. + * @returns true if it succeeds, false if it fails. + * @remarks If the uniqueId parameter is not used, the current notification shown will be removed. + */ + removeNotification(uniqueId) { + try { + this.controls.forEach((control) => { + control.clearNotification(uniqueId); + }); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + } + XrmEx.Field = Field; + class TextField extends Field { + constructor(attribute) { + super(attribute); + } + getMaxLength() { + return this.Attribute.getMaxLength(); + } + getFormat() { + return this.Attribute.getFormat(); + } + get Attribute() { + return (this._attribute ??= + Form.formContext.getAttribute(this.Name) ?? + XrmEx.throwError(`Field '${this.Name}' does not exist`)); + } + get controls() { + return this.Attribute.controls; + } + get Value() { + return this.Attribute.getValue() ?? null; + } + set Value(value) { + this.Attribute.setValue(value); + } + } + XrmEx.TextField = TextField; + class NumberField extends Field { + constructor(attribute) { + super(attribute); + } + getFormat() { + return this.Attribute.getFormat(); + } + getMax() { + return this.Attribute.getMax(); + } + getMin() { + return this.Attribute.getMin(); + } + getPrecision() { + return this.Attribute.getPrecision(); + } + setPrecision(precision) { + return this.Attribute.setPrecision(precision); + } + get Attribute() { + return (this._attribute ??= + Form.formContext.getAttribute(this.Name) ?? + XrmEx.throwError(`Field '${this.Name}' does not exist`)); + } + get controls() { + return this.Attribute.controls; + } + get Value() { + return this.Attribute.getValue() ?? null; + } + set Value(value) { + this.Attribute.setValue(value); + } + } + XrmEx.NumberField = NumberField; + class DateField extends Field { + constructor(attribute) { + super(attribute); + } + getFormat() { + return this.Attribute.getFormat(); + } + get Attribute() { + return (this._attribute ??= + Form.formContext.getAttribute(this.Name) ?? + XrmEx.throwError(`Field '${this.Name}' does not exist`)); + } + get controls() { + return this.Attribute.controls; + } + get Value() { + return this.Attribute.getValue() ?? null; + } + set Value(value) { + this.Attribute.setValue(value); + } + } + XrmEx.DateField = DateField; + class BooleanField extends Field { + constructor(attribute) { + super(attribute); + } + getAttributeType() { + return this.Attribute.getAttributeType(); + } + getInitialValue() { + return this.Attribute.getInitialValue(); + } + get Attribute() { + return (this._attribute ??= + Form.formContext.getAttribute(this.Name) ?? + XrmEx.throwError(`Field '${this.Name}' does not exist`)); + } + get controls() { + return this.Attribute.controls; + } + get Value() { + return this.Attribute.getValue() ?? null; + } + set Value(value) { + this.Attribute.setValue(value); + } + } + XrmEx.BooleanField = BooleanField; + class MultiSelectOptionSetField extends Field { + Option; + constructor(attributeName, option) { + super(attributeName); + this.Option = option; + } + getFormat() { + return this.Attribute.getFormat(); + } + getOption(value) { + if (typeof value === "number") { + return this.Attribute.getOption(value); + } + else { + return this.Attribute.getOption(value); + } + } + getOptions() { + return this.Attribute.getOptions(); + } + getSelectedOption() { + return this.Attribute.getSelectedOption(); + } + getText() { + return this.Attribute.getText(); + } + getInitialValue() { + return this.Attribute.getInitialValue(); + } + get Attribute() { + return (this._attribute ??= + Form.formContext.getAttribute(this.Name) ?? + XrmEx.throwError(`Field '${this.Name}' does not exist`)); + } + get controls() { + return this.Attribute.controls; + } + get Value() { + return this.Attribute.getValue(); + } + set Value(value) { + if (Array.isArray(value)) { + let values = []; + value.forEach((v) => { + if (typeof v == "number") + values.push(v); + else + values.push(this.Option[v]); + }); + this.Attribute.setValue(values); + } + else + XrmEx.throwError(`Field Value '${value}' is not an Array`); + } + } + XrmEx.MultiSelectOptionSetField = MultiSelectOptionSetField; + class LookupField extends Field { + _customFilters = []; + constructor(attribute) { + super(attribute); + } + getIsPartyList() { + return this.Attribute.getIsPartyList(); + } + get Attribute() { + return (this._attribute ??= + Form.formContext.getAttribute(this.Name) ?? + XrmEx.throwError(`Field '${this.Name}' does not exist`)); + } + get controls() { + return this.Attribute.controls; + } + /**Gets the id of the first lookup value*/ + get Id() { + return this.Value && this.Value.length > 0 + ? XrmEx.normalizeGuid(this.Value[0].id) + : null; + } + /**Gets the entityType of the first lookup value*/ + get EntityType() { + return this.Value && this.Value.length > 0 + ? this.Value[0].entityType + : null; + } + /**Gets the formatted value of the first lookup value*/ + get FormattedValue() { + return this.Value && this.Value.length > 0 ? this.Value[0].name : null; + } + get Value() { + return this.Attribute.getValue() ?? null; + } + set Value(value) { + this.Attribute.setValue(value); + } + /** + * Sets the value of a lookup + * @param id Guid of the record + * @param entityType logicalname of the entity + * @param name formatted value + * @param append if true, adds value to the array instead of replacing it + */ + setLookupValue(id, entityType, name, append = false) { + try { + if (!id) + throw new Error(`no id parameter was provided.`); + if (!entityType) + throw new Error(`no entityType parameter was provided.`); + id = XrmEx.normalizeGuid(id); + const lookupValue = { + id, + entityType, + name, + }; + this.Value = + append && this.Value ? this.Value.concat(lookupValue) : [lookupValue]; + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Retrieves an entity record. + * @param options (Optional) OData system query options, $select and $expand, to retrieve your data. + * - Use the $select system query option to limit the properties returned by including a comma-separated + * list of property names. This is an important performance best practice. If properties aren’t + * specified using $select, all properties will be returned. + * - Use the $expand system query option to control what data from related entities is returned. If you + * just include the name of the navigation property, you’ll receive all the properties for related + * records. You can limit the properties returned for related records using the $select system query + * option in parentheses after the navigation property name. Use this for both single-valued and + * collection-valued navigation properties. + * - You can also specify multiple query options by using & to separate the query options. + * @example options example: + * options: $select=name&$expand=primarycontactid($select=contactid,fullname) + * @returns On success, returns a promise containing a JSON object with the retrieved attributes and their values. + * @see {@link https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/clientapi/reference/xrm-webapi/retrieverecord External Link: retrieveRecord (Client API reference)} + */ + async retrieve(options) { + try { + if (!this.Id || !this.EntityType) + return null; + const record = await Xrm.WebApi.retrieveRecord(this.EntityType, this.Id, options); + return record; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Adds an additional custom filter to the lookup, with the "AND" filter operator. + * @param filter Specifies the filter, as a serialized FetchXML "filter" node. + * @param entityLogicalName (Optional) The logical name of the entity. + * @remarks If entityLogicalName is not specified, the filter will be applied to all entities + * valid for the Lookup control. + * @example Example filter: + * + * + */ + addPreFilterToLookup(filterXml, entityLogicalName) { + try { + _addCustomFilter.controls = this.controls; + this.controls.forEach((control) => { + control.addPreSearch(_addCustomFilter); + }); + this._customFilters.push(_addCustomFilter); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + function _addCustomFilter() { + _addCustomFilter.controls.forEach((control) => { + control.addCustomFilter(filterXml, entityLogicalName); + }); + } + } + /** + * Adds an additional custom filter to the lookup, with the "AND" filter operator. + * @param entityLogicalName (Optional) The logical name of the entity. + * @param primaryAttributeIdName (Optional) The logical name of the primary key. + * @param fetchXml Specifies the FetchXML used to filter. + * @remarks If entityLogicalName is not specified, the filter will be applied to all entities + * valid for the Lookup control. + * @example Example fetchXml: + * + * + * + * + * + * + */ + async addPreFilterToLookupAdvanced(entityLogicalName, primaryAttributeIdName, fetchXml) { + try { + const result = await Xrm.WebApi.online.retrieveMultipleRecords(entityLogicalName, "?fetchXml=" + fetchXml); + const data = result.entities; + let filteredEntities = ""; + _addCustomFilter.controls = this.controls; + data.forEach((item) => { + filteredEntities += `${item[primaryAttributeIdName]}`; + }); + fetchXml = filteredEntities + ? `${filteredEntities}` + : ``; + this.controls.forEach((control) => { + control.addPreSearch(_addCustomFilter); + }); + this._customFilters.push(_addCustomFilter); + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + function _addCustomFilter() { + _addCustomFilter.controls.forEach((control) => { + control.addCustomFilter(fetchXml, entityLogicalName); + }); + } + } + /** + * Removes all filters set on the current lookup attribute by using addPreFilterToLookup or addPreFilterToLookupAdvanced + */ + clearPreFilterFromLookup() { + try { + this._customFilters.forEach((customFilter) => { + this.controls.forEach((control) => { + control.removePreSearch(customFilter); + }); + }); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + } + XrmEx.LookupField = LookupField; + class OptionsetField extends Field { + _control; + Option; + constructor(attributeName, option) { + super(attributeName); + this.Option = option; + } + getFormat() { + return this.Attribute.getFormat(); + } + getOption(value) { + if (typeof value === "number") { + return this.Attribute.getOption(value); + } + else { + return this.Attribute.getOption(value); + } + } + getOptions() { + return this.Attribute.getOptions(); + } + getSelectedOption() { + return this.Attribute.getSelectedOption(); + } + getText() { + return this.Attribute.getText(); + } + getInitialValue() { + return this.Attribute.getInitialValue(); + } + get Attribute() { + return (this._attribute ??= + Form.formContext.getAttribute(this.Name) ?? + XrmEx.throwError(`Field '${this.Name}' does not exist`)); + } + get controls() { + return this.Attribute.controls; + } + get control() { + return (this._control ??= + Form.formContext.getControl(this.Name) ?? + XrmEx.throwError(`Control '${this.Name}' does not exist`)); + } + get Value() { + return this.Attribute.getValue(); + } + set Value(value) { + if (typeof value == "number") + this.Attribute.setValue(value); + else + this.Attribute.setValue(this.Option[value]); + } + /** + * Adds an option. + * + * @param values an array with the option values to add + * @param index (Optional) zero-based index of the option. + * + * @remarks This method does not check that the values within the options you add are valid. + * If index is not provided, the new option will be added to the end of the list. + */ + addOption(values, index) { + try { + if (!Array.isArray(values)) + throw new Error(`values is not an Array:\nvalues: '${values}'`); + const optionSetValues = this.control.getAttribute().getOptions() ?? []; + for (const element of optionSetValues) { + if (values.includes(element.value)) { + this.control.addOption(element, index); + } + } + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Removes the option matching the value. + * + * @param value The value. + */ + removeOption(values) { + try { + if (!Array.isArray(values)) + throw new Error(`values is not an Array:\nvalues: '${values}'`); + const optionSetValues = this.control.getAttribute().getOptions() ?? []; + for (const element of optionSetValues) { + if (values.includes(element.value)) { + this.control.removeOption(element.value); + } + } + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Clears all options. + */ + clearOptions() { + try { + this.control.clearOptions(); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + } + XrmEx.OptionsetField = OptionsetField; + class Section { + Name; + _section; + parentTab; + constructor(name) { + this.Name = name; + } + get Section() { + return (this._section ??= + this.parentTab.sections.get(this.Name) ?? + XrmEx.throwError(`The section '${this.Name}' was not found on the form.`)); + } + getName() { + return this.Section.getName(); + } + getParent() { + return this.Section.getParent(); + } + controls; + setVisible(visible) { + return this.Section.setVisible(visible); + } + getVisible() { + return this.Section.getVisible(); + } + getLabel() { + return this.Section.getLabel(); + } + setLabel(label) { + return this.Section.setLabel(label); + } + } + XrmEx.Section = Section; + class Tab { + Name; + _tab; + Section; + constructor(name, section) { + this.Name = name; + this.Section = section; + for (let key in section) { + section[key].parentTab = this; + } + } + sections; + get Tab() { + return (this._tab ??= + Form.formContext.ui.tabs.get(this.Name) ?? + XrmEx.throwError(`The tab '${this.Name}' was not found on the form.`)); + } + addTabStateChange(handler) { + return this.Tab.addTabStateChange(handler); + } + getDisplayState() { + return this.Tab.getDisplayState(); + } + getName() { + return this.Tab.getName(); + } + getParent() { + return this.Tab.getParent(); + } + removeTabStateChange(handler) { + return this.Tab.removeTabStateChange(handler); + } + setDisplayState(displayState) { + return this.Tab.setDisplayState(displayState); + } + setVisible(visible) { + return this.Tab.setVisible(visible); + } + getVisible() { + return this.Tab.getVisible(); + } + getLabel() { + return this.Tab.getLabel(); + } + setLabel(label) { + return this.Tab.setLabel(label); + } + setFocus() { + return this.Tab.setFocus(); + } + } + XrmEx.Tab = Tab; + class GridControl { + Name; + _gridControl; + constructor(name) { + this.Name = name; + } + get GridControl() { + return ((this._gridControl ??= + Form.formContext.getControl(this.Name)) ?? + XrmEx.throwError(`The grid '${this.Name}' was not found on the form.`)); + } + get Grid() { + return this.GridControl.getGrid(); + } + addOnLoad(handler) { + return this.GridControl.addOnLoad(handler); + } + getContextType() { + return this.GridControl.getContextType(); + } + getEntityName() { + return this.GridControl.getEntityName(); + } + getFetchXml() { + return this.GridControl.getFetchXml(); + } + getGrid() { + return this.GridControl.getGrid(); + } + getRelationship() { + return this.GridControl.getRelationship(); + } + getUrl(client) { + return this.GridControl.getUrl(client); + } + getViewSelector() { + return this.GridControl.getViewSelector(); + } + openRelatedGrid() { + return this.GridControl.openRelatedGrid(); + } + refresh() { + return this.GridControl.refresh(); + } + refreshRibbon() { + return this.GridControl.refreshRibbon(); + } + removeOnLoad(handler) { + return this.GridControl.removeOnLoad(handler); + } + getControlType() { + return this.GridControl.getControlType(); + } + getName() { + return this.GridControl.getName(); + } + getParent() { + return this.GridControl.getParent(); + } + getLabel() { + return this.GridControl.getLabel(); + } + setLabel(label) { + return this.GridControl.setLabel(label); + } + getVisible() { + return this.GridControl.getVisible(); + } + setVisible(visible) { + return this.GridControl.setVisible(visible); + } + } + XrmEx.GridControl = GridControl; +})(XrmEx || (XrmEx = {})); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWHJtRXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvWHJtRXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsOERBQThEO0FBa0M5RCxJQUFVLEtBQUssQ0FvNUNkO0FBcDVDRCxXQUFVLEtBQUs7SUFDYjs7OztPQUlHO0lBQ0gsU0FBZ0IsVUFBVSxDQUFDLFlBQW9CO1FBQzdDLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUZlLGdCQUFVLGFBRXpCLENBQUE7SUFDRDs7O09BR0c7SUFDSCxTQUFnQixhQUFhO1FBQzNCLElBQUk7WUFDRixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzFCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkUsTUFBTSxtQkFBbUIsR0FDdkIsVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNuRSxNQUFNLGlCQUFpQixHQUNyQixtQkFBbUIsRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNuRCxNQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUVuRSxPQUFPLFlBQVksQ0FBQztTQUNyQjtRQUFDLE9BQU8sS0FBVSxFQUFFO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQzNEO0lBQ0gsQ0FBQztJQWRlLG1CQUFhLGdCQWM1QixDQUFB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QUFDO1FBQ3JDLENBQUM7UUFDRCxRQUFRLENBQUMsS0FBYTtZQUNwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxVQUFVO1lBQ1IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxVQUFVLENBQUMsT0FBZ0I7WUFDekIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxDQUFDO0tBQ0Y7SUF6RVksaUJBQVcsY0F5RXZCLENBQUE7QUFDSCxDQUFDLEVBcDVDUyxLQUFLLEtBQUwsS0FBSyxRQW81Q2QiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vbm9kZV9tb2R1bGVzL0B0eXBlcy94cm0vaW5kZXguZC50c1wiIC8+XG4vKipcbiAqIFJlcHJlc2VudHMgYSBwYXJhbWV0ZXIgZm9yIGEgcmVxdWVzdC5cbiAqIEB0eXBlIHtPYmplY3R9IFJlcXVlc3RQYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlci5cbiAqIEBwcm9wZXJ0eSB7J0Jvb2xlYW4nIHwgJ0RhdGVUaW1lJyB8ICdEZWNpbWFsJyB8ICdFbnRpdHknIHwgJ0VudGl0eUNvbGxlY3Rpb24nIHwgJ0VudGl0eVJlZmVyZW5jZScgfCAnRmxvYXQnIHwgJ0ludGVnZXInIHwgJ01vbmV5JyB8ICdQaWNrbGlzdCcgfCAnU3RyaW5nJ30gVHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIuXG4gKiBAcHJvcGVydHkgeyp9IFZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuXG4gKi9cbnR5cGUgUmVxdWVzdFBhcmFtZXRlciA9IHtcbiAgTmFtZTogc3RyaW5nO1xuICBUeXBlOlxuICAgIHwgXCJCb29sZWFuXCJcbiAgICB8IFwiRGF0ZVRpbWVcIlxuICAgIHwgXCJEZWNpbWFsXCJcbiAgICB8IFwiRW50aXR5XCJcbiAgICB8IFwiRW50aXR5Q29sbGVjdGlvblwiXG4gICAgfCBcIkVudGl0eVJlZmVyZW5jZVwiXG4gICAgfCBcIkZsb2F0XCJcbiAgICB8IFwiSW50ZWdlclwiXG4gICAgfCBcIk1vbmV5XCJcbiAgICB8IFwiUGlja2xpc3RcIlxuICAgIHwgXCJTdHJpbmdcIjtcbiAgVmFsdWU6IGFueTtcbn07XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWZlcmVuY2UgdG8gYW4gZW50aXR5LlxuICogQHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFRoZSBJRCBvZiB0aGUgZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudGl0eVR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgZW50aXR5LlxuICovXG50eXBlIEVudGl0eVJlZmVyZW5jZSA9IHtcbiAgaWQ6IHN0cmluZztcbiAgZW50aXR5VHlwZTogc3RyaW5nO1xufTtcbm5hbWVzcGFjZSBYcm1FeCB7XG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVycm9yTWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlIHRvIHRocm93LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBBbHdheXMgdGhyb3dzIGFuIGVycm9yIHdpdGggdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gdGhyb3dFcnJvcihlcnJvck1lc3NhZ2U6IHN0cmluZyk6IG5ldmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbi5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRNZXRob2ROYW1lKCk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgICBjb25zdCBzdGFja1RyYWNlID0gZXJyb3Iuc3RhY2s/LnNwbGl0KFwiXFxuXCIpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpO1xuICAgICAgY29uc3QgY2FsbGluZ0Z1bmN0aW9uTGluZSA9XG4gICAgICAgIHN0YWNrVHJhY2UgJiYgc3RhY2tUcmFjZS5sZW5ndGggPj0gMyA/IHN0YWNrVHJhY2VbMl0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWVNYXRjaCA9XG4gICAgICAgIGNhbGxpbmdGdW5jdGlvbkxpbmU/Lm1hdGNoKC9hdFxccysoW15cXHNdKylcXHMrXFwoLyk7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBmdW5jdGlvbk5hbWVNYXRjaCA/IGZ1bmN0aW9uTmFtZU1hdGNoWzFdIDogXCJcIjtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uTmFtZTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LmdldE1ldGhvZE5hbWU6XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogRGlzcGxheXMgYSBub3RpZmljYXRpb24gZm9yIGFuIGFwcCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBsZXZlbCwgYW5kIGxldHMgeW91IHNwZWNpZnkgd2hldGhlciB0byBzaG93IGEgY2xvc2UgYnV0dG9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gdGhlIG5vdGlmaWNhdGlvbi5cbiAgICogQHBhcmFtIHsnU1VDQ0VTUycgfCAnRVJST1InIHwgJ1dBUk5JTkcnIHwgJ0lORk8nfSBsZXZlbCAtIFRoZSBsZXZlbCBvZiB0aGUgbm90aWZpY2F0aW9uLiBDYW4gYmUgJ1NVQ0NFU1MnLCAnRVJST1InLCAnV0FSTklORycsIG9yICdJTkZPJy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbc2hvd0Nsb3NlQnV0dG9uPWZhbHNlXSAtIFdoZXRoZXIgdG8gc2hvdyBhIGNsb3NlIGJ1dHRvbiBvbiB0aGUgbm90aWZpY2F0aW9uLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBJRCBvZiB0aGUgY3JlYXRlZCBub3RpZmljYXRpb24uXG4gICAqL1xuICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkR2xvYmFsTm90aWZpY2F0aW9uKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBsZXZlbDogXCJTVUNDRVNTXCIgfCBcIkVSUk9SXCIgfCBcIldBUk5JTkdcIiB8IFwiSU5GT1wiLFxuICAgIHNob3dDbG9zZUJ1dHRvbiA9IGZhbHNlXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbGV2ZWxNYXAgPSB7XG4gICAgICBTVUNDRVNTOiAxLFxuICAgICAgRVJST1I6IDIsXG4gICAgICBXQVJOSU5HOiAzLFxuICAgICAgSU5GTzogNCxcbiAgICB9O1xuICAgIGNvbnN0IG1lc3NhZ2VMZXZlbCA9IGxldmVsTWFwW2xldmVsXSB8fCBsZXZlbE1hcC5JTkZPO1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHtcbiAgICAgIHR5cGU6IDIsXG4gICAgICBsZXZlbDogbWVzc2FnZUxldmVsLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHNob3dDbG9zZUJ1dHRvbixcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgWHJtLkFwcC5hZGRHbG9iYWxOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7Z2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDbGVhcnMgYSBub3RpZmljYXRpb24gaW4gdGhlIGFwcCB3aXRoIHRoZSBnaXZlbiB1bmlxdWUgSUQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bmlxdWVJZCAtIFRoZSB1bmlxdWUgSUQgb2YgdGhlIG5vdGlmaWNhdGlvbiB0byBjbGVhci5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBub3RpZmljYXRpb24gaGFzIGJlZW4gY2xlYXJlZC5cbiAgICovXG4gIGV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVHbG9iYWxOb3RpZmljYXRpb24oXG4gICAgdW5pcXVlSWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgWHJtLkFwcC5jbGVhckdsb2JhbE5vdGlmaWNhdGlvbih1bmlxdWVJZCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke2dldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBieSB1c2luZyBpdHMgc2NoZW1hIG5hbWUgYXMga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW52aXJvbm1lbnRWYXJpYWJsZVNjaGVtYU5hbWUgLSBUaGUgc2NoZW1hIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICovXG4gIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRFbnZpcm9ubWVudFZhcmlhYmxlVmFsdWUoXG4gICAgZW52aXJvbm1lbnRWYXJpYWJsZVNjaGVtYU5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBleGVjdXRlRnVuY3Rpb24oXCJSZXRyaWV2ZUVudmlyb25tZW50VmFyaWFibGVWYWx1ZVwiLCBbXG4gICAgICB7XG4gICAgICAgIE5hbWU6IFwiRGVmaW5pdGlvblNjaGVtYU5hbWVcIixcbiAgICAgICAgVHlwZTogXCJTdHJpbmdcIixcbiAgICAgICAgVmFsdWU6IGVudmlyb25tZW50VmFyaWFibGVTY2hlbWFOYW1lLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuICAvKipcbiAgICogQSBtYXAgb2YgQ1JNIGRhdGEgdHlwZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyB0eXBlIG5hbWVzLCBzdHJ1Y3R1cmFsIHByb3BlcnRpZXMsIGFuZCBKYXZhU2NyaXB0IHR5cGVzLlxuICAgKiBAdHlwZSB7T2JqZWN0LjxzdHJpbmcsIHsgdHlwZU5hbWU6IHN0cmluZywgc3RydWN0dXJhbFByb3BlcnR5OiBudW1iZXIsIGpzVHlwZTogc3RyaW5nIH0+fVxuICAgKi9cbiAgbGV0IHR5cGVNYXAgPSB7XG4gICAgU3RyaW5nOiB7IHR5cGVOYW1lOiBcIkVkbS5TdHJpbmdcIiwgc3RydWN0dXJhbFByb3BlcnR5OiAxLCBqc1R5cGU6IFwic3RyaW5nXCIgfSxcbiAgICBJbnRlZ2VyOiB7IHR5cGVOYW1lOiBcIkVkbS5JbnQzMlwiLCBzdHJ1Y3R1cmFsUHJvcGVydHk6IDEsIGpzVHlwZTogXCJudW1iZXJcIiB9LFxuICAgIEJvb2xlYW46IHtcbiAgICAgIHR5cGVOYW1lOiBcIkVkbS5Cb29sZWFuXCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDEsXG4gICAgICBqc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgRGF0ZVRpbWU6IHtcbiAgICAgIHR5cGVOYW1lOiBcIkVkbS5EYXRlVGltZU9mZnNldFwiLFxuICAgICAgc3RydWN0dXJhbFByb3BlcnR5OiAxLFxuICAgICAganNUeXBlOiBcIm9iamVjdFwiLFxuICAgIH0sXG4gICAgRW50aXR5UmVmZXJlbmNlOiB7XG4gICAgICB0eXBlTmFtZTogXCJtc2NybS5jcm1iYXNlZW50aXR5XCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDUsXG4gICAgICBqc1R5cGU6IFwib2JqZWN0XCIsXG4gICAgfSxcbiAgICBEZWNpbWFsOiB7XG4gICAgICB0eXBlTmFtZTogXCJFZG0uRGVjaW1hbFwiLFxuICAgICAgc3RydWN0dXJhbFByb3BlcnR5OiAxLFxuICAgICAganNUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgRW50aXR5OiB7XG4gICAgICB0eXBlTmFtZTogXCJtc2NybS5jcm1iYXNlZW50aXR5XCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDUsXG4gICAgICBqc1R5cGU6IFwib2JqZWN0XCIsXG4gICAgfSxcbiAgICBFbnRpdHlDb2xsZWN0aW9uOiB7XG4gICAgICB0eXBlTmFtZTogXCJDb2xsZWN0aW9uKG1zY3JtLmNybWJhc2VlbnRpdHkpXCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDQsXG4gICAgICBqc1R5cGU6IFwib2JqZWN0XCIsXG4gICAgfSxcbiAgICBGbG9hdDogeyB0eXBlTmFtZTogXCJFZG0uRG91YmxlXCIsIHN0cnVjdHVyYWxQcm9wZXJ0eTogMSwganNUeXBlOiBcIm51bWJlclwiIH0sXG4gICAgTW9uZXk6IHsgdHlwZU5hbWU6IFwiRWRtLkRlY2ltYWxcIiwgc3RydWN0dXJhbFByb3BlcnR5OiAxLCBqc1R5cGU6IFwibnVtYmVyXCIgfSxcbiAgICBQaWNrbGlzdDoge1xuICAgICAgdHlwZU5hbWU6IFwiRWRtLkludDMyXCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDEsXG4gICAgICBqc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgfTtcbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcmVxdWVzdCBwYXJhbWV0ZXIgaXMgb2YgYSBzdXBwb3J0ZWQgdHlwZSBhbmQgaGFzIGEgdmFsaWQgdmFsdWUuXG4gICAqIEBwYXJhbSB7UmVxdWVzdFBhcmFtZXRlcn0gcmVxdWVzdFBhcmFtZXRlciAtIFRoZSByZXF1ZXN0IHBhcmFtZXRlciB0byBjaGVjay5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGUgcmVxdWVzdCBwYXJhbWV0ZXIgaXMgbm90IG9mIGEgc3VwcG9ydGVkIHR5cGUgb3IgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gY2hlY2tSZXF1ZXN0UGFyYW1ldGVyVHlwZShcbiAgICByZXF1ZXN0UGFyYW1ldGVyOiBSZXF1ZXN0UGFyYW1ldGVyXG4gICk6IHZvaWQge1xuICAgIGlmICghdHlwZU1hcFtyZXF1ZXN0UGFyYW1ldGVyLlR5cGVdKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIHByb3BlcnR5IHR5cGUgJHtyZXF1ZXN0UGFyYW1ldGVyLlR5cGV9IG9mIHRoZSBwcm9wZXJ0eSAke3JlcXVlc3RQYXJhbWV0ZXIuTmFtZX0gaXMgbm90IHN1cHBvcnRlZC5gXG4gICAgICApO1xuICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IHR5cGVNYXBbcmVxdWVzdFBhcmFtZXRlci5UeXBlXS5qc1R5cGU7XG4gICAgY29uc3QgYWN0dWFsVHlwZSA9IHR5cGVvZiByZXF1ZXN0UGFyYW1ldGVyLlZhbHVlO1xuICAgIGNvbnN0IGludmFsaWRUeXBlTWVzc2FnZSA9IGBUaGUgdmFsdWUgJHtyZXF1ZXN0UGFyYW1ldGVyLlZhbHVlfVxcbm9mIHRoZSBwcm9wZXJ0eSAke3JlcXVlc3RQYXJhbWV0ZXIuTmFtZX1cXG5pcyBub3Qgb2YgdGhlIGV4cGVjdGVkIHR5cGUgJHtyZXF1ZXN0UGFyYW1ldGVyLlR5cGV9LmA7XG4gICAgaWYgKFxuICAgICAgcmVxdWVzdFBhcmFtZXRlci5UeXBlID09PSBcIkVudGl0eVJlZmVyZW5jZVwiIHx8XG4gICAgICByZXF1ZXN0UGFyYW1ldGVyLlR5cGUgPT09IFwiRW50aXR5XCJcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXJlcXVlc3RQYXJhbWV0ZXIuVmFsdWUgfHxcbiAgICAgICAgIXJlcXVlc3RQYXJhbWV0ZXIuVmFsdWUuaGFzT3duUHJvcGVydHkoXCJpZFwiKSB8fFxuICAgICAgICAhcmVxdWVzdFBhcmFtZXRlci5WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcImVudGl0eVR5cGVcIilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW52YWxpZFR5cGVNZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHR5cGVNYXBbXG4gICAgICAgIHJlcXVlc3RQYXJhbWV0ZXIuVHlwZVxuICAgICAgXS50eXBlTmFtZSA9IGBtc2NybS4ke3JlcXVlc3RQYXJhbWV0ZXIuVmFsdWUuZW50aXR5VHlwZX1gO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFBhcmFtZXRlci5UeXBlID09PSBcIkVudGl0eUNvbGxlY3Rpb25cIikge1xuICAgICAgaWYgKFxuICAgICAgICAhQXJyYXkuaXNBcnJheShyZXF1ZXN0UGFyYW1ldGVyLlZhbHVlKSB8fFxuICAgICAgICByZXF1ZXN0UGFyYW1ldGVyLlZhbHVlLmV2ZXJ5KFxuICAgICAgICAgICh2KSA9PlxuICAgICAgICAgICAgdHlwZW9mIHYgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgICAgICAgICF2IHx8XG4gICAgICAgICAgICAhdi5oYXNPd25Qcm9wZXJ0eShcImlkXCIpIHx8XG4gICAgICAgICAgICAhdi5oYXNPd25Qcm9wZXJ0eShcImVudGl0eVR5cGVcIilcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihpbnZhbGlkVHlwZU1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVxdWVzdFBhcmFtZXRlci5UeXBlID09PSBcIkRhdGVUaW1lXCIpIHtcbiAgICAgIGlmICghKHJlcXVlc3RQYXJhbWV0ZXIuVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW52YWxpZFR5cGVNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGFjdHVhbFR5cGUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW52YWxpZFR5cGVNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGFuIEFjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbk5hbWUgLSBUaGUgdW5pcXVlIG5hbWUgb2YgdGhlIGFjdGlvbi5cbiAgICogQHBhcmFtIHtSZXF1ZXN0UGFyYW1ldGVyW119IHJlcXVlc3RQYXJhbWV0ZXJzIC0gQW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHRoZSBwYXJhbWV0ZXIgbmFtZSwgdHlwZSBhbmQgdmFsdWUuXG4gICAqIEBwYXJhbSB7RW50aXR5UmVmZXJlbmNlfSBbYm91bmRFbnRpdHldIC0gQW4gb3B0aW9uYWwgRW50aXR5UmVmZXJlbmNlIG9mIHRoZSBib3VuZCBlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IC0gQSBQcm9taXNlIHdpdGggdGhlIHJlcXVlc3QgcmVzcG9uc2UuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGUgcmVxdWVzdCBwYXJhbWV0ZXIgaXMgbm90IG9mIGEgc3VwcG9ydGVkIHR5cGUgb3IgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gICAqL1xuICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFjdGlvbihcbiAgICBhY3Rpb25OYW1lOiBzdHJpbmcsXG4gICAgcmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJbXSxcbiAgICBib3VuZEVudGl0eT86IEVudGl0eVJlZmVyZW5jZVxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlckRlZmluaXRpb246IGFueSA9IHt9O1xuICAgIGlmIChib3VuZEVudGl0eSlcbiAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzLnB1c2goe1xuICAgICAgICBOYW1lOiBcImVudGl0eVwiLFxuICAgICAgICBWYWx1ZTogYm91bmRFbnRpdHksXG4gICAgICAgIFR5cGU6IFwiRW50aXR5UmVmZXJlbmNlXCIsXG4gICAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RQYXJhbWV0ZXIgb2YgcmVxdWVzdFBhcmFtZXRlcnMpIHtcbiAgICAgIGNoZWNrUmVxdWVzdFBhcmFtZXRlclR5cGUocmVxdWVzdFBhcmFtZXRlcik7XG4gICAgICBwYXJhbWV0ZXJEZWZpbml0aW9uW3JlcXVlc3RQYXJhbWV0ZXIuTmFtZV0gPSB7XG4gICAgICAgIHR5cGVOYW1lOiB0eXBlTWFwW3JlcXVlc3RQYXJhbWV0ZXIuVHlwZV0udHlwZU5hbWUsXG4gICAgICAgIHN0cnVjdHVyYWxQcm9wZXJ0eTogdHlwZU1hcFtyZXF1ZXN0UGFyYW1ldGVyLlR5cGVdLnN0cnVjdHVyYWxQcm9wZXJ0eSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJlcSA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7XG4gICAgICAgIGdldE1ldGFkYXRhOiAoKSA9PiAoe1xuICAgICAgICAgIGJvdW5kUGFyYW1ldGVyOiBib3VuZEVudGl0eSA/IFwiZW50aXR5XCIgOiBudWxsLFxuICAgICAgICAgIG9wZXJhdGlvblR5cGU6IDAsXG4gICAgICAgICAgb3BlcmF0aW9uTmFtZTogYWN0aW9uTmFtZSxcbiAgICAgICAgICBwYXJhbWV0ZXJUeXBlczogcGFyYW1ldGVyRGVmaW5pdGlvbixcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgICAgLi4ucmVxdWVzdFBhcmFtZXRlcnMubWFwKChwKSA9PiAoeyBbcC5OYW1lXTogcC5WYWx1ZSB9KSlcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgWHJtLldlYkFwaS5vbmxpbmUuZXhlY3V0ZShyZXEpO1xuICAgIGlmIChyZXNwb25zZS5vaykgcmV0dXJuIHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiByZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBGdW5jdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uTmFtZSAtIFRoZSB1bmlxdWUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB7UmVxdWVzdFBhcmFtZXRlcltdfSByZXF1ZXN0UGFyYW1ldGVycyAtIEFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCB0aGUgcGFyYW1ldGVyIG5hbWUsIHR5cGUgYW5kIHZhbHVlLlxuICAgKiBAcGFyYW0ge0VudGl0eVJlZmVyZW5jZX0gW2JvdW5kRW50aXR5XSAtIEFuIG9wdGlvbmFsIEVudGl0eVJlZmVyZW5jZSBvZiB0aGUgYm91bmQgZW50aXR5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSAtIEEgUHJvbWlzZSB3aXRoIHRoZSByZXF1ZXN0IHJlc3BvbnNlLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHJlcXVlc3QgcGFyYW1ldGVyIGlzIG5vdCBvZiBhIHN1cHBvcnRlZCB0eXBlIG9yIGhhcyBhbiBpbnZhbGlkIHZhbHVlLlxuICAgKi9cbiAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVGdW5jdGlvbihcbiAgICBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgICByZXF1ZXN0UGFyYW1ldGVyczogUmVxdWVzdFBhcmFtZXRlcltdLFxuICAgIGJvdW5kRW50aXR5PzogRW50aXR5UmVmZXJlbmNlXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcGFyYW1ldGVyRGVmaW5pdGlvbjogYW55ID0ge307XG4gICAgaWYgKGJvdW5kRW50aXR5KVxuICAgICAgcmVxdWVzdFBhcmFtZXRlcnMucHVzaCh7XG4gICAgICAgIE5hbWU6IFwiZW50aXR5XCIsXG4gICAgICAgIFZhbHVlOiBib3VuZEVudGl0eSxcbiAgICAgICAgVHlwZTogXCJFbnRpdHlSZWZlcmVuY2VcIixcbiAgICAgIH0pO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdFBhcmFtZXRlciBvZiByZXF1ZXN0UGFyYW1ldGVycykge1xuICAgICAgY2hlY2tSZXF1ZXN0UGFyYW1ldGVyVHlwZShyZXF1ZXN0UGFyYW1ldGVyKTtcbiAgICAgIHBhcmFtZXRlckRlZmluaXRpb25bcmVxdWVzdFBhcmFtZXRlci5OYW1lXSA9IHtcbiAgICAgICAgdHlwZU5hbWU6IHR5cGVNYXBbcmVxdWVzdFBhcmFtZXRlci5UeXBlXS50eXBlTmFtZSxcbiAgICAgICAgc3RydWN0dXJhbFByb3BlcnR5OiB0eXBlTWFwW3JlcXVlc3RQYXJhbWV0ZXIuVHlwZV0uc3RydWN0dXJhbFByb3BlcnR5LFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVxID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHtcbiAgICAgICAgZ2V0TWV0YWRhdGE6ICgpID0+ICh7XG4gICAgICAgICAgYm91bmRQYXJhbWV0ZXI6IGJvdW5kRW50aXR5ID8gXCJlbnRpdHlcIiA6IG51bGwsXG4gICAgICAgICAgb3BlcmF0aW9uVHlwZTogMSxcbiAgICAgICAgICBvcGVyYXRpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgcGFyYW1ldGVyVHlwZXM6IHBhcmFtZXRlckRlZmluaXRpb24sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICAgIC4uLnJlcXVlc3RQYXJhbWV0ZXJzLm1hcCgocCkgPT4gKHsgW3AuTmFtZV06IHAuVmFsdWUgfSkpXG4gICAgKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IFhybS5XZWJBcGkub25saW5lLmV4ZWN1dGUocmVxKTtcbiAgICBpZiAocmVzcG9uc2Uub2spIHJldHVybiByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gcmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGEgR1VJRCBsb3dlcmNhc2UgYW5kIHJlbW92ZXMgYnJhY2tldHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIC0gVGhlIEdVSUQgdG8gbm9ybWFsaXplLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBub3JtYWxpemVkIEdVSUQuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplR3VpZChndWlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgZ3VpZCAhPT0gXCJzdHJpbmdcIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXgubm9ybWFsaXplR3VpZDpcXG4nJHtndWlkfScgaXMgbm90IGEgc3RyaW5nYCk7XG4gICAgcmV0dXJuIGd1aWQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9be31dL2csIFwiXCIpO1xuICB9XG4gIC8qKlxuICAgKiBPcGVucyBhIGRpYWxvZyB3aXRoIGR5bmFtaWMgaGVpZ2h0IGFuZCB3aWR0aCBiYXNlZCBvbiB0ZXh0IGNvbnRlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGRpYWxvZy5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gLSBBIFByb21pc2Ugd2l0aCB0aGUgZGlhbG9nIHJlc3BvbnNlLlxuICAgKi9cbiAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5BbGVydERpYWxvZyhcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHRleHQ6IHN0cmluZ1xuICApOiBQcm9taXNlPGFueT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByb3dzID0gdGV4dC5zcGxpdCgvXFxyXFxufFxccnxcXG4vKTtcbiAgICAgIGxldCBhZGRpdGlvbmFsUm93cyA9IDA7XG4gICAgICByb3dzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICBsZXQgd2lkdGggPSBnZXRUZXh0V2lkdGgoXG4gICAgICAgICAgcm93LFxuICAgICAgICAgIFwiMXJlbSBTZWdvZSBVSSBSZWd1bGFyLCBTZWdvZVVJLCBTZWdvZSBVSVwiXG4gICAgICAgICk7XG4gICAgICAgIGlmICh3aWR0aCA+IDk0MCkge1xuICAgICAgICAgIGFkZGl0aW9uYWxSb3dzICs9IHdpZHRoIC8gOTQwO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGxvbmdlc3RSb3cgPSByb3dzLnJlZHVjZShcbiAgICAgICAgKGFjYywgcm93KSA9PiAocm93Lmxlbmd0aCA+IGFjYy5sZW5ndGggPyByb3cgOiBhY2MpLFxuICAgICAgICBcIlwiXG4gICAgICApO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1pbihcbiAgICAgICAgZ2V0VGV4dFdpZHRoKGxvbmdlc3RSb3csIFwiMXJlbSBTZWdvZSBVSSBSZWd1bGFyLCBTZWdvZVVJLCBTZWdvZSBVSVwiKSxcbiAgICAgICAgMTAwMFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IDEwOSArIChyb3dzLmxlbmd0aCArIGFkZGl0aW9uYWxSb3dzKSAqIDIwO1xuICAgICAgcmV0dXJuIGF3YWl0IFhybS5OYXZpZ2F0aW9uLm9wZW5BbGVydERpYWxvZyhcbiAgICAgICAge1xuICAgICAgICAgIGNvbmZpcm1CdXR0b25MYWJlbDogXCJPa1wiLFxuICAgICAgICAgIHRleHQsXG4gICAgICAgICAgdGl0bGUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtnZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXNlcyBjYW52YXMubWVhc3VyZVRleHQgdG8gY29tcHV0ZSBhbmQgcmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgZ2l2ZW4gdGV4dCBvZiBnaXZlbiBmb250IGluIHBpeGVscy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IHRvIGJlIHJlbmRlcmVkLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmb250IFRoZSBjc3MgZm9udCBkZXNjcmlwdG9yIHRoYXQgdGV4dCBpcyB0byBiZSByZW5kZXJlZCB3aXRoIChlLmcuIFwiYm9sZCAxNHB4IHZlcmRhbmFcIikuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzExODI0MS9jYWxjdWxhdGUtdGV4dC13aWR0aC13aXRoLWphdmFzY3JpcHQvMjEwMTUzOTMjMjEwMTUzOTNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRUZXh0V2lkdGgodGV4dDogc3RyaW5nLCBmb250OiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGNvbnRleHQuZm9udCA9IGZvbnQ7XG4gICAgICBjb25zdCBtZXRyaWNzID0gY29udGV4dC5tZWFzdXJlVGV4dCh0ZXh0KTtcbiAgICAgIHJldHVybiBtZXRyaWNzLndpZHRoO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIGZvcm0gaW4gRHluYW1pY3MgMzY1LlxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEZvcm0ge1xuICAgIHByb3RlY3RlZCBzdGF0aWMgX2Zvcm1Db250ZXh0OiBYcm0uRm9ybUNvbnRleHQ7XG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfZXhlY3V0aW9uQ29udGV4dDogWHJtLkV2ZW50cy5FdmVudENvbnRleHQ7XG4gICAgY29uc3RydWN0b3IoKSB7fVxuICAgIC8qKkdldHMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZm9ybSBjb250ZXh0Ki9cbiAgICBzdGF0aWMgZ2V0IGZvcm1Db250ZXh0KCk6IFhybS5Gb3JtQ29udGV4dCB7XG4gICAgICByZXR1cm4gdGhpcy5fZm9ybUNvbnRleHQ7XG4gICAgfVxuICAgIC8qKkdldHMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZXhlY3V0aW8gY29udGV4dCovXG4gICAgc3RhdGljIGdldCBleGVjdXRpb25Db250ZXh0KCk6IFhybS5FdmVudHMuRXZlbnRDb250ZXh0IHtcbiAgICAgIHJldHVybiB0aGlzLl9leGVjdXRpb25Db250ZXh0O1xuICAgIH1cbiAgICAvKipHZXRzIGEgbG9va3VwIHZhbHVlIHRoYXQgcmVmZXJlbmNlcyB0aGUgcmVjb3JkLiovXG4gICAgc3RhdGljIGdldCBlbnRpdHlSZWZlcmVuY2UoKSB7XG4gICAgICByZXR1cm4gRm9ybS5mb3JtQ29udGV4dC5kYXRhLmVudGl0eS5nZXRFbnRpdHlSZWZlcmVuY2UoKTtcbiAgICB9XG4gICAgLyoqU2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBmb3JtIGNvbnRleHQqL1xuICAgIHN0YXRpYyBzZXQgZm9ybUNvbnRleHQoY29udGV4dDogWHJtLkZvcm1Db250ZXh0IHwgWHJtLkV2ZW50cy5FdmVudENvbnRleHQpIHtcbiAgICAgIGlmIChcImdldEZvcm1Db250ZXh0XCIgaW4gY29udGV4dCkge1xuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5fZm9ybUNvbnRleHQgPSBjb250ZXh0LmdldEZvcm1Db250ZXh0KCk7XG4gICAgICB9IGVsc2UgaWYgKFwiZGF0YVwiIGluIGNvbnRleHQpIHRoaXMuX2Zvcm1Db250ZXh0ID0gY29udGV4dDtcbiAgICAgIGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBYcm1FeC5Gb3JtLnNldEZvcm1Db250ZXh0OiBUaGUgZXhlY3V0aW9uQ29udGV4dCBvciBmb3JtQ29udGV4dCB3YXMgbm90IHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uYFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipTZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0Ki9cbiAgICBzdGF0aWMgc2V0IGV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICBjb250ZXh0OiBYcm0uRm9ybUNvbnRleHQgfCBYcm0uRXZlbnRzLkV2ZW50Q29udGV4dFxuICAgICkge1xuICAgICAgaWYgKFwiZ2V0Rm9ybUNvbnRleHRcIiBpbiBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLl9mb3JtQ29udGV4dCA9IGNvbnRleHQuZ2V0Rm9ybUNvbnRleHQoKTtcbiAgICAgIH0gZWxzZSBpZiAoXCJkYXRhXCIgaW4gY29udGV4dCkgdGhpcy5fZm9ybUNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgZWxzZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFhybUV4LkZvcm0uc2V0RXhlY3V0aW9uQ29udGV4dDogVGhlIGV4ZWN1dGlvbkNvbnRleHQgb3IgZm9ybUNvbnRleHQgd2FzIG5vdCBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLmBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqUmV0dXJucyB0cnVlIGlmIGZvcm0gaXMgZnJvbSB0eXBlIGNyZWF0ZSovXG4gICAgc3RhdGljIGdldCBJc0NyZWF0ZSgpIHtcbiAgICAgIHJldHVybiBGb3JtLmZvcm1Db250ZXh0LnVpLmdldEZvcm1UeXBlKCkgPT0gMTtcbiAgICB9XG4gICAgLyoqUmV0dXJucyB0cnVlIGlmIGZvcm0gaXMgZnJvbSB0eXBlIHVwZGF0ZSovXG4gICAgc3RhdGljIGdldCBJc1VwZGF0ZSgpIHtcbiAgICAgIHJldHVybiBGb3JtLmZvcm1Db250ZXh0LnVpLmdldEZvcm1UeXBlKCkgPT0gMjtcbiAgICB9XG4gICAgLyoqUmV0dXJucyB0cnVlIGlmIGZvcm0gaXMgbm90IGZyb20gdHlwZSBjcmVhdGUqL1xuICAgIHN0YXRpYyBnZXQgSXNOb3RDcmVhdGUoKSB7XG4gICAgICByZXR1cm4gRm9ybS5mb3JtQ29udGV4dC51aS5nZXRGb3JtVHlwZSgpICE9IDE7XG4gICAgfVxuICAgIC8qKlJldHVybnMgdHJ1ZSBpZiBmb3JtIGlzIG5vdCBmcm9tIHR5cGUgdXBkYXRlKi9cbiAgICBzdGF0aWMgZ2V0IElzTm90VXBkYXRlKCkge1xuICAgICAgcmV0dXJuIEZvcm0uZm9ybUNvbnRleHQudWkuZ2V0Rm9ybVR5cGUoKSAhPSAyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwbGF5cyBhIGZvcm0gbGV2ZWwgbm90aWZpY2F0aW9uLiBBbnkgbnVtYmVyIG9mIG5vdGlmaWNhdGlvbnMgY2FuIGJlIGRpc3BsYXllZCBhbmQgd2lsbCByZW1haW4gdW50aWwgcmVtb3ZlZCB1c2luZyBjbGVhckZvcm1Ob3RpZmljYXRpb24uXG4gICAgICogVGhlIGhlaWdodCBvZiB0aGUgbm90aWZpY2F0aW9uIGFyZWEgaXMgbGltaXRlZCBzbyBlYWNoIG5ldyBtZXNzYWdlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRvcC5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgdGV4dCBvZiB0aGUgbm90aWZpY2F0aW9uIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIGxldmVsIFRoZSBsZXZlbCBvZiB0aGUgbm90aWZpY2F0aW9uIHdoaWNoIGRlZmluZXMgaG93IHRoZSBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkLCBzdWNoIGFzIHRoZSBpY29uLlxuICAgICAqIEVSUk9SOiBOb3RpZmljYXRpb24gd2lsbCB1c2UgdGhlIHN5c3RlbSBlcnJvciBpY29uLlxuICAgICAqIFdBUk5JTkc6IE5vdGlmaWNhdGlvbiB3aWxsIHVzZSB0aGUgc3lzdGVtIHdhcm5pbmcgaWNvbi5cbiAgICAgKiBJTkZPOiBOb3RpZmljYXRpb24gd2lsbCB1c2UgdGhlIHN5c3RlbSBpbmZvIGljb24uXG4gICAgICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbm90aWZpY2F0aW9uIHdoaWNoIGlzIHVzZWQgd2l0aCBjbGVhckZvcm1Ob3RpZmljYXRpb24gdG8gcmVtb3ZlIHRoZSBub3RpZmljYXRpb24uXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBpdCBzdWNjZWVkcywgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAqL1xuICAgIHN0YXRpYyBhZGRGb3JtTm90aWZpY2F0aW9uKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgbGV2ZWw6IFhybS5Gb3JtTm90aWZpY2F0aW9uTGV2ZWwsXG4gICAgICB1bmlxdWVJZDogc3RyaW5nXG4gICAgKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gRm9ybS5mb3JtQ29udGV4dC51aS5zZXRGb3JtTm90aWZpY2F0aW9uKFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgdW5pcXVlSWRcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGZvcm0gbm90aWZpY2F0aW9uIGRlc2NyaWJlZCBieSB1bmlxdWVJZC5cbiAgICAgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiBpdCBzdWNjZWVkcywgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAqL1xuICAgIHN0YXRpYyByZW1vdmVGb3JtTm90aWZpY2F0aW9uKHVuaXF1ZUlkOiBzdHJpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBGb3JtLmZvcm1Db250ZXh0LnVpLmNsZWFyRm9ybU5vdGlmaWNhdGlvbih1bmlxdWVJZCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHJlY29yZCBpcyBzYXZlZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgYWRkT25TYXZlRXZlbnRIYW5kbGVyKFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGhhbmRsZXJzID0gW2hhbmRsZXJzXTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZGF0YS5lbnRpdHkuYWRkT25TYXZlKGhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSBPblNhdmUgaXMgY29tcGxldGUuXG4gICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIuXG4gICAgICogQHJlbWFya3MgQWRkZWQgaW4gOS4yXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcG93ZXJhcHBzL2RldmVsb3Blci9tb2RlbC1kcml2ZW4tYXBwcy9jbGllbnRhcGkvcmVmZXJlbmNlL2V2ZW50cy9wb3N0c2F2ZSBFeHRlcm5hbCBMaW5rOiBQb3N0U2F2ZSBFdmVudCBEb2N1bWVudGF0aW9ufVxuICAgICAqL1xuICAgIHN0YXRpYyBhZGRPblBvc3RTYXZlRXZlbnRIYW5kbGVyKFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGhhbmRsZXJzID0gW2hhbmRsZXJzXTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZGF0YS5lbnRpdHkuYWRkT25Qb3N0U2F2ZShoYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGZvcm0gZGF0YSBpcyBsb2FkZWQuXG4gICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGZvcm0gZGF0YSBsb2Fkcy4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgZXZlbnQgaGFuZGxlciBwaXBlbGluZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYWRkT25Mb2FkRXZlbnRIYW5kbGVyKFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGhhbmRsZXJzID0gW2hhbmRsZXJzXTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZGF0YS5hZGRPbkxvYWQoaGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZSBpcyBjaGFuZ2VkLlxuICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBmdW5jdGlvbiByZWZlcmVuY2UuXG4gICAgICovXG4gICAgc3RhdGljIGFkZE9uQ2hhbmdlRXZlbnRIYW5kbGVyKFxuICAgICAgZmllbGRzOiBGaWVsZFtdLFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXSxcbiAgICAgIGV4ZWN1dGU/OiBib29sZWFuXG4gICAgKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaGFuZGxlcnMpKSB7XG4gICAgICAgICAgaGFuZGxlcnMgPSBbaGFuZGxlcnNdO1xuICAgICAgICB9XG4gICAgICAgIGhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtoYW5kbGVyfScgaXMgbm90IGEgZnVuY3Rpb25gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBmaWVsZC5hZGRPbkNoYW5nZShoYW5kbGVyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChleGVjdXRlKSB7XG4gICAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBmaWVsZC5BdHRyaWJ1dGUuZmlyZU9uQ2hhbmdlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogVXNlZCB0byBleGVjdXRlIG1ldGhvZHMgcmVsYXRlZCB0byBhIHNpbmdsZSBBdHRyaWJ1dGVcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBGaWVsZCBpbXBsZW1lbnRzIFhybS5BdHRyaWJ1dGVzLkF0dHJpYnV0ZSB7XG4gICAgcHVibGljIHN0YXRpYyBhbGxGaWVsZHM6IEZpZWxkW10gPSBbXTtcblxuICAgIHB1YmxpYyByZWFkb25seSBOYW1lITogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfYXR0cmlidXRlPzogWHJtLkF0dHJpYnV0ZXMuQXR0cmlidXRlO1xuXG4gICAgY29uc3RydWN0b3IoYXR0cmlidXRlTmFtZTogc3RyaW5nKSB7XG4gICAgICBjb25zdCBleGlzdGluZ0ZpZWxkID0gRmllbGQuYWxsRmllbGRzLmZpbmQoXG4gICAgICAgIChmKSA9PiBmLk5hbWUgPT09IGF0dHJpYnV0ZU5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoZXhpc3RpbmdGaWVsZCkge1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdGaWVsZDtcbiAgICAgIH1cbiAgICAgIHRoaXMuTmFtZSA9IGF0dHJpYnV0ZU5hbWU7XG4gICAgICBGaWVsZC5hbGxGaWVsZHMucHVzaCh0aGlzKTtcbiAgICB9XG4gICAgc2V0VmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgZ2V0QXR0cmlidXRlVHlwZSgpOiBYcm0uQXR0cmlidXRlcy5BdHRyaWJ1dGVUeXBlIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVUeXBlKCk7XG4gICAgfVxuICAgIGdldEZvcm1hdCgpOiBYcm0uQXR0cmlidXRlcy5BdHRyaWJ1dGVGb3JtYXQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldEZvcm1hdCgpO1xuICAgIH1cbiAgICBnZXRJc0RpcnR5KCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldElzRGlydHkoKTtcbiAgICB9XG4gICAgZ2V0TmFtZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE5hbWUoKTtcbiAgICB9XG4gICAgZ2V0UGFyZW50KCk6IFhybS5FbnRpdHkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFBhcmVudCgpO1xuICAgIH1cbiAgICBnZXRSZXF1aXJlZExldmVsKCk6IFhybS5BdHRyaWJ1dGVzLlJlcXVpcmVtZW50TGV2ZWwge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFJlcXVpcmVkTGV2ZWwoKTtcbiAgICB9XG4gICAgZ2V0U3VibWl0TW9kZSgpOiBYcm0uU3VibWl0TW9kZSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0U3VibWl0TW9kZSgpO1xuICAgIH1cbiAgICBnZXRVc2VyUHJpdmlsZWdlKCk6IFhybS5Qcml2aWxlZ2Uge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFVzZXJQcml2aWxlZ2UoKTtcbiAgICB9XG4gICAgcmVtb3ZlT25DaGFuZ2UoaGFuZGxlcjogWHJtLkV2ZW50cy5BdHRyaWJ1dGUuQ2hhbmdlRXZlbnRIYW5kbGVyKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUucmVtb3ZlT25DaGFuZ2UoaGFuZGxlcik7XG4gICAgfVxuICAgIHNldFN1Ym1pdE1vZGUoc3VibWl0TW9kZTogWHJtLlN1Ym1pdE1vZGUpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5zZXRTdWJtaXRNb2RlKHN1Ym1pdE1vZGUpO1xuICAgIH1cbiAgICBnZXRWYWx1ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBzZXRJc1ZhbGlkKGlzVmFsaWQ6IGJvb2xlYW4sIG1lc3NhZ2U/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5zZXRJc1ZhbGlkKGlzVmFsaWQsIG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgQXR0cmlidXRlKCk6IFhybS5BdHRyaWJ1dGVzLkF0dHJpYnV0ZSB7XG4gICAgICByZXR1cm4gKHRoaXMuX2F0dHJpYnV0ZSA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC5nZXRBdHRyaWJ1dGUodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKFxuICAgICAgICAgIGBUaGUgYXR0cmlidXRlICcke3RoaXMuTmFtZX0nIHdhcyBub3QgZm91bmQgb24gdGhlIGZvcm0uYFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbnRyb2xzKCk6IFhybS5Db2xsZWN0aW9uLkl0ZW1Db2xsZWN0aW9uPFhybS5Db250cm9scy5TdGFuZGFyZENvbnRyb2w+IHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5jb250cm9scztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIGdldCBWYWx1ZSgpOiBhbnkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICB0aGlzLkF0dHJpYnV0ZS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGNvbnRyb2wtbG9jYWwgbm90aWZpY2F0aW9uIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgaXQgc3VjY2VlZHMsIGZhbHNlIGlmIGl0IGZhaWxzLlxuICAgICAqIEByZW1hcmtzICAgICBXaGVuIHRoaXMgbWV0aG9kIGlzIHVzZWQgb24gTWljcm9zb2Z0IER5bmFtaWNzIENSTSBmb3IgdGFibGV0cyBhIHJlZCBcIlhcIiBpY29uXG4gICAgICogICAgICAgICAgICAgIGFwcGVhcnMgbmV4dCB0byB0aGUgY29udHJvbC4gVGFwcGluZyBvbiB0aGUgaWNvbiB3aWxsIGRpc3BsYXkgdGhlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgcHVibGljIHNldE5vdGlmaWNhdGlvbihtZXNzYWdlOiBzdHJpbmcsIHVuaXF1ZUlkOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghbWVzc2FnZSkgdGhyb3cgbmV3IEVycm9yKGBubyBtZXNzYWdlIHdhcyBwcm92aWRlZC5gKTtcbiAgICAgICAgaWYgKCF1bmlxdWVJZCkgdGhyb3cgbmV3IEVycm9yKGBubyB1bmlxdWVJZCB3YXMgcHJvdmlkZWQuYCk7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT5cbiAgICAgICAgICBjb250cm9sLnNldE5vdGlmaWNhdGlvbihtZXNzYWdlLCB1bmlxdWVJZClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IHN0YXRlLlxuICAgICAqIEBwYXJhbSB2aXNpYmxlIHRydWUgdG8gc2hvdywgZmFsc2UgdG8gaGlkZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0VmlzaWJsZSh2aXNpYmxlOiBib29sZWFuKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IGNvbnRyb2wuc2V0VmlzaWJsZSh2aXNpYmxlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIGNvbnRyb2wgdG8gZWl0aGVyIGVuYWJsZWQsIG9yIGRpc2FibGVkLlxuICAgICAqIEBwYXJhbSBkaXNhYmxlZCB0cnVlIHRvIGRpc2FibGUsIGZhbHNlIHRvIGVuYWJsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWQoZGlzYWJsZWQ6IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4gY29udHJvbC5zZXREaXNhYmxlZChkaXNhYmxlZCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHJlcXVpcmVkIGxldmVsLlxuICAgICAqIEBwYXJhbSByZXF1aXJlbWVudExldmVsIFRoZSByZXF1aXJlbWVudCBsZXZlbCwgYXMgZWl0aGVyIFwibm9uZVwiLCBcInJlcXVpcmVkXCIsIG9yIFwicmVjb21tZW5kZWRcIlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRSZXF1aXJlZExldmVsKFxuICAgICAgcmVxdWlyZW1lbnRMZXZlbDogWHJtLkF0dHJpYnV0ZXMuUmVxdWlyZW1lbnRMZXZlbFxuICAgICk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5BdHRyaWJ1dGUuc2V0UmVxdWlyZWRMZXZlbChyZXF1aXJlbWVudExldmVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByZXF1aXJlZCBsZXZlbC5cbiAgICAgKiBAcGFyYW0gcmVxdWlyZWQgVGhlIHJlcXVpcmVtZW50IGxldmVsLCBhcyBlaXRoZXIgZmFsc2UgZm9yIFwibm9uZVwiIG9yIHRydWUgZm9yIFwicmVxdWlyZWRcIlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRSZXF1aXJlZChyZXF1aXJlZDogYm9vbGVhbik6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5BdHRyaWJ1dGUuc2V0UmVxdWlyZWRMZXZlbChyZXF1aXJlZCA/IFwicmVxdWlyZWRcIiA6IFwibm9uZVwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipGaXJlIGFsbCBcIm9uIGNoYW5nZVwiIGV2ZW50IGhhbmRsZXJzLiAqL1xuICAgIHB1YmxpYyBmaXJlT25DaGFuZ2UoKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLkF0dHJpYnV0ZS5maXJlT25DaGFuZ2UoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgaGFuZGxlciBvciBhbiBhcnJheSBvZiBoYW5kbGVycyB0byBiZSBjYWxsZWQgd2hlbiB0aGUgYXR0cmlidXRlJ3MgdmFsdWUgaXMgY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0gaGFuZGxlcnMgVGhlIGZ1bmN0aW9uIHJlZmVyZW5jZSBvciBhbiBhcnJheSBvZiBmdW5jdGlvbiByZWZlcmVuY2VzLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRPbkNoYW5nZShcbiAgICAgIGhhbmRsZXJzOlxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJcbiAgICAgICAgfCBYcm0uRXZlbnRzLkNvbnRleHRTZW5zaXRpdmVIYW5kbGVyW11cbiAgICApOiB0aGlzIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgICB0aGlzLkF0dHJpYnV0ZS5yZW1vdmVPbkNoYW5nZShoYW5kbGVyKTtcbiAgICAgICAgICAgIHRoaXMuQXR0cmlidXRlLmFkZE9uQ2hhbmdlKGhhbmRsZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXJzICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2hhbmRsZXJzfScgaXMgbm90IGEgZnVuY3Rpb25gKTtcbiAgICAgICAgICB0aGlzLkF0dHJpYnV0ZS5yZW1vdmVPbkNoYW5nZShoYW5kbGVycyk7XG4gICAgICAgICAgdGhpcy5BdHRyaWJ1dGUuYWRkT25DaGFuZ2UoaGFuZGxlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYW4gZXJyb3Igb3IgcmVjb21tZW5kYXRpb24gbm90aWZpY2F0aW9uIGZvciBhIGNvbnRyb2wsIGFuZCBsZXRzIHlvdSBzcGVjaWZ5IGFjdGlvbnMgdG8gZXhlY3V0ZSBiYXNlZCBvbiB0aGUgbm90aWZpY2F0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGROb3RpZmljYXRpb24oXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBub3RpZmljYXRpb25MZXZlbDogXCJFUlJPUlwiIHwgXCJSRUNPTU1FTkRBVElPTlwiLFxuICAgICAgdW5pcXVlSWQ6IHN0cmluZyxcbiAgICAgIGFjdGlvbnM/OiBYcm0uQ29udHJvbHMuQ29udHJvbE5vdGlmaWNhdGlvbkFjdGlvbltdXG4gICAgKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXVuaXF1ZUlkKSB0aHJvdyBuZXcgRXJyb3IoYG5vIHVuaXF1ZUlkIHdhcyBwcm92aWRlZC5gKTtcbiAgICAgICAgaWYgKGFjdGlvbnMgJiYgIUFycmF5LmlzQXJyYXkoYWN0aW9ucykpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHRoZSBhY3Rpb24gcGFyYW1ldGVyIGlzIG5vdCBhbiBhcnJheSBvZiBDb250cm9sTm90aWZpY2F0aW9uQWN0aW9uYFxuICAgICAgICAgICk7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnRyb2wuYWRkTm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBbbWVzc2FnZV0sXG4gICAgICAgICAgICBub3RpZmljYXRpb25MZXZlbDogbm90aWZpY2F0aW9uTGV2ZWwsXG4gICAgICAgICAgICB1bmlxdWVJZDogdW5pcXVlSWQsXG4gICAgICAgICAgICBhY3Rpb25zOiBhY3Rpb25zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBub3RpZmljYXRpb24gaWRlbnRpZmllZCBieSB1bmlxdWVJZC5cbiAgICAgKiBAcGFyYW0gdW5pcXVlSWQgKE9wdGlvbmFsKSBVbmlxdWUgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGl0IHN1Y2NlZWRzLCBmYWxzZSBpZiBpdCBmYWlscy5cbiAgICAgKiBAcmVtYXJrcyBJZiB0aGUgdW5pcXVlSWQgcGFyYW1ldGVyIGlzIG5vdCB1c2VkLCB0aGUgY3VycmVudCBub3RpZmljYXRpb24gc2hvd24gd2lsbCBiZSByZW1vdmVkLlxuICAgICAqL1xuICAgIHJlbW92ZU5vdGlmaWNhdGlvbih1bmlxdWVJZDogc3RyaW5nKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICBjb250cm9sLmNsZWFyTm90aWZpY2F0aW9uKHVuaXF1ZUlkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGV4cG9ydCBjbGFzcyBUZXh0RmllbGRcbiAgICBleHRlbmRzIEZpZWxkXG4gICAgaW1wbGVtZW50cyBYcm0uQXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGVcbiAge1xuICAgIHByb3RlY3RlZCBkZWNsYXJlIF9hdHRyaWJ1dGU6IFhybS5BdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZTtcbiAgICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGU6IHN0cmluZykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlKTtcbiAgICB9XG4gICAgZ2V0TWF4TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0TWF4TGVuZ3RoKCk7XG4gICAgfVxuICAgIGdldEZvcm1hdCgpOiBYcm0uQXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGVGb3JtYXQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldEZvcm1hdCgpIGFzIFhybS5BdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZUZvcm1hdDtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFZhbHVlKCkgPz8gbnVsbDtcbiAgICB9XG4gICAgc2V0IFZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIE51bWJlckZpZWxkXG4gICAgZXh0ZW5kcyBGaWVsZFxuICAgIGltcGxlbWVudHMgWHJtLkF0dHJpYnV0ZXMuTnVtYmVyQXR0cmlidXRlXG4gIHtcbiAgICBwcm90ZWN0ZWQgZGVjbGFyZSBfYXR0cmlidXRlOiBYcm0uQXR0cmlidXRlcy5OdW1iZXJBdHRyaWJ1dGU7XG4gICAgY29uc3RydWN0b3IoYXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICAgIHN1cGVyKGF0dHJpYnV0ZSk7XG4gICAgfVxuICAgIGdldEZvcm1hdCgpOiBYcm0uQXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlRm9ybWF0IHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRGb3JtYXQoKSBhcyBYcm0uQXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlRm9ybWF0O1xuICAgIH1cbiAgICBnZXRNYXgoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRNYXgoKTtcbiAgICB9XG4gICAgZ2V0TWluKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0TWluKCk7XG4gICAgfVxuICAgIGdldFByZWNpc2lvbigpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFByZWNpc2lvbigpO1xuICAgIH1cbiAgICBzZXRQcmVjaXNpb24ocHJlY2lzaW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5zZXRQcmVjaXNpb24ocHJlY2lzaW9uKTtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBWYWx1ZSgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFZhbHVlKCkgPz8gbnVsbDtcbiAgICB9XG4gICAgc2V0IFZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIERhdGVGaWVsZCBleHRlbmRzIEZpZWxkIGltcGxlbWVudHMgWHJtLkF0dHJpYnV0ZXMuRGF0ZUF0dHJpYnV0ZSB7XG4gICAgcHJvdGVjdGVkIGRlY2xhcmUgX2F0dHJpYnV0ZTogWHJtLkF0dHJpYnV0ZXMuRGF0ZUF0dHJpYnV0ZTtcbiAgICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGU6IHN0cmluZykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlKTtcbiAgICB9XG4gICAgZ2V0Rm9ybWF0KCk6IFhybS5BdHRyaWJ1dGVzLkRhdGVBdHRyaWJ1dGVGb3JtYXQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldEZvcm1hdCgpIGFzIFhybS5BdHRyaWJ1dGVzLkRhdGVBdHRyaWJ1dGVGb3JtYXQ7XG4gICAgfVxuICAgIGdldCBBdHRyaWJ1dGUoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuX2F0dHJpYnV0ZSA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC5nZXRBdHRyaWJ1dGUodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBGaWVsZCAnJHt0aGlzLk5hbWV9JyBkb2VzIG5vdCBleGlzdGApKTtcbiAgICB9XG4gICAgZ2V0IGNvbnRyb2xzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmNvbnRyb2xzO1xuICAgIH1cbiAgICBnZXQgVmFsdWUoKTogRGF0ZSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VmFsdWUoKSA/PyBudWxsO1xuICAgIH1cbiAgICBzZXQgVmFsdWUodmFsdWU6IERhdGUpIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIEJvb2xlYW5GaWVsZFxuICAgIGV4dGVuZHMgRmllbGRcbiAgICBpbXBsZW1lbnRzIFhybS5BdHRyaWJ1dGVzLkJvb2xlYW5BdHRyaWJ1dGVcbiAge1xuICAgIHByb3RlY3RlZCBkZWNsYXJlIF9hdHRyaWJ1dGU6IFhybS5BdHRyaWJ1dGVzLkJvb2xlYW5BdHRyaWJ1dGU7XG4gICAgY29uc3RydWN0b3IoYXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICAgIHN1cGVyKGF0dHJpYnV0ZSk7XG4gICAgfVxuICAgIGdldEF0dHJpYnV0ZVR5cGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVHlwZSgpO1xuICAgIH1cbiAgICBnZXRJbml0aWFsVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0SW5pdGlhbFZhbHVlKCk7XG4gICAgfVxuICAgIGdldCBBdHRyaWJ1dGUoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuX2F0dHJpYnV0ZSA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC5nZXRBdHRyaWJ1dGUodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBGaWVsZCAnJHt0aGlzLk5hbWV9JyBkb2VzIG5vdCBleGlzdGApKTtcbiAgICB9XG4gICAgZ2V0IGNvbnRyb2xzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmNvbnRyb2xzO1xuICAgIH1cbiAgICBnZXQgVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VmFsdWUoKSA/PyBudWxsO1xuICAgIH1cbiAgICBzZXQgVmFsdWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIE11bHRpU2VsZWN0T3B0aW9uU2V0RmllbGQ8T3B0aW9ucyBleHRlbmRzIE9wdGlvblZhbHVlcz5cbiAgICBleHRlbmRzIEZpZWxkXG4gICAgaW1wbGVtZW50cyBYcm0uQXR0cmlidXRlcy5NdWx0aVNlbGVjdE9wdGlvblNldEF0dHJpYnV0ZVxuICB7XG4gICAgcHJvdGVjdGVkIGRlY2xhcmUgX2F0dHJpYnV0ZTogWHJtLkF0dHJpYnV0ZXMuTXVsdGlTZWxlY3RPcHRpb25TZXRBdHRyaWJ1dGU7XG4gICAgT3B0aW9uOiBPcHRpb25zO1xuICAgIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgb3B0aW9uPzogT3B0aW9ucykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlTmFtZSk7XG4gICAgICB0aGlzLk9wdGlvbiA9IG9wdGlvbjtcbiAgICB9XG4gICAgZ2V0Rm9ybWF0KCk6IFhybS5BdHRyaWJ1dGVzLk9wdGlvblNldEF0dHJpYnV0ZUZvcm1hdCB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0Rm9ybWF0KCkgYXMgWHJtLkF0dHJpYnV0ZXMuT3B0aW9uU2V0QXR0cmlidXRlRm9ybWF0O1xuICAgIH1cbiAgICBnZXRPcHRpb24odmFsdWU6IG51bWJlciB8IHN0cmluZyk6IFhybS5PcHRpb25TZXRWYWx1ZSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRPcHRpb24odmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbih2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGdldE9wdGlvbnMoKTogWHJtLk9wdGlvblNldFZhbHVlW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbnMoKTtcbiAgICB9XG4gICAgZ2V0U2VsZWN0ZWRPcHRpb24oKTogWHJtLk9wdGlvblNldFZhbHVlW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFNlbGVjdGVkT3B0aW9uKCk7XG4gICAgfVxuICAgIGdldFRleHQoKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFRleHQoKTtcbiAgICB9XG4gICAgZ2V0SW5pdGlhbFZhbHVlKCk6IG51bWJlcltdIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRJbml0aWFsVmFsdWUoKTtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBWYWx1ZSgpOiBudW1iZXJbXSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VmFsdWUoKTtcbiAgICB9XG4gICAgc2V0IFZhbHVlKHZhbHVlOiAoa2V5b2YgT3B0aW9ucylbXSB8IG51bWJlcltdKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgbGV0IHZhbHVlcyA9IFtdO1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2ID09IFwibnVtYmVyXCIpIHZhbHVlcy5wdXNoKHYpO1xuICAgICAgICAgIGVsc2UgdmFsdWVzLnB1c2godGhpcy5PcHRpb25bdl0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5BdHRyaWJ1dGUuc2V0VmFsdWUodmFsdWVzKTtcbiAgICAgIH0gZWxzZSBYcm1FeC50aHJvd0Vycm9yKGBGaWVsZCBWYWx1ZSAnJHt2YWx1ZX0nIGlzIG5vdCBhbiBBcnJheWApO1xuICAgIH1cbiAgfVxuICBleHBvcnQgY2xhc3MgTG9va3VwRmllbGRcbiAgICBleHRlbmRzIEZpZWxkXG4gICAgaW1wbGVtZW50cyBYcm0uQXR0cmlidXRlcy5Mb29rdXBBdHRyaWJ1dGVcbiAge1xuICAgIHByb3RlY3RlZCBkZWNsYXJlIF9hdHRyaWJ1dGU6IFhybS5BdHRyaWJ1dGVzLkxvb2t1cEF0dHJpYnV0ZTtcbiAgICBwcm90ZWN0ZWQgX2N1c3RvbUZpbHRlcnM6IGFueSA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgICBzdXBlcihhdHRyaWJ1dGUpO1xuICAgIH1cbiAgICBnZXRJc1BhcnR5TGlzdCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRJc1BhcnR5TGlzdCgpO1xuICAgIH1cbiAgICBnZXQgQXR0cmlidXRlKCkge1xuICAgICAgcmV0dXJuICh0aGlzLl9hdHRyaWJ1dGUgPz89XG4gICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZ2V0QXR0cmlidXRlKHRoaXMuTmFtZSkgPz9cbiAgICAgICAgWHJtRXgudGhyb3dFcnJvcihgRmllbGQgJyR7dGhpcy5OYW1lfScgZG9lcyBub3QgZXhpc3RgKSk7XG4gICAgfVxuICAgIGdldCBjb250cm9scygpIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5jb250cm9scztcbiAgICB9XG4gICAgLyoqR2V0cyB0aGUgaWQgb2YgdGhlIGZpcnN0IGxvb2t1cCB2YWx1ZSovXG4gICAgZ2V0IElkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuVmFsdWUgJiYgdGhpcy5WYWx1ZS5sZW5ndGggPiAwXG4gICAgICAgID8gWHJtRXgubm9ybWFsaXplR3VpZCh0aGlzLlZhbHVlWzBdLmlkKVxuICAgICAgICA6IG51bGw7XG4gICAgfVxuICAgIC8qKkdldHMgdGhlIGVudGl0eVR5cGUgb2YgdGhlIGZpcnN0IGxvb2t1cCB2YWx1ZSovXG4gICAgZ2V0IEVudGl0eVR5cGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5WYWx1ZSAmJiB0aGlzLlZhbHVlLmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLlZhbHVlWzBdLmVudGl0eVR5cGVcbiAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICAvKipHZXRzIHRoZSBmb3JtYXR0ZWQgdmFsdWUgb2YgdGhlIGZpcnN0IGxvb2t1cCB2YWx1ZSovXG4gICAgZ2V0IEZvcm1hdHRlZFZhbHVlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuVmFsdWUgJiYgdGhpcy5WYWx1ZS5sZW5ndGggPiAwID8gdGhpcy5WYWx1ZVswXS5uYW1lIDogbnVsbDtcbiAgICB9XG4gICAgZ2V0IFZhbHVlKCk6IFhybS5Mb29rdXBWYWx1ZVtdIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRWYWx1ZSgpID8/IG51bGw7XG4gICAgfVxuICAgIHNldCBWYWx1ZSh2YWx1ZTogWHJtLkxvb2t1cFZhbHVlW10pIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBsb29rdXBcbiAgICAgKiBAcGFyYW0gaWQgR3VpZCBvZiB0aGUgcmVjb3JkXG4gICAgICogQHBhcmFtIGVudGl0eVR5cGUgbG9naWNhbG5hbWUgb2YgdGhlIGVudGl0eVxuICAgICAqIEBwYXJhbSBuYW1lIGZvcm1hdHRlZCB2YWx1ZVxuICAgICAqIEBwYXJhbSBhcHBlbmQgaWYgdHJ1ZSwgYWRkcyB2YWx1ZSB0byB0aGUgYXJyYXkgaW5zdGVhZCBvZiByZXBsYWNpbmcgaXRcbiAgICAgKi9cbiAgICBzZXRMb29rdXBWYWx1ZShcbiAgICAgIGlkOiBzdHJpbmcsXG4gICAgICBlbnRpdHlUeXBlOiBhbnksXG4gICAgICBuYW1lOiBhbnksXG4gICAgICBhcHBlbmQgPSBmYWxzZVxuICAgICk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFpZCkgdGhyb3cgbmV3IEVycm9yKGBubyBpZCBwYXJhbWV0ZXIgd2FzIHByb3ZpZGVkLmApO1xuICAgICAgICBpZiAoIWVudGl0eVR5cGUpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBlbnRpdHlUeXBlIHBhcmFtZXRlciB3YXMgcHJvdmlkZWQuYCk7XG4gICAgICAgIGlkID0gWHJtRXgubm9ybWFsaXplR3VpZChpZCk7XG4gICAgICAgIGNvbnN0IGxvb2t1cFZhbHVlID0ge1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIGVudGl0eVR5cGUsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5WYWx1ZSA9XG4gICAgICAgICAgYXBwZW5kICYmIHRoaXMuVmFsdWUgPyB0aGlzLlZhbHVlLmNvbmNhdChsb29rdXBWYWx1ZSkgOiBbbG9va3VwVmFsdWVdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYW4gZW50aXR5IHJlY29yZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAoT3B0aW9uYWwpIE9EYXRhIHN5c3RlbSBxdWVyeSBvcHRpb25zLCAkc2VsZWN0IGFuZCAkZXhwYW5kLCB0byByZXRyaWV2ZSB5b3VyIGRhdGEuXG4gICAgICogLSBVc2UgdGhlICRzZWxlY3Qgc3lzdGVtIHF1ZXJ5IG9wdGlvbiB0byBsaW1pdCB0aGUgcHJvcGVydGllcyByZXR1cm5lZCBieSBpbmNsdWRpbmcgYSBjb21tYS1zZXBhcmF0ZWRcbiAgICAgKiAgIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXMuIFRoaXMgaXMgYW4gaW1wb3J0YW50IHBlcmZvcm1hbmNlIGJlc3QgcHJhY3RpY2UuIElmIHByb3BlcnRpZXMgYXJlbuKAmXRcbiAgICAgKiAgIHNwZWNpZmllZCB1c2luZyAkc2VsZWN0LCBhbGwgcHJvcGVydGllcyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIC0gVXNlIHRoZSAkZXhwYW5kIHN5c3RlbSBxdWVyeSBvcHRpb24gdG8gY29udHJvbCB3aGF0IGRhdGEgZnJvbSByZWxhdGVkIGVudGl0aWVzIGlzIHJldHVybmVkLiBJZiB5b3VcbiAgICAgKiAgIGp1c3QgaW5jbHVkZSB0aGUgbmFtZSBvZiB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSwgeW914oCZbGwgcmVjZWl2ZSBhbGwgdGhlIHByb3BlcnRpZXMgZm9yIHJlbGF0ZWRcbiAgICAgKiAgIHJlY29yZHMuIFlvdSBjYW4gbGltaXQgdGhlIHByb3BlcnRpZXMgcmV0dXJuZWQgZm9yIHJlbGF0ZWQgcmVjb3JkcyB1c2luZyB0aGUgJHNlbGVjdCBzeXN0ZW0gcXVlcnlcbiAgICAgKiAgIG9wdGlvbiBpbiBwYXJlbnRoZXNlcyBhZnRlciB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBuYW1lLiBVc2UgdGhpcyBmb3IgYm90aCBzaW5nbGUtdmFsdWVkIGFuZFxuICAgICAqICAgY29sbGVjdGlvbi12YWx1ZWQgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzLlxuICAgICAqIC0gWW91IGNhbiBhbHNvIHNwZWNpZnkgbXVsdGlwbGUgcXVlcnkgb3B0aW9ucyBieSB1c2luZyAmIHRvIHNlcGFyYXRlIHRoZSBxdWVyeSBvcHRpb25zLlxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPm9wdGlvbnMgZXhhbXBsZTo8L2NhcHRpb24+XG4gICAgICogb3B0aW9uczogJHNlbGVjdD1uYW1lJiRleHBhbmQ9cHJpbWFyeWNvbnRhY3RpZCgkc2VsZWN0PWNvbnRhY3RpZCxmdWxsbmFtZSlcbiAgICAgKiBAcmV0dXJucyBPbiBzdWNjZXNzLCByZXR1cm5zIGEgcHJvbWlzZSBjb250YWluaW5nIGEgSlNPTiBvYmplY3Qgd2l0aCB0aGUgcmV0cmlldmVkIGF0dHJpYnV0ZXMgYW5kIHRoZWlyIHZhbHVlcy5cbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9keW5hbWljczM2NS9jdXN0b21lci1lbmdhZ2VtZW50L2RldmVsb3Blci9jbGllbnRhcGkvcmVmZXJlbmNlL3hybS13ZWJhcGkvcmV0cmlldmVyZWNvcmQgRXh0ZXJuYWwgTGluazogcmV0cmlldmVSZWNvcmQgKENsaWVudCBBUEkgcmVmZXJlbmNlKX1cbiAgICAgKi9cbiAgICBhc3luYyByZXRyaWV2ZShvcHRpb25zOiBzdHJpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghdGhpcy5JZCB8fCAhdGhpcy5FbnRpdHlUeXBlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgWHJtLldlYkFwaS5yZXRyaWV2ZVJlY29yZChcbiAgICAgICAgICB0aGlzLkVudGl0eVR5cGUsXG4gICAgICAgICAgdGhpcy5JZCxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBhZGRpdGlvbmFsIGN1c3RvbSBmaWx0ZXIgdG8gdGhlIGxvb2t1cCwgd2l0aCB0aGUgXCJBTkRcIiBmaWx0ZXIgb3BlcmF0b3IuXG4gICAgICogQHBhcmFtIGZpbHRlciBTcGVjaWZpZXMgdGhlIGZpbHRlciwgYXMgYSBzZXJpYWxpemVkIEZldGNoWE1MIFwiZmlsdGVyXCIgbm9kZS5cbiAgICAgKiBAcGFyYW0gZW50aXR5TG9naWNhbE5hbWUgKE9wdGlvbmFsKSBUaGUgbG9naWNhbCBuYW1lIG9mIHRoZSBlbnRpdHkuXG4gICAgICogQHJlbWFya3MgICAgIElmIGVudGl0eUxvZ2ljYWxOYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBmaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBlbnRpdGllc1xuICAgICAqICAgICAgICAgICAgICB2YWxpZCBmb3IgdGhlIExvb2t1cCBjb250cm9sLlxuICAgICAqIEBleGFtcGxlICAgICBFeGFtcGxlIGZpbHRlcjogPGZpbHRlciB0eXBlPVwiYW5kXCI+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZGl0aW9uIGF0dHJpYnV0ZT1cImFkZHJlc3MxX2NpdHlcIiBvcGVyYXRvcj1cImVxXCIgdmFsdWU9XCJSZWRtb25kXCIgLz5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPlxuICAgICAqL1xuICAgIGFkZFByZUZpbHRlclRvTG9va3VwKGZpbHRlclhtbDogc3RyaW5nLCBlbnRpdHlMb2dpY2FsTmFtZT86IHN0cmluZyk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgX2FkZEN1c3RvbUZpbHRlci5jb250cm9scyA9IHRoaXMuY29udHJvbHM7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnRyb2wuYWRkUHJlU2VhcmNoKF9hZGRDdXN0b21GaWx0ZXIpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fY3VzdG9tRmlsdGVycy5wdXNoKF9hZGRDdXN0b21GaWx0ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfYWRkQ3VzdG9tRmlsdGVyKCkge1xuICAgICAgICBfYWRkQ3VzdG9tRmlsdGVyLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICBjb250cm9sLmFkZEN1c3RvbUZpbHRlcihmaWx0ZXJYbWwsIGVudGl0eUxvZ2ljYWxOYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gYWRkaXRpb25hbCBjdXN0b20gZmlsdGVyIHRvIHRoZSBsb29rdXAsIHdpdGggdGhlIFwiQU5EXCIgZmlsdGVyIG9wZXJhdG9yLlxuICAgICAqIEBwYXJhbSBlbnRpdHlMb2dpY2FsTmFtZSAoT3B0aW9uYWwpIFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGVudGl0eS5cbiAgICAgKiBAcGFyYW0gcHJpbWFyeUF0dHJpYnV0ZUlkTmFtZSAoT3B0aW9uYWwpIFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5LlxuICAgICAqIEBwYXJhbSBmZXRjaFhtbCBTcGVjaWZpZXMgdGhlIEZldGNoWE1MIHVzZWQgdG8gZmlsdGVyLlxuICAgICAqIEByZW1hcmtzICAgICBJZiBlbnRpdHlMb2dpY2FsTmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZmlsdGVyIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgZW50aXRpZXNcbiAgICAgKiAgICAgICAgICAgICAgdmFsaWQgZm9yIHRoZSBMb29rdXAgY29udHJvbC5cbiAgICAgKiBAZXhhbXBsZSAgICAgRXhhbXBsZSBmZXRjaFhtbDogPGZldGNoPlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudGl0eSBuYW1lPVwiY29udGFjdFwiPlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXI+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmRpdGlvbiBhdHRyaWJ1dGU9XCJhZGRyZXNzMV9jaXR5XCIgb3BlcmF0b3I9XCJlcVwiIHZhbHVlPVwiUmVkbW9uZFwiIC8+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudGl0eT5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmV0Y2g+XG4gICAgICovXG4gICAgYXN5bmMgYWRkUHJlRmlsdGVyVG9Mb29rdXBBZHZhbmNlZChcbiAgICAgIGVudGl0eUxvZ2ljYWxOYW1lOiBzdHJpbmcsXG4gICAgICBwcmltYXJ5QXR0cmlidXRlSWROYW1lOiBzdHJpbmcsXG4gICAgICBmZXRjaFhtbDogc3RyaW5nXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBYcm0uV2ViQXBpLm9ubGluZS5yZXRyaWV2ZU11bHRpcGxlUmVjb3JkcyhcbiAgICAgICAgICBlbnRpdHlMb2dpY2FsTmFtZSxcbiAgICAgICAgICBcIj9mZXRjaFhtbD1cIiArIGZldGNoWG1sXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSByZXN1bHQuZW50aXRpZXM7XG4gICAgICAgIGxldCBmaWx0ZXJlZEVudGl0aWVzID0gXCJcIjtcbiAgICAgICAgX2FkZEN1c3RvbUZpbHRlci5jb250cm9scyA9IHRoaXMuY29udHJvbHM7XG4gICAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGZpbHRlcmVkRW50aXRpZXMgKz0gYDx2YWx1ZT4ke2l0ZW1bcHJpbWFyeUF0dHJpYnV0ZUlkTmFtZV19PC92YWx1ZT5gO1xuICAgICAgICB9KTtcbiAgICAgICAgZmV0Y2hYbWwgPSBmaWx0ZXJlZEVudGl0aWVzXG4gICAgICAgICAgPyBgPGZpbHRlcj48Y29uZGl0aW9uIGF0dHJpYnV0ZT0nJHtwcmltYXJ5QXR0cmlidXRlSWROYW1lfScgb3BlcmF0b3I9J2luJz4ke2ZpbHRlcmVkRW50aXRpZXN9PC9jb25kaXRpb24+PC9maWx0ZXI+YFxuICAgICAgICAgIDogYDxmaWx0ZXI+PGNvbmRpdGlvbiBhdHRyaWJ1dGU9JyR7cHJpbWFyeUF0dHJpYnV0ZUlkTmFtZX0nIG9wZXJhdG9yPSdudWxsJy8+PC9maWx0ZXI+YDtcbiAgICAgICAgdGhpcy5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgY29udHJvbC5hZGRQcmVTZWFyY2goX2FkZEN1c3RvbUZpbHRlcik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9jdXN0b21GaWx0ZXJzLnB1c2goX2FkZEN1c3RvbUZpbHRlcik7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9hZGRDdXN0b21GaWx0ZXIoKSB7XG4gICAgICAgIF9hZGRDdXN0b21GaWx0ZXIuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnRyb2wuYWRkQ3VzdG9tRmlsdGVyKGZldGNoWG1sLCBlbnRpdHlMb2dpY2FsTmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBmaWx0ZXJzIHNldCBvbiB0aGUgY3VycmVudCBsb29rdXAgYXR0cmlidXRlIGJ5IHVzaW5nIGFkZFByZUZpbHRlclRvTG9va3VwIG9yIGFkZFByZUZpbHRlclRvTG9va3VwQWR2YW5jZWRcbiAgICAgKi9cbiAgICBjbGVhclByZUZpbHRlckZyb21Mb29rdXAoKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9jdXN0b21GaWx0ZXJzLmZvckVhY2goXG4gICAgICAgICAgKGN1c3RvbUZpbHRlcjogWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnRyb2wucmVtb3ZlUHJlU2VhcmNoKGN1c3RvbUZpbHRlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHR5cGUgT3B0aW9uVmFsdWVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IG51bWJlcjtcbiAgfTtcbiAgZXhwb3J0IGNsYXNzIE9wdGlvbnNldEZpZWxkPE9wdGlvbnMgZXh0ZW5kcyBPcHRpb25WYWx1ZXM+XG4gICAgZXh0ZW5kcyBGaWVsZFxuICAgIGltcGxlbWVudHMgWHJtLkF0dHJpYnV0ZXMuT3B0aW9uU2V0QXR0cmlidXRlXG4gIHtcbiAgICBwcm90ZWN0ZWQgZGVjbGFyZSBfYXR0cmlidXRlOiBYcm0uQXR0cmlidXRlcy5PcHRpb25TZXRBdHRyaWJ1dGU7XG4gICAgcHJvdGVjdGVkIF9jb250cm9sITogWHJtLkNvbnRyb2xzLk9wdGlvblNldENvbnRyb2w7XG4gICAgT3B0aW9uOiBPcHRpb25zO1xuICAgIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgb3B0aW9uPzogT3B0aW9ucykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlTmFtZSk7XG4gICAgICB0aGlzLk9wdGlvbiA9IG9wdGlvbjtcbiAgICB9XG4gICAgZ2V0Rm9ybWF0KCk6IFhybS5BdHRyaWJ1dGVzLk9wdGlvblNldEF0dHJpYnV0ZUZvcm1hdCB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0Rm9ybWF0KCkgYXMgWHJtLkF0dHJpYnV0ZXMuT3B0aW9uU2V0QXR0cmlidXRlRm9ybWF0O1xuICAgIH1cbiAgICBnZXRPcHRpb24odmFsdWU6IG51bWJlciB8IHN0cmluZyk6IFhybS5PcHRpb25TZXRWYWx1ZSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRPcHRpb24odmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbih2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGdldE9wdGlvbnMoKTogWHJtLk9wdGlvblNldFZhbHVlW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbnMoKTtcbiAgICB9XG4gICAgZ2V0U2VsZWN0ZWRPcHRpb24oKTogWHJtLk9wdGlvblNldFZhbHVlIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRTZWxlY3RlZE9wdGlvbigpO1xuICAgIH1cbiAgICBnZXRUZXh0KCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VGV4dCgpO1xuICAgIH1cbiAgICBnZXRJbml0aWFsVmFsdWUoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRJbml0aWFsVmFsdWUoKTtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBjb250cm9sKCkge1xuICAgICAgcmV0dXJuICh0aGlzLl9jb250cm9sID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldENvbnRyb2wodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBDb250cm9sICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgVmFsdWUoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBzZXQgVmFsdWUodmFsdWU6IGtleW9mIE9wdGlvbnMgfCBudW1iZXIpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJudW1iZXJcIikgdGhpcy5BdHRyaWJ1dGUuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgZWxzZSB0aGlzLkF0dHJpYnV0ZS5zZXRWYWx1ZSh0aGlzLk9wdGlvblt2YWx1ZV0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIG9wdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZXMgYW4gYXJyYXkgd2l0aCB0aGUgb3B0aW9uIHZhbHVlcyB0byBhZGRcbiAgICAgKiBAcGFyYW0gaW5kZXggKE9wdGlvbmFsKSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBvcHRpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrcyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjaGVjayB0aGF0IHRoZSB2YWx1ZXMgd2l0aGluIHRoZSBvcHRpb25zIHlvdSBhZGQgYXJlIHZhbGlkLlxuICAgICAqICAgICAgICAgIElmIGluZGV4IGlzIG5vdCBwcm92aWRlZCwgdGhlIG5ldyBvcHRpb24gd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuICAgICAqL1xuICAgIGFkZE9wdGlvbih2YWx1ZXM6IG51bWJlcltdLCBpbmRleD86IG51bWJlcik6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2YWx1ZXMgaXMgbm90IGFuIEFycmF5OlxcbnZhbHVlczogJyR7dmFsdWVzfSdgKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uU2V0VmFsdWVzID0gdGhpcy5jb250cm9sLmdldEF0dHJpYnV0ZSgpLmdldE9wdGlvbnMoKSA/PyBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIG9wdGlvblNldFZhbHVlcykge1xuICAgICAgICAgIGlmICh2YWx1ZXMuaW5jbHVkZXMoZWxlbWVudC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5hZGRPcHRpb24oZWxlbWVudCwgaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBvcHRpb24gbWF0Y2hpbmcgdGhlIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZS5cbiAgICAgKi9cbiAgICByZW1vdmVPcHRpb24odmFsdWVzOiBudW1iZXJbXSk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2YWx1ZXMgaXMgbm90IGFuIEFycmF5OlxcbnZhbHVlczogJyR7dmFsdWVzfSdgKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uU2V0VmFsdWVzID0gdGhpcy5jb250cm9sLmdldEF0dHJpYnV0ZSgpLmdldE9wdGlvbnMoKSA/PyBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIG9wdGlvblNldFZhbHVlcykge1xuICAgICAgICAgIGlmICh2YWx1ZXMuaW5jbHVkZXMoZWxlbWVudC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5yZW1vdmVPcHRpb24oZWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgb3B0aW9ucy5cbiAgICAgKi9cbiAgICBjbGVhck9wdGlvbnMoKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNvbnRyb2wuY2xlYXJPcHRpb25zKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGV4cG9ydCBjbGFzcyBTZWN0aW9uIGltcGxlbWVudHMgWHJtLkNvbnRyb2xzLlNlY3Rpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSBOYW1lITogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfc2VjdGlvbj86IFhybS5Db250cm9scy5TZWN0aW9uO1xuICAgIHB1YmxpYyBwYXJlbnRUYWI/OiBYcm0uQ29udHJvbHMuVGFiO1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgICAgdGhpcy5OYW1lID0gbmFtZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBTZWN0aW9uKCk6IFhybS5Db250cm9scy5TZWN0aW9uIHtcbiAgICAgIHJldHVybiAodGhpcy5fc2VjdGlvbiA/Pz1cbiAgICAgICAgdGhpcy5wYXJlbnRUYWIuc2VjdGlvbnMuZ2V0KHRoaXMuTmFtZSkgPz9cbiAgICAgICAgWHJtRXgudGhyb3dFcnJvcihcbiAgICAgICAgICBgVGhlIHNlY3Rpb24gJyR7dGhpcy5OYW1lfScgd2FzIG5vdCBmb3VuZCBvbiB0aGUgZm9ybS5gXG4gICAgICAgICkpO1xuICAgIH1cbiAgICBnZXROYW1lKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5TZWN0aW9uLmdldE5hbWUoKTtcbiAgICB9XG4gICAgZ2V0UGFyZW50KCk6IFhybS5Db250cm9scy5UYWIge1xuICAgICAgcmV0dXJuIHRoaXMuU2VjdGlvbi5nZXRQYXJlbnQoKTtcbiAgICB9XG4gICAgY29udHJvbHM6IFhybS5Db2xsZWN0aW9uLkl0ZW1Db2xsZWN0aW9uPFhybS5Db250cm9scy5Db250cm9sPjtcbiAgICBzZXRWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLlNlY3Rpb24uc2V0VmlzaWJsZSh2aXNpYmxlKTtcbiAgICB9XG4gICAgZ2V0VmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLlNlY3Rpb24uZ2V0VmlzaWJsZSgpO1xuICAgIH1cbiAgICBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuU2VjdGlvbi5nZXRMYWJlbCgpO1xuICAgIH1cbiAgICBzZXRMYWJlbChsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5TZWN0aW9uLnNldExhYmVsKGxhYmVsKTtcbiAgICB9XG4gIH1cbiAgdHlwZSBUYWJTZWN0aW9ucyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBTZWN0aW9uO1xuICB9O1xuICBleHBvcnQgY2xhc3MgVGFiPFNlY3Rpb25zIGV4dGVuZHMgVGFiU2VjdGlvbnM+IGltcGxlbWVudHMgWHJtLkNvbnRyb2xzLlRhYiB7XG4gICAgcHVibGljIHJlYWRvbmx5IE5hbWUhOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF90YWI/OiBYcm0uQ29udHJvbHMuVGFiO1xuICAgIFNlY3Rpb246IFNlY3Rpb25zO1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgc2VjdGlvbj86IFNlY3Rpb25zKSB7XG4gICAgICB0aGlzLk5hbWUgPSBuYW1lO1xuICAgICAgdGhpcy5TZWN0aW9uID0gc2VjdGlvbjtcbiAgICAgIGZvciAobGV0IGtleSBpbiBzZWN0aW9uKSB7XG4gICAgICAgIHNlY3Rpb25ba2V5XS5wYXJlbnRUYWIgPSB0aGlzO1xuICAgICAgfVxuICAgIH1cbiAgICBzZWN0aW9uczogWHJtLkNvbGxlY3Rpb24uSXRlbUNvbGxlY3Rpb248WHJtLkNvbnRyb2xzLlNlY3Rpb24+O1xuXG4gICAgcHVibGljIGdldCBUYWIoKTogWHJtLkNvbnRyb2xzLlRhYiB7XG4gICAgICByZXR1cm4gKHRoaXMuX3RhYiA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC51aS50YWJzLmdldCh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYFRoZSB0YWIgJyR7dGhpcy5OYW1lfScgd2FzIG5vdCBmb3VuZCBvbiB0aGUgZm9ybS5gKSk7XG4gICAgfVxuICAgIGFkZFRhYlN0YXRlQ2hhbmdlKGhhbmRsZXI6IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXIpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLlRhYi5hZGRUYWJTdGF0ZUNoYW5nZShoYW5kbGVyKTtcbiAgICB9XG4gICAgZ2V0RGlzcGxheVN0YXRlKCk6IFhybS5EaXNwbGF5U3RhdGUge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLmdldERpc3BsYXlTdGF0ZSgpO1xuICAgIH1cbiAgICBnZXROYW1lKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5UYWIuZ2V0TmFtZSgpO1xuICAgIH1cbiAgICBnZXRQYXJlbnQoKTogWHJtLlVpIHtcbiAgICAgIHJldHVybiB0aGlzLlRhYi5nZXRQYXJlbnQoKTtcbiAgICB9XG4gICAgcmVtb3ZlVGFiU3RhdGVDaGFuZ2UoaGFuZGxlcjogWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlcik6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLnJlbW92ZVRhYlN0YXRlQ2hhbmdlKGhhbmRsZXIpO1xuICAgIH1cbiAgICBzZXREaXNwbGF5U3RhdGUoZGlzcGxheVN0YXRlOiBYcm0uRGlzcGxheVN0YXRlKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5UYWIuc2V0RGlzcGxheVN0YXRlKGRpc3BsYXlTdGF0ZSk7XG4gICAgfVxuICAgIHNldFZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLnNldFZpc2libGUodmlzaWJsZSk7XG4gICAgfVxuICAgIGdldFZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5UYWIuZ2V0VmlzaWJsZSgpO1xuICAgIH1cbiAgICBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLmdldExhYmVsKCk7XG4gICAgfVxuICAgIHNldExhYmVsKGxhYmVsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLlRhYi5zZXRMYWJlbChsYWJlbCk7XG4gICAgfVxuICAgIHNldEZvY3VzKCk6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLnNldEZvY3VzKCk7XG4gICAgfVxuICB9XG4gIGV4cG9ydCBjbGFzcyBHcmlkQ29udHJvbCBpbXBsZW1lbnRzIFhybS5Db250cm9scy5HcmlkQ29udHJvbCB7XG4gICAgcHVibGljIHJlYWRvbmx5IE5hbWUhOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9ncmlkQ29udHJvbD86IFhybS5Db250cm9scy5HcmlkQ29udHJvbDtcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuTmFtZSA9IG5hbWU7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgR3JpZENvbnRyb2woKTogWHJtLkNvbnRyb2xzLkdyaWRDb250cm9sIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgICh0aGlzLl9ncmlkQ29udHJvbCA/Pz1cbiAgICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldENvbnRyb2w8WHJtLkNvbnRyb2xzLkdyaWRDb250cm9sPih0aGlzLk5hbWUpKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBUaGUgZ3JpZCAnJHt0aGlzLk5hbWV9JyB3YXMgbm90IGZvdW5kIG9uIHRoZSBmb3JtLmApXG4gICAgICApO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IEdyaWQoKTogWHJtLkNvbnRyb2xzLkdyaWQge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0R3JpZCgpO1xuICAgIH1cbiAgICBhZGRPbkxvYWQoaGFuZGxlcjogWHJtLkV2ZW50cy5HcmlkQ29udHJvbC5Mb2FkRXZlbnRIYW5kbGVyKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5HcmlkQ29udHJvbC5hZGRPbkxvYWQoaGFuZGxlcik7XG4gICAgfVxuICAgIGdldENvbnRleHRUeXBlKCk6IFhybUVudW0uR3JpZENvbnRyb2xDb250ZXh0IHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldENvbnRleHRUeXBlKCk7XG4gICAgfVxuICAgIGdldEVudGl0eU5hbWUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldEVudGl0eU5hbWUoKTtcbiAgICB9XG4gICAgZ2V0RmV0Y2hYbWwoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldEZldGNoWG1sKCk7XG4gICAgfVxuICAgIGdldEdyaWQoKTogWHJtLkNvbnRyb2xzLkdyaWQge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0R3JpZCgpO1xuICAgIH1cbiAgICBnZXRSZWxhdGlvbnNoaXAoKTogWHJtLkNvbnRyb2xzLkdyaWRSZWxhdGlvbnNoaXAge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0UmVsYXRpb25zaGlwKCk7XG4gICAgfVxuICAgIGdldFVybChjbGllbnQ/OiBYcm1FbnVtLkdyaWRDbGllbnQpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0VXJsKGNsaWVudCk7XG4gICAgfVxuICAgIGdldFZpZXdTZWxlY3RvcigpOiBYcm0uQ29udHJvbHMuVmlld1NlbGVjdG9yIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldFZpZXdTZWxlY3RvcigpO1xuICAgIH1cbiAgICBvcGVuUmVsYXRlZEdyaWQoKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5HcmlkQ29udHJvbC5vcGVuUmVsYXRlZEdyaWQoKTtcbiAgICB9XG4gICAgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnJlZnJlc2goKTtcbiAgICB9XG4gICAgcmVmcmVzaFJpYmJvbigpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnJlZnJlc2hSaWJib24oKTtcbiAgICB9XG4gICAgcmVtb3ZlT25Mb2FkKGhhbmRsZXI6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnJlbW92ZU9uTG9hZChoYW5kbGVyKTtcbiAgICB9XG4gICAgZ2V0Q29udHJvbFR5cGUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldENvbnRyb2xUeXBlKCk7XG4gICAgfVxuICAgIGdldE5hbWUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldE5hbWUoKTtcbiAgICB9XG4gICAgZ2V0UGFyZW50KCk6IFhybS5Db250cm9scy5TZWN0aW9uIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldFBhcmVudCgpO1xuICAgIH1cbiAgICBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0TGFiZWwoKTtcbiAgICB9XG4gICAgc2V0TGFiZWwobGFiZWw6IHN0cmluZyk6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuc2V0TGFiZWwobGFiZWwpO1xuICAgIH1cbiAgICBnZXRWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0VmlzaWJsZSgpO1xuICAgIH1cbiAgICBzZXRWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnNldFZpc2libGUodmlzaWJsZSk7XG4gICAgfVxuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/docs/classes/XrmEx.BooleanField.md b/docs/classes/XrmEx.BooleanField.md index 14135e2..a389e4e 100644 --- a/docs/classes/XrmEx.BooleanField.md +++ b/docs/classes/XrmEx.BooleanField.md @@ -78,7 +78,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:915](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L915) +[XrmEx.ts:915](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L915) ## Properties @@ -92,7 +92,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584) +[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584) ___ @@ -106,7 +106,7 @@ ___ #### Defined in -[XrmEx.ts:914](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L914) +[XrmEx.ts:914](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L914) ___ @@ -120,7 +120,7 @@ ___ #### Defined in -[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582) +[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582) ## Accessors @@ -138,7 +138,7 @@ Field.Attribute #### Defined in -[XrmEx.ts:924](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L924) +[XrmEx.ts:924](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L924) ___ @@ -160,7 +160,7 @@ Field.Value #### Defined in -[XrmEx.ts:932](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L932) +[XrmEx.ts:932](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L932) • `set` **Value**(`value`): `void` @@ -180,7 +180,7 @@ Field.Value #### Defined in -[XrmEx.ts:935](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L935) +[XrmEx.ts:935](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L935) ___ @@ -202,7 +202,7 @@ Field.controls #### Defined in -[XrmEx.ts:929](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L929) +[XrmEx.ts:929](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L929) ## Methods @@ -231,7 +231,7 @@ Displays an error or recommendation notification for a control, and lets you spe #### Defined in -[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778) +[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778) ___ @@ -261,7 +261,7 @@ Xrm.Attributes.BooleanAttribute.addOnChange #### Defined in -[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750) +[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750) ___ @@ -285,7 +285,7 @@ Xrm.Attributes.BooleanAttribute.fireOnChange #### Defined in -[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737) +[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737) ___ @@ -307,7 +307,7 @@ Xrm.Attributes.BooleanAttribute.getAttributeType #### Defined in -[XrmEx.ts:918](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L918) +[XrmEx.ts:918](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L918) ___ @@ -329,7 +329,7 @@ Xrm.Attributes.BooleanAttribute.getFormat #### Defined in -[XrmEx.ts:603](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L603) +[XrmEx.ts:603](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L603) ___ @@ -347,7 +347,7 @@ Xrm.Attributes.BooleanAttribute.getInitialValue #### Defined in -[XrmEx.ts:921](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L921) +[XrmEx.ts:921](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L921) ___ @@ -369,7 +369,7 @@ Xrm.Attributes.BooleanAttribute.getIsDirty #### Defined in -[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606) +[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606) ___ @@ -391,7 +391,7 @@ Xrm.Attributes.BooleanAttribute.getName #### Defined in -[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609) +[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609) ___ @@ -413,7 +413,7 @@ Xrm.Attributes.BooleanAttribute.getParent #### Defined in -[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612) +[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612) ___ @@ -435,7 +435,7 @@ Xrm.Attributes.BooleanAttribute.getRequiredLevel #### Defined in -[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615) +[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615) ___ @@ -457,7 +457,7 @@ Xrm.Attributes.BooleanAttribute.getSubmitMode #### Defined in -[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618) +[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618) ___ @@ -479,7 +479,7 @@ Xrm.Attributes.BooleanAttribute.getUserPrivilege #### Defined in -[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621) +[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621) ___ @@ -501,7 +501,7 @@ Xrm.Attributes.BooleanAttribute.getValue #### Defined in -[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630) +[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630) ___ @@ -533,7 +533,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809) +[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809) ___ @@ -561,7 +561,7 @@ Xrm.Attributes.BooleanAttribute.removeOnChange #### Defined in -[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624) +[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624) ___ @@ -587,7 +587,7 @@ Sets the state of the control to either enabled, or disabled. #### Defined in -[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699) +[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699) ___ @@ -616,7 +616,7 @@ Xrm.Attributes.BooleanAttribute.setIsValid #### Defined in -[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633) +[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633) ___ @@ -650,7 +650,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669) +[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669) ___ @@ -676,7 +676,7 @@ Sets the required level. #### Defined in -[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727) +[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727) ___ @@ -706,7 +706,7 @@ Xrm.Attributes.BooleanAttribute.setRequiredLevel #### Defined in -[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712) +[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712) ___ @@ -734,7 +734,7 @@ Xrm.Attributes.BooleanAttribute.setSubmitMode #### Defined in -[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627) +[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627) ___ @@ -762,7 +762,7 @@ Xrm.Attributes.BooleanAttribute.setValue #### Defined in -[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597) +[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597) ___ @@ -788,4 +788,4 @@ Sets the visibility state. #### Defined in -[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686) +[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686) diff --git a/docs/classes/XrmEx.DateField.md b/docs/classes/XrmEx.DateField.md index cf51d7c..960dce0 100644 --- a/docs/classes/XrmEx.DateField.md +++ b/docs/classes/XrmEx.DateField.md @@ -77,7 +77,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:889](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L889) +[XrmEx.ts:889](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L889) ## Properties @@ -91,7 +91,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584) +[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584) ___ @@ -105,7 +105,7 @@ ___ #### Defined in -[XrmEx.ts:888](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L888) +[XrmEx.ts:888](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L888) ___ @@ -119,7 +119,7 @@ ___ #### Defined in -[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582) +[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582) ## Accessors @@ -137,7 +137,7 @@ Field.Attribute #### Defined in -[XrmEx.ts:895](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L895) +[XrmEx.ts:895](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L895) ___ @@ -159,7 +159,7 @@ Field.Value #### Defined in -[XrmEx.ts:903](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L903) +[XrmEx.ts:903](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L903) • `set` **Value**(`value`): `void` @@ -179,7 +179,7 @@ Field.Value #### Defined in -[XrmEx.ts:906](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L906) +[XrmEx.ts:906](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L906) ___ @@ -201,7 +201,7 @@ Field.controls #### Defined in -[XrmEx.ts:900](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L900) +[XrmEx.ts:900](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L900) ## Methods @@ -230,7 +230,7 @@ Displays an error or recommendation notification for a control, and lets you spe #### Defined in -[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778) +[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778) ___ @@ -260,7 +260,7 @@ Xrm.Attributes.DateAttribute.addOnChange #### Defined in -[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750) +[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750) ___ @@ -284,7 +284,7 @@ Xrm.Attributes.DateAttribute.fireOnChange #### Defined in -[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737) +[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737) ___ @@ -306,7 +306,7 @@ Xrm.Attributes.DateAttribute.getAttributeType #### Defined in -[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L600) +[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L600) ___ @@ -328,7 +328,7 @@ Xrm.Attributes.DateAttribute.getFormat #### Defined in -[XrmEx.ts:892](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L892) +[XrmEx.ts:892](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L892) ___ @@ -350,7 +350,7 @@ Xrm.Attributes.DateAttribute.getIsDirty #### Defined in -[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606) +[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606) ___ @@ -372,7 +372,7 @@ Xrm.Attributes.DateAttribute.getName #### Defined in -[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609) +[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609) ___ @@ -394,7 +394,7 @@ Xrm.Attributes.DateAttribute.getParent #### Defined in -[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612) +[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612) ___ @@ -416,7 +416,7 @@ Xrm.Attributes.DateAttribute.getRequiredLevel #### Defined in -[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615) +[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615) ___ @@ -438,7 +438,7 @@ Xrm.Attributes.DateAttribute.getSubmitMode #### Defined in -[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618) +[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618) ___ @@ -460,7 +460,7 @@ Xrm.Attributes.DateAttribute.getUserPrivilege #### Defined in -[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621) +[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621) ___ @@ -482,7 +482,7 @@ Xrm.Attributes.DateAttribute.getValue #### Defined in -[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630) +[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630) ___ @@ -514,7 +514,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809) +[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809) ___ @@ -542,7 +542,7 @@ Xrm.Attributes.DateAttribute.removeOnChange #### Defined in -[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624) +[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624) ___ @@ -568,7 +568,7 @@ Sets the state of the control to either enabled, or disabled. #### Defined in -[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699) +[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699) ___ @@ -597,7 +597,7 @@ Xrm.Attributes.DateAttribute.setIsValid #### Defined in -[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633) +[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633) ___ @@ -631,7 +631,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669) +[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669) ___ @@ -657,7 +657,7 @@ Sets the required level. #### Defined in -[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727) +[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727) ___ @@ -687,7 +687,7 @@ Xrm.Attributes.DateAttribute.setRequiredLevel #### Defined in -[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712) +[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712) ___ @@ -715,7 +715,7 @@ Xrm.Attributes.DateAttribute.setSubmitMode #### Defined in -[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627) +[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627) ___ @@ -743,7 +743,7 @@ Xrm.Attributes.DateAttribute.setValue #### Defined in -[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597) +[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597) ___ @@ -769,4 +769,4 @@ Sets the visibility state. #### Defined in -[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686) +[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686) diff --git a/docs/classes/XrmEx.Field.md b/docs/classes/XrmEx.Field.md index b89bb2d..1c9f2c5 100644 --- a/docs/classes/XrmEx.Field.md +++ b/docs/classes/XrmEx.Field.md @@ -85,7 +85,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:587](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L587) +[XrmEx.ts:587](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L587) ## Properties @@ -95,7 +95,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584) +[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584) ___ @@ -105,7 +105,7 @@ ___ #### Defined in -[XrmEx.ts:585](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L585) +[XrmEx.ts:585](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L585) ___ @@ -115,7 +115,7 @@ ___ #### Defined in -[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582) +[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582) ## Accessors @@ -129,7 +129,7 @@ ___ #### Defined in -[XrmEx.ts:637](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L637) +[XrmEx.ts:637](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L637) ___ @@ -147,7 +147,7 @@ The value. #### Defined in -[XrmEx.ts:653](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L653) +[XrmEx.ts:653](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L653) • `set` **Value**(`value`): `void` @@ -163,7 +163,7 @@ The value. #### Defined in -[XrmEx.ts:657](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L657) +[XrmEx.ts:657](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L657) ___ @@ -181,7 +181,7 @@ Xrm.Attributes.Attribute.controls #### Defined in -[XrmEx.ts:645](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L645) +[XrmEx.ts:645](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L645) ## Methods @@ -206,7 +206,7 @@ Displays an error or recommendation notification for a control, and lets you spe #### Defined in -[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778) +[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778) ___ @@ -232,7 +232,7 @@ Xrm.Attributes.Attribute.addOnChange #### Defined in -[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750) +[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750) ___ @@ -252,7 +252,7 @@ Xrm.Attributes.Attribute.fireOnChange #### Defined in -[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737) +[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737) ___ @@ -270,7 +270,7 @@ Xrm.Attributes.Attribute.getAttributeType #### Defined in -[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L600) +[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L600) ___ @@ -288,7 +288,7 @@ Xrm.Attributes.Attribute.getFormat #### Defined in -[XrmEx.ts:603](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L603) +[XrmEx.ts:603](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L603) ___ @@ -306,7 +306,7 @@ Xrm.Attributes.Attribute.getIsDirty #### Defined in -[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606) +[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606) ___ @@ -324,7 +324,7 @@ Xrm.Attributes.Attribute.getName #### Defined in -[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609) +[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609) ___ @@ -342,7 +342,7 @@ Xrm.Attributes.Attribute.getParent #### Defined in -[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612) +[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612) ___ @@ -360,7 +360,7 @@ Xrm.Attributes.Attribute.getRequiredLevel #### Defined in -[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615) +[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615) ___ @@ -378,7 +378,7 @@ Xrm.Attributes.Attribute.getSubmitMode #### Defined in -[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618) +[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618) ___ @@ -396,7 +396,7 @@ Xrm.Attributes.Attribute.getUserPrivilege #### Defined in -[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621) +[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621) ___ @@ -414,7 +414,7 @@ Xrm.Attributes.Attribute.getValue #### Defined in -[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630) +[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630) ___ @@ -442,7 +442,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809) +[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809) ___ @@ -466,7 +466,7 @@ Xrm.Attributes.Attribute.removeOnChange #### Defined in -[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624) +[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624) ___ @@ -488,7 +488,7 @@ Sets the state of the control to either enabled, or disabled. #### Defined in -[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699) +[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699) ___ @@ -513,7 +513,7 @@ Xrm.Attributes.Attribute.setIsValid #### Defined in -[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633) +[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633) ___ @@ -543,7 +543,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669) +[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669) ___ @@ -565,7 +565,7 @@ Sets the required level. #### Defined in -[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727) +[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727) ___ @@ -591,7 +591,7 @@ Xrm.Attributes.Attribute.setRequiredLevel #### Defined in -[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712) +[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712) ___ @@ -615,7 +615,7 @@ Xrm.Attributes.Attribute.setSubmitMode #### Defined in -[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627) +[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627) ___ @@ -639,7 +639,7 @@ Xrm.Attributes.Attribute.setValue #### Defined in -[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597) +[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597) ___ @@ -661,4 +661,4 @@ Sets the visibility state. #### Defined in -[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686) +[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686) diff --git a/docs/classes/XrmEx.Form.md b/docs/classes/XrmEx.Form.md index b175c18..412db2b 100644 --- a/docs/classes/XrmEx.Form.md +++ b/docs/classes/XrmEx.Form.md @@ -44,7 +44,7 @@ Represents a form in Dynamics 365. #### Defined in -[XrmEx.ts:384](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L384) +[XrmEx.ts:384](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L384) ## Properties @@ -54,7 +54,7 @@ Represents a form in Dynamics 365. #### Defined in -[XrmEx.ts:383](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L383) +[XrmEx.ts:383](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L383) ___ @@ -64,7 +64,7 @@ ___ #### Defined in -[XrmEx.ts:382](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L382) +[XrmEx.ts:382](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L382) ## Accessors @@ -80,7 +80,7 @@ Returns true if form is from type create #### Defined in -[XrmEx.ts:422](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L422) +[XrmEx.ts:422](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L422) ___ @@ -96,7 +96,7 @@ Returns true if form is not from type create #### Defined in -[XrmEx.ts:430](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L430) +[XrmEx.ts:430](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L430) ___ @@ -112,7 +112,7 @@ Returns true if form is not from type update #### Defined in -[XrmEx.ts:434](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L434) +[XrmEx.ts:434](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L434) ___ @@ -128,7 +128,7 @@ Returns true if form is from type update #### Defined in -[XrmEx.ts:426](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L426) +[XrmEx.ts:426](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L426) ___ @@ -144,7 +144,7 @@ Gets a lookup value that references the record. #### Defined in -[XrmEx.ts:394](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L394) +[XrmEx.ts:394](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L394) ___ @@ -160,7 +160,7 @@ Gets a reference to the current executio context #### Defined in -[XrmEx.ts:390](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L390) +[XrmEx.ts:390](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L390) • `Static` `set` **executionContext**(`context`): `void` @@ -178,7 +178,7 @@ Sets a reference to the current execution context #### Defined in -[XrmEx.ts:409](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L409) +[XrmEx.ts:409](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L409) ___ @@ -194,7 +194,7 @@ Gets a reference to the current form context #### Defined in -[XrmEx.ts:386](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L386) +[XrmEx.ts:386](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L386) • `Static` `set` **formContext**(`context`): `void` @@ -212,7 +212,7 @@ Sets a reference to the current form context #### Defined in -[XrmEx.ts:398](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L398) +[XrmEx.ts:398](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L398) ## Methods @@ -239,7 +239,7 @@ true if it succeeds, otherwise false. #### Defined in -[XrmEx.ts:448](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L448) +[XrmEx.ts:448](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L448) ___ @@ -263,7 +263,7 @@ Adds a handler to be called when the attribute's value is changed. #### Defined in -[XrmEx.ts:549](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L549) +[XrmEx.ts:549](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L549) ___ @@ -285,7 +285,7 @@ Adds a function to be called when form data is loaded. #### Defined in -[XrmEx.ts:526](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L526) +[XrmEx.ts:526](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L526) ___ @@ -315,7 +315,7 @@ Added in 9.2 #### Defined in -[XrmEx.ts:503](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L503) +[XrmEx.ts:503](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L503) ___ @@ -337,7 +337,7 @@ Adds a handler to be called when the record is saved. #### Defined in -[XrmEx.ts:478](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L478) +[XrmEx.ts:478](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L478) ___ @@ -361,4 +361,4 @@ True if it succeeds, otherwise false. #### Defined in -[XrmEx.ts:468](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L468) +[XrmEx.ts:468](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L468) diff --git a/docs/classes/XrmEx.GridControl.md b/docs/classes/XrmEx.GridControl.md index 79a7906..950daf4 100644 --- a/docs/classes/XrmEx.GridControl.md +++ b/docs/classes/XrmEx.GridControl.md @@ -60,7 +60,7 @@ #### Defined in -[XrmEx.ts:1392](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1392) +[XrmEx.ts:1392](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1392) ## Properties @@ -70,7 +70,7 @@ #### Defined in -[XrmEx.ts:1390](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1390) +[XrmEx.ts:1390](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1390) ___ @@ -80,7 +80,7 @@ ___ #### Defined in -[XrmEx.ts:1391](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1391) +[XrmEx.ts:1391](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1391) ## Accessors @@ -94,7 +94,7 @@ ___ #### Defined in -[XrmEx.ts:1402](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1402) +[XrmEx.ts:1402](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1402) ___ @@ -108,7 +108,7 @@ ___ #### Defined in -[XrmEx.ts:1395](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1395) +[XrmEx.ts:1395](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1395) ## Methods @@ -132,7 +132,7 @@ Xrm.Controls.GridControl.addOnLoad #### Defined in -[XrmEx.ts:1405](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1405) +[XrmEx.ts:1405](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1405) ___ @@ -150,7 +150,7 @@ Xrm.Controls.GridControl.getContextType #### Defined in -[XrmEx.ts:1408](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1408) +[XrmEx.ts:1408](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1408) ___ @@ -168,7 +168,7 @@ Xrm.Controls.GridControl.getControlType #### Defined in -[XrmEx.ts:1441](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1441) +[XrmEx.ts:1441](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1441) ___ @@ -186,7 +186,7 @@ Xrm.Controls.GridControl.getEntityName #### Defined in -[XrmEx.ts:1411](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1411) +[XrmEx.ts:1411](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1411) ___ @@ -204,7 +204,7 @@ Xrm.Controls.GridControl.getFetchXml #### Defined in -[XrmEx.ts:1414](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1414) +[XrmEx.ts:1414](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1414) ___ @@ -222,7 +222,7 @@ Xrm.Controls.GridControl.getGrid #### Defined in -[XrmEx.ts:1417](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1417) +[XrmEx.ts:1417](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1417) ___ @@ -240,7 +240,7 @@ Xrm.Controls.GridControl.getLabel #### Defined in -[XrmEx.ts:1450](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1450) +[XrmEx.ts:1450](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1450) ___ @@ -258,7 +258,7 @@ Xrm.Controls.GridControl.getName #### Defined in -[XrmEx.ts:1444](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1444) +[XrmEx.ts:1444](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1444) ___ @@ -276,7 +276,7 @@ Xrm.Controls.GridControl.getParent #### Defined in -[XrmEx.ts:1447](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1447) +[XrmEx.ts:1447](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1447) ___ @@ -294,7 +294,7 @@ Xrm.Controls.GridControl.getRelationship #### Defined in -[XrmEx.ts:1420](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1420) +[XrmEx.ts:1420](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1420) ___ @@ -318,7 +318,7 @@ Xrm.Controls.GridControl.getUrl #### Defined in -[XrmEx.ts:1423](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1423) +[XrmEx.ts:1423](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1423) ___ @@ -336,7 +336,7 @@ Xrm.Controls.GridControl.getViewSelector #### Defined in -[XrmEx.ts:1426](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1426) +[XrmEx.ts:1426](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1426) ___ @@ -354,7 +354,7 @@ Xrm.Controls.GridControl.getVisible #### Defined in -[XrmEx.ts:1456](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1456) +[XrmEx.ts:1456](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1456) ___ @@ -372,7 +372,7 @@ Xrm.Controls.GridControl.openRelatedGrid #### Defined in -[XrmEx.ts:1429](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1429) +[XrmEx.ts:1429](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1429) ___ @@ -390,7 +390,7 @@ Xrm.Controls.GridControl.refresh #### Defined in -[XrmEx.ts:1432](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1432) +[XrmEx.ts:1432](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1432) ___ @@ -408,7 +408,7 @@ Xrm.Controls.GridControl.refreshRibbon #### Defined in -[XrmEx.ts:1435](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1435) +[XrmEx.ts:1435](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1435) ___ @@ -432,7 +432,7 @@ Xrm.Controls.GridControl.removeOnLoad #### Defined in -[XrmEx.ts:1438](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1438) +[XrmEx.ts:1438](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1438) ___ @@ -456,7 +456,7 @@ Xrm.Controls.GridControl.setLabel #### Defined in -[XrmEx.ts:1453](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1453) +[XrmEx.ts:1453](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1453) ___ @@ -480,4 +480,4 @@ Xrm.Controls.GridControl.setVisible #### Defined in -[XrmEx.ts:1459](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1459) +[XrmEx.ts:1459](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1459) diff --git a/docs/classes/XrmEx.LookupField.md b/docs/classes/XrmEx.LookupField.md index f9c773c..7ae4103 100644 --- a/docs/classes/XrmEx.LookupField.md +++ b/docs/classes/XrmEx.LookupField.md @@ -87,7 +87,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:999](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L999) +[XrmEx.ts:999](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L999) ## Properties @@ -101,7 +101,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584) +[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584) ___ @@ -115,7 +115,7 @@ ___ #### Defined in -[XrmEx.ts:997](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L997) +[XrmEx.ts:997](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L997) ___ @@ -125,7 +125,7 @@ ___ #### Defined in -[XrmEx.ts:998](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L998) +[XrmEx.ts:998](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L998) ___ @@ -139,7 +139,7 @@ ___ #### Defined in -[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582) +[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582) ## Accessors @@ -157,7 +157,7 @@ Field.Attribute #### Defined in -[XrmEx.ts:1005](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1005) +[XrmEx.ts:1005](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1005) ___ @@ -173,7 +173,7 @@ Gets the entityType of the first lookup value #### Defined in -[XrmEx.ts:1020](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1020) +[XrmEx.ts:1020](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1020) ___ @@ -189,7 +189,7 @@ Gets the formatted value of the first lookup value #### Defined in -[XrmEx.ts:1026](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1026) +[XrmEx.ts:1026](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1026) ___ @@ -205,7 +205,7 @@ Gets the id of the first lookup value #### Defined in -[XrmEx.ts:1014](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1014) +[XrmEx.ts:1014](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1014) ___ @@ -227,7 +227,7 @@ Field.Value #### Defined in -[XrmEx.ts:1029](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1029) +[XrmEx.ts:1029](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1029) • `set` **Value**(`value`): `void` @@ -247,7 +247,7 @@ Field.Value #### Defined in -[XrmEx.ts:1032](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1032) +[XrmEx.ts:1032](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1032) ___ @@ -269,7 +269,7 @@ Field.controls #### Defined in -[XrmEx.ts:1010](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1010) +[XrmEx.ts:1010](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1010) ## Methods @@ -298,7 +298,7 @@ Displays an error or recommendation notification for a control, and lets you spe #### Defined in -[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778) +[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778) ___ @@ -328,7 +328,7 @@ Xrm.Attributes.LookupAttribute.addOnChange #### Defined in -[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750) +[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750) ___ @@ -364,7 +364,7 @@ Example filter: #### Defined in -[XrmEx.ts:1105](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1105) +[XrmEx.ts:1105](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1105) ___ @@ -405,7 +405,7 @@ Example fetchXml: #### Defined in -[XrmEx.ts:1138](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1138) +[XrmEx.ts:1138](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1138) ___ @@ -421,7 +421,7 @@ Removes all filters set on the current lookup attribute by using addPreFilterToL #### Defined in -[XrmEx.ts:1173](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1173) +[XrmEx.ts:1173](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1173) ___ @@ -445,7 +445,7 @@ Xrm.Attributes.LookupAttribute.fireOnChange #### Defined in -[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737) +[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737) ___ @@ -467,7 +467,7 @@ Xrm.Attributes.LookupAttribute.getAttributeType #### Defined in -[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L600) +[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L600) ___ @@ -489,7 +489,7 @@ Xrm.Attributes.LookupAttribute.getFormat #### Defined in -[XrmEx.ts:603](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L603) +[XrmEx.ts:603](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L603) ___ @@ -511,7 +511,7 @@ Xrm.Attributes.LookupAttribute.getIsDirty #### Defined in -[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606) +[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606) ___ @@ -529,7 +529,7 @@ Xrm.Attributes.LookupAttribute.getIsPartyList #### Defined in -[XrmEx.ts:1002](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1002) +[XrmEx.ts:1002](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1002) ___ @@ -551,7 +551,7 @@ Xrm.Attributes.LookupAttribute.getName #### Defined in -[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609) +[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609) ___ @@ -573,7 +573,7 @@ Xrm.Attributes.LookupAttribute.getParent #### Defined in -[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612) +[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612) ___ @@ -595,7 +595,7 @@ Xrm.Attributes.LookupAttribute.getRequiredLevel #### Defined in -[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615) +[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615) ___ @@ -617,7 +617,7 @@ Xrm.Attributes.LookupAttribute.getSubmitMode #### Defined in -[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618) +[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618) ___ @@ -639,7 +639,7 @@ Xrm.Attributes.LookupAttribute.getUserPrivilege #### Defined in -[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621) +[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621) ___ @@ -661,7 +661,7 @@ Xrm.Attributes.LookupAttribute.getValue #### Defined in -[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630) +[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630) ___ @@ -693,7 +693,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809) +[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809) ___ @@ -721,7 +721,7 @@ Xrm.Attributes.LookupAttribute.removeOnChange #### Defined in -[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624) +[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624) ___ @@ -756,7 +756,7 @@ On success, returns a promise containing a JSON object with the retrieved attrib #### Defined in -[XrmEx.ts:1082](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1082) +[XrmEx.ts:1082](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1082) ___ @@ -782,7 +782,7 @@ Sets the state of the control to either enabled, or disabled. #### Defined in -[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699) +[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699) ___ @@ -811,7 +811,7 @@ Xrm.Attributes.LookupAttribute.setIsValid #### Defined in -[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633) +[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633) ___ @@ -836,7 +836,7 @@ Sets the value of a lookup #### Defined in -[XrmEx.ts:1042](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1042) +[XrmEx.ts:1042](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1042) ___ @@ -870,7 +870,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669) +[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669) ___ @@ -896,7 +896,7 @@ Sets the required level. #### Defined in -[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727) +[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727) ___ @@ -926,7 +926,7 @@ Xrm.Attributes.LookupAttribute.setRequiredLevel #### Defined in -[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712) +[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712) ___ @@ -954,7 +954,7 @@ Xrm.Attributes.LookupAttribute.setSubmitMode #### Defined in -[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627) +[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627) ___ @@ -982,7 +982,7 @@ Xrm.Attributes.LookupAttribute.setValue #### Defined in -[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597) +[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597) ___ @@ -1008,4 +1008,4 @@ Sets the visibility state. #### Defined in -[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686) +[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686) diff --git a/docs/classes/XrmEx.MultiSelectOptionSetField.md b/docs/classes/XrmEx.MultiSelectOptionSetField.md index a556be3..56c4893 100644 --- a/docs/classes/XrmEx.MultiSelectOptionSetField.md +++ b/docs/classes/XrmEx.MultiSelectOptionSetField.md @@ -96,7 +96,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:945](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L945) +[XrmEx.ts:945](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L945) ## Properties @@ -110,7 +110,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584) +[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584) ___ @@ -120,7 +120,7 @@ ___ #### Defined in -[XrmEx.ts:944](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L944) +[XrmEx.ts:944](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L944) ___ @@ -134,7 +134,7 @@ ___ #### Defined in -[XrmEx.ts:943](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L943) +[XrmEx.ts:943](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L943) ___ @@ -148,7 +148,7 @@ ___ #### Defined in -[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582) +[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582) ## Accessors @@ -166,7 +166,7 @@ Field.Attribute #### Defined in -[XrmEx.ts:971](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L971) +[XrmEx.ts:971](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L971) ___ @@ -188,7 +188,7 @@ Field.Value #### Defined in -[XrmEx.ts:979](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L979) +[XrmEx.ts:979](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L979) • `set` **Value**(`value`): `void` @@ -208,7 +208,7 @@ Field.Value #### Defined in -[XrmEx.ts:982](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L982) +[XrmEx.ts:982](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L982) ___ @@ -230,7 +230,7 @@ Field.controls #### Defined in -[XrmEx.ts:976](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L976) +[XrmEx.ts:976](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L976) ## Methods @@ -259,7 +259,7 @@ Displays an error or recommendation notification for a control, and lets you spe #### Defined in -[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778) +[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778) ___ @@ -289,7 +289,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.addOnChange #### Defined in -[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750) +[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750) ___ @@ -313,7 +313,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.fireOnChange #### Defined in -[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737) +[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737) ___ @@ -335,7 +335,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getAttributeType #### Defined in -[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L600) +[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L600) ___ @@ -357,7 +357,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getFormat #### Defined in -[XrmEx.ts:949](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L949) +[XrmEx.ts:949](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L949) ___ @@ -375,7 +375,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getInitialValue #### Defined in -[XrmEx.ts:968](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L968) +[XrmEx.ts:968](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L968) ___ @@ -397,7 +397,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getIsDirty #### Defined in -[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606) +[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606) ___ @@ -419,7 +419,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getName #### Defined in -[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609) +[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609) ___ @@ -443,7 +443,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getOption #### Defined in -[XrmEx.ts:952](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L952) +[XrmEx.ts:952](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L952) ___ @@ -461,7 +461,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getOptions #### Defined in -[XrmEx.ts:959](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L959) +[XrmEx.ts:959](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L959) ___ @@ -483,7 +483,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getParent #### Defined in -[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612) +[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612) ___ @@ -505,7 +505,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getRequiredLevel #### Defined in -[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615) +[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615) ___ @@ -523,7 +523,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getSelectedOption #### Defined in -[XrmEx.ts:962](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L962) +[XrmEx.ts:962](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L962) ___ @@ -545,7 +545,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getSubmitMode #### Defined in -[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618) +[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618) ___ @@ -563,7 +563,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getText #### Defined in -[XrmEx.ts:965](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L965) +[XrmEx.ts:965](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L965) ___ @@ -585,7 +585,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getUserPrivilege #### Defined in -[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621) +[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621) ___ @@ -607,7 +607,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getValue #### Defined in -[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630) +[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630) ___ @@ -639,7 +639,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809) +[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809) ___ @@ -667,7 +667,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.removeOnChange #### Defined in -[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624) +[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624) ___ @@ -693,7 +693,7 @@ Sets the state of the control to either enabled, or disabled. #### Defined in -[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699) +[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699) ___ @@ -722,7 +722,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.setIsValid #### Defined in -[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633) +[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633) ___ @@ -756,7 +756,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669) +[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669) ___ @@ -782,7 +782,7 @@ Sets the required level. #### Defined in -[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727) +[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727) ___ @@ -812,7 +812,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.setRequiredLevel #### Defined in -[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712) +[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712) ___ @@ -840,7 +840,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.setSubmitMode #### Defined in -[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627) +[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627) ___ @@ -868,7 +868,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.setValue #### Defined in -[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597) +[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597) ___ @@ -894,4 +894,4 @@ Sets the visibility state. #### Defined in -[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686) +[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686) diff --git a/docs/classes/XrmEx.NumberField.md b/docs/classes/XrmEx.NumberField.md index 405d029..1555897 100644 --- a/docs/classes/XrmEx.NumberField.md +++ b/docs/classes/XrmEx.NumberField.md @@ -81,7 +81,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:854](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L854) +[XrmEx.ts:854](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L854) ## Properties @@ -95,7 +95,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584) +[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584) ___ @@ -109,7 +109,7 @@ ___ #### Defined in -[XrmEx.ts:853](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L853) +[XrmEx.ts:853](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L853) ___ @@ -123,7 +123,7 @@ ___ #### Defined in -[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582) +[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582) ## Accessors @@ -141,7 +141,7 @@ Field.Attribute #### Defined in -[XrmEx.ts:872](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L872) +[XrmEx.ts:872](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L872) ___ @@ -163,7 +163,7 @@ Field.Value #### Defined in -[XrmEx.ts:880](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L880) +[XrmEx.ts:880](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L880) • `set` **Value**(`value`): `void` @@ -183,7 +183,7 @@ Field.Value #### Defined in -[XrmEx.ts:883](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L883) +[XrmEx.ts:883](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L883) ___ @@ -205,7 +205,7 @@ Field.controls #### Defined in -[XrmEx.ts:877](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L877) +[XrmEx.ts:877](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L877) ## Methods @@ -234,7 +234,7 @@ Displays an error or recommendation notification for a control, and lets you spe #### Defined in -[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778) +[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778) ___ @@ -264,7 +264,7 @@ Xrm.Attributes.NumberAttribute.addOnChange #### Defined in -[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750) +[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750) ___ @@ -288,7 +288,7 @@ Xrm.Attributes.NumberAttribute.fireOnChange #### Defined in -[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737) +[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737) ___ @@ -310,7 +310,7 @@ Xrm.Attributes.NumberAttribute.getAttributeType #### Defined in -[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L600) +[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L600) ___ @@ -332,7 +332,7 @@ Xrm.Attributes.NumberAttribute.getFormat #### Defined in -[XrmEx.ts:857](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L857) +[XrmEx.ts:857](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L857) ___ @@ -354,7 +354,7 @@ Xrm.Attributes.NumberAttribute.getIsDirty #### Defined in -[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606) +[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606) ___ @@ -372,7 +372,7 @@ Xrm.Attributes.NumberAttribute.getMax #### Defined in -[XrmEx.ts:860](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L860) +[XrmEx.ts:860](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L860) ___ @@ -390,7 +390,7 @@ Xrm.Attributes.NumberAttribute.getMin #### Defined in -[XrmEx.ts:863](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L863) +[XrmEx.ts:863](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L863) ___ @@ -412,7 +412,7 @@ Xrm.Attributes.NumberAttribute.getName #### Defined in -[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609) +[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609) ___ @@ -434,7 +434,7 @@ Xrm.Attributes.NumberAttribute.getParent #### Defined in -[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612) +[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612) ___ @@ -452,7 +452,7 @@ Xrm.Attributes.NumberAttribute.getPrecision #### Defined in -[XrmEx.ts:866](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L866) +[XrmEx.ts:866](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L866) ___ @@ -474,7 +474,7 @@ Xrm.Attributes.NumberAttribute.getRequiredLevel #### Defined in -[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615) +[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615) ___ @@ -496,7 +496,7 @@ Xrm.Attributes.NumberAttribute.getSubmitMode #### Defined in -[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618) +[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618) ___ @@ -518,7 +518,7 @@ Xrm.Attributes.NumberAttribute.getUserPrivilege #### Defined in -[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621) +[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621) ___ @@ -540,7 +540,7 @@ Xrm.Attributes.NumberAttribute.getValue #### Defined in -[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630) +[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630) ___ @@ -572,7 +572,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809) +[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809) ___ @@ -600,7 +600,7 @@ Xrm.Attributes.NumberAttribute.removeOnChange #### Defined in -[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624) +[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624) ___ @@ -626,7 +626,7 @@ Sets the state of the control to either enabled, or disabled. #### Defined in -[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699) +[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699) ___ @@ -655,7 +655,7 @@ Xrm.Attributes.NumberAttribute.setIsValid #### Defined in -[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633) +[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633) ___ @@ -689,7 +689,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669) +[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669) ___ @@ -713,7 +713,7 @@ Xrm.Attributes.NumberAttribute.setPrecision #### Defined in -[XrmEx.ts:869](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L869) +[XrmEx.ts:869](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L869) ___ @@ -739,7 +739,7 @@ Sets the required level. #### Defined in -[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727) +[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727) ___ @@ -769,7 +769,7 @@ Xrm.Attributes.NumberAttribute.setRequiredLevel #### Defined in -[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712) +[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712) ___ @@ -797,7 +797,7 @@ Xrm.Attributes.NumberAttribute.setSubmitMode #### Defined in -[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627) +[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627) ___ @@ -825,7 +825,7 @@ Xrm.Attributes.NumberAttribute.setValue #### Defined in -[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597) +[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597) ___ @@ -851,4 +851,4 @@ Sets the visibility state. #### Defined in -[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686) +[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686) diff --git a/docs/classes/XrmEx.OptionsetField.md b/docs/classes/XrmEx.OptionsetField.md index 7f49a42..9f9cf0e 100644 --- a/docs/classes/XrmEx.OptionsetField.md +++ b/docs/classes/XrmEx.OptionsetField.md @@ -101,7 +101,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:1198](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1198) +[XrmEx.ts:1198](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1198) ## Properties @@ -115,7 +115,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584) +[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584) ___ @@ -125,7 +125,7 @@ ___ #### Defined in -[XrmEx.ts:1197](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1197) +[XrmEx.ts:1197](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1197) ___ @@ -139,7 +139,7 @@ ___ #### Defined in -[XrmEx.ts:1195](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1195) +[XrmEx.ts:1195](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1195) ___ @@ -149,7 +149,7 @@ ___ #### Defined in -[XrmEx.ts:1196](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1196) +[XrmEx.ts:1196](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1196) ___ @@ -163,7 +163,7 @@ ___ #### Defined in -[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582) +[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582) ## Accessors @@ -181,7 +181,7 @@ Field.Attribute #### Defined in -[XrmEx.ts:1224](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1224) +[XrmEx.ts:1224](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1224) ___ @@ -203,7 +203,7 @@ Field.Value #### Defined in -[XrmEx.ts:1237](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1237) +[XrmEx.ts:1237](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1237) • `set` **Value**(`value`): `void` @@ -223,7 +223,7 @@ Field.Value #### Defined in -[XrmEx.ts:1240](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1240) +[XrmEx.ts:1240](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1240) ___ @@ -237,7 +237,7 @@ ___ #### Defined in -[XrmEx.ts:1232](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1232) +[XrmEx.ts:1232](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1232) ___ @@ -259,7 +259,7 @@ Field.controls #### Defined in -[XrmEx.ts:1229](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1229) +[XrmEx.ts:1229](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1229) ## Methods @@ -288,7 +288,7 @@ Displays an error or recommendation notification for a control, and lets you spe #### Defined in -[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778) +[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778) ___ @@ -318,7 +318,7 @@ Xrm.Attributes.OptionSetAttribute.addOnChange #### Defined in -[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750) +[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750) ___ @@ -346,7 +346,7 @@ This method does not check that the values within the options you add are valid. #### Defined in -[XrmEx.ts:1253](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1253) +[XrmEx.ts:1253](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1253) ___ @@ -362,7 +362,7 @@ Clears all options. #### Defined in -[XrmEx.ts:1291](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1291) +[XrmEx.ts:1291](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1291) ___ @@ -386,7 +386,7 @@ Xrm.Attributes.OptionSetAttribute.fireOnChange #### Defined in -[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737) +[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737) ___ @@ -408,7 +408,7 @@ Xrm.Attributes.OptionSetAttribute.getAttributeType #### Defined in -[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L600) +[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L600) ___ @@ -430,7 +430,7 @@ Xrm.Attributes.OptionSetAttribute.getFormat #### Defined in -[XrmEx.ts:1202](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1202) +[XrmEx.ts:1202](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1202) ___ @@ -448,7 +448,7 @@ Xrm.Attributes.OptionSetAttribute.getInitialValue #### Defined in -[XrmEx.ts:1221](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1221) +[XrmEx.ts:1221](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1221) ___ @@ -470,7 +470,7 @@ Xrm.Attributes.OptionSetAttribute.getIsDirty #### Defined in -[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606) +[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606) ___ @@ -492,7 +492,7 @@ Xrm.Attributes.OptionSetAttribute.getName #### Defined in -[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609) +[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609) ___ @@ -516,7 +516,7 @@ Xrm.Attributes.OptionSetAttribute.getOption #### Defined in -[XrmEx.ts:1205](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1205) +[XrmEx.ts:1205](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1205) ___ @@ -534,7 +534,7 @@ Xrm.Attributes.OptionSetAttribute.getOptions #### Defined in -[XrmEx.ts:1212](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1212) +[XrmEx.ts:1212](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1212) ___ @@ -556,7 +556,7 @@ Xrm.Attributes.OptionSetAttribute.getParent #### Defined in -[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612) +[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612) ___ @@ -578,7 +578,7 @@ Xrm.Attributes.OptionSetAttribute.getRequiredLevel #### Defined in -[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615) +[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615) ___ @@ -596,7 +596,7 @@ Xrm.Attributes.OptionSetAttribute.getSelectedOption #### Defined in -[XrmEx.ts:1215](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1215) +[XrmEx.ts:1215](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1215) ___ @@ -618,7 +618,7 @@ Xrm.Attributes.OptionSetAttribute.getSubmitMode #### Defined in -[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618) +[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618) ___ @@ -636,7 +636,7 @@ Xrm.Attributes.OptionSetAttribute.getText #### Defined in -[XrmEx.ts:1218](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1218) +[XrmEx.ts:1218](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1218) ___ @@ -658,7 +658,7 @@ Xrm.Attributes.OptionSetAttribute.getUserPrivilege #### Defined in -[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621) +[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621) ___ @@ -680,7 +680,7 @@ Xrm.Attributes.OptionSetAttribute.getValue #### Defined in -[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630) +[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630) ___ @@ -712,7 +712,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809) +[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809) ___ @@ -740,7 +740,7 @@ Xrm.Attributes.OptionSetAttribute.removeOnChange #### Defined in -[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624) +[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624) ___ @@ -762,7 +762,7 @@ Removes the option matching the value. #### Defined in -[XrmEx.ts:1273](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1273) +[XrmEx.ts:1273](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1273) ___ @@ -788,7 +788,7 @@ Sets the state of the control to either enabled, or disabled. #### Defined in -[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699) +[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699) ___ @@ -817,7 +817,7 @@ Xrm.Attributes.OptionSetAttribute.setIsValid #### Defined in -[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633) +[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633) ___ @@ -851,7 +851,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669) +[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669) ___ @@ -877,7 +877,7 @@ Sets the required level. #### Defined in -[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727) +[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727) ___ @@ -907,7 +907,7 @@ Xrm.Attributes.OptionSetAttribute.setRequiredLevel #### Defined in -[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712) +[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712) ___ @@ -935,7 +935,7 @@ Xrm.Attributes.OptionSetAttribute.setSubmitMode #### Defined in -[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627) +[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627) ___ @@ -963,7 +963,7 @@ Xrm.Attributes.OptionSetAttribute.setValue #### Defined in -[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597) +[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597) ___ @@ -989,4 +989,4 @@ Sets the visibility state. #### Defined in -[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686) +[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686) diff --git a/docs/classes/XrmEx.Section.md b/docs/classes/XrmEx.Section.md index 891ca76..c7c8557 100644 --- a/docs/classes/XrmEx.Section.md +++ b/docs/classes/XrmEx.Section.md @@ -48,7 +48,7 @@ #### Defined in -[XrmEx.ts:1304](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1304) +[XrmEx.ts:1304](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1304) ## Properties @@ -58,7 +58,7 @@ #### Defined in -[XrmEx.ts:1301](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1301) +[XrmEx.ts:1301](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1301) ___ @@ -68,7 +68,7 @@ ___ #### Defined in -[XrmEx.ts:1302](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1302) +[XrmEx.ts:1302](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1302) ___ @@ -82,7 +82,7 @@ Xrm.Controls.Section.controls #### Defined in -[XrmEx.ts:1320](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1320) +[XrmEx.ts:1320](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1320) ___ @@ -92,7 +92,7 @@ ___ #### Defined in -[XrmEx.ts:1303](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1303) +[XrmEx.ts:1303](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1303) ## Accessors @@ -106,7 +106,7 @@ ___ #### Defined in -[XrmEx.ts:1307](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1307) +[XrmEx.ts:1307](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1307) ## Methods @@ -124,7 +124,7 @@ Xrm.Controls.Section.getLabel #### Defined in -[XrmEx.ts:1327](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1327) +[XrmEx.ts:1327](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1327) ___ @@ -142,7 +142,7 @@ Xrm.Controls.Section.getName #### Defined in -[XrmEx.ts:1314](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1314) +[XrmEx.ts:1314](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1314) ___ @@ -160,7 +160,7 @@ Xrm.Controls.Section.getParent #### Defined in -[XrmEx.ts:1317](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1317) +[XrmEx.ts:1317](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1317) ___ @@ -178,7 +178,7 @@ Xrm.Controls.Section.getVisible #### Defined in -[XrmEx.ts:1324](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1324) +[XrmEx.ts:1324](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1324) ___ @@ -202,7 +202,7 @@ Xrm.Controls.Section.setLabel #### Defined in -[XrmEx.ts:1330](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1330) +[XrmEx.ts:1330](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1330) ___ @@ -226,4 +226,4 @@ Xrm.Controls.Section.setVisible #### Defined in -[XrmEx.ts:1321](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1321) +[XrmEx.ts:1321](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1321) diff --git a/docs/classes/XrmEx.Tab.md b/docs/classes/XrmEx.Tab.md index cf399a0..a95d685 100644 --- a/docs/classes/XrmEx.Tab.md +++ b/docs/classes/XrmEx.Tab.md @@ -66,7 +66,7 @@ #### Defined in -[XrmEx.ts:1341](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1341) +[XrmEx.ts:1341](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1341) ## Properties @@ -76,7 +76,7 @@ #### Defined in -[XrmEx.ts:1338](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1338) +[XrmEx.ts:1338](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1338) ___ @@ -86,7 +86,7 @@ ___ #### Defined in -[XrmEx.ts:1340](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1340) +[XrmEx.ts:1340](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1340) ___ @@ -96,7 +96,7 @@ ___ #### Defined in -[XrmEx.ts:1339](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1339) +[XrmEx.ts:1339](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1339) ___ @@ -110,7 +110,7 @@ Xrm.Controls.Tab.sections #### Defined in -[XrmEx.ts:1348](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1348) +[XrmEx.ts:1348](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1348) ## Accessors @@ -124,7 +124,7 @@ Xrm.Controls.Tab.sections #### Defined in -[XrmEx.ts:1350](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1350) +[XrmEx.ts:1350](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1350) ## Methods @@ -148,7 +148,7 @@ Xrm.Controls.Tab.addTabStateChange #### Defined in -[XrmEx.ts:1355](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1355) +[XrmEx.ts:1355](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1355) ___ @@ -166,7 +166,7 @@ Xrm.Controls.Tab.getDisplayState #### Defined in -[XrmEx.ts:1358](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1358) +[XrmEx.ts:1358](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1358) ___ @@ -184,7 +184,7 @@ Xrm.Controls.Tab.getLabel #### Defined in -[XrmEx.ts:1379](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1379) +[XrmEx.ts:1379](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1379) ___ @@ -202,7 +202,7 @@ Xrm.Controls.Tab.getName #### Defined in -[XrmEx.ts:1361](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1361) +[XrmEx.ts:1361](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1361) ___ @@ -220,7 +220,7 @@ Xrm.Controls.Tab.getParent #### Defined in -[XrmEx.ts:1364](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1364) +[XrmEx.ts:1364](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1364) ___ @@ -238,7 +238,7 @@ Xrm.Controls.Tab.getVisible #### Defined in -[XrmEx.ts:1376](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1376) +[XrmEx.ts:1376](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1376) ___ @@ -262,7 +262,7 @@ Xrm.Controls.Tab.removeTabStateChange #### Defined in -[XrmEx.ts:1367](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1367) +[XrmEx.ts:1367](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1367) ___ @@ -286,7 +286,7 @@ Xrm.Controls.Tab.setDisplayState #### Defined in -[XrmEx.ts:1370](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1370) +[XrmEx.ts:1370](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1370) ___ @@ -304,7 +304,7 @@ Xrm.Controls.Tab.setFocus #### Defined in -[XrmEx.ts:1385](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1385) +[XrmEx.ts:1385](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1385) ___ @@ -328,7 +328,7 @@ Xrm.Controls.Tab.setLabel #### Defined in -[XrmEx.ts:1382](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1382) +[XrmEx.ts:1382](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1382) ___ @@ -352,4 +352,4 @@ Xrm.Controls.Tab.setVisible #### Defined in -[XrmEx.ts:1373](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1373) +[XrmEx.ts:1373](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1373) diff --git a/docs/classes/XrmEx.TextField.md b/docs/classes/XrmEx.TextField.md index 19c3ae4..a8a7826 100644 --- a/docs/classes/XrmEx.TextField.md +++ b/docs/classes/XrmEx.TextField.md @@ -78,7 +78,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:825](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L825) +[XrmEx.ts:825](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L825) ## Properties @@ -92,7 +92,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584) +[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584) ___ @@ -106,7 +106,7 @@ ___ #### Defined in -[XrmEx.ts:824](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L824) +[XrmEx.ts:824](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L824) ___ @@ -120,7 +120,7 @@ ___ #### Defined in -[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582) +[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582) ## Accessors @@ -138,7 +138,7 @@ Field.Attribute #### Defined in -[XrmEx.ts:834](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L834) +[XrmEx.ts:834](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L834) ___ @@ -160,7 +160,7 @@ Field.Value #### Defined in -[XrmEx.ts:842](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L842) +[XrmEx.ts:842](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L842) • `set` **Value**(`value`): `void` @@ -180,7 +180,7 @@ Field.Value #### Defined in -[XrmEx.ts:845](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L845) +[XrmEx.ts:845](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L845) ___ @@ -202,7 +202,7 @@ Field.controls #### Defined in -[XrmEx.ts:839](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L839) +[XrmEx.ts:839](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L839) ## Methods @@ -231,7 +231,7 @@ Displays an error or recommendation notification for a control, and lets you spe #### Defined in -[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778) +[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778) ___ @@ -261,7 +261,7 @@ Xrm.Attributes.StringAttribute.addOnChange #### Defined in -[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750) +[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750) ___ @@ -285,7 +285,7 @@ Xrm.Attributes.StringAttribute.fireOnChange #### Defined in -[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737) +[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737) ___ @@ -307,7 +307,7 @@ Xrm.Attributes.StringAttribute.getAttributeType #### Defined in -[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L600) +[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L600) ___ @@ -329,7 +329,7 @@ Xrm.Attributes.StringAttribute.getFormat #### Defined in -[XrmEx.ts:831](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L831) +[XrmEx.ts:831](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L831) ___ @@ -351,7 +351,7 @@ Xrm.Attributes.StringAttribute.getIsDirty #### Defined in -[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606) +[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606) ___ @@ -369,7 +369,7 @@ Xrm.Attributes.StringAttribute.getMaxLength #### Defined in -[XrmEx.ts:828](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L828) +[XrmEx.ts:828](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L828) ___ @@ -391,7 +391,7 @@ Xrm.Attributes.StringAttribute.getName #### Defined in -[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609) +[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609) ___ @@ -413,7 +413,7 @@ Xrm.Attributes.StringAttribute.getParent #### Defined in -[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612) +[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612) ___ @@ -435,7 +435,7 @@ Xrm.Attributes.StringAttribute.getRequiredLevel #### Defined in -[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615) +[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615) ___ @@ -457,7 +457,7 @@ Xrm.Attributes.StringAttribute.getSubmitMode #### Defined in -[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618) +[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618) ___ @@ -479,7 +479,7 @@ Xrm.Attributes.StringAttribute.getUserPrivilege #### Defined in -[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621) +[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621) ___ @@ -501,7 +501,7 @@ Xrm.Attributes.StringAttribute.getValue #### Defined in -[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630) +[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630) ___ @@ -533,7 +533,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809) +[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809) ___ @@ -561,7 +561,7 @@ Xrm.Attributes.StringAttribute.removeOnChange #### Defined in -[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624) +[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624) ___ @@ -587,7 +587,7 @@ Sets the state of the control to either enabled, or disabled. #### Defined in -[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699) +[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699) ___ @@ -616,7 +616,7 @@ Xrm.Attributes.StringAttribute.setIsValid #### Defined in -[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633) +[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633) ___ @@ -650,7 +650,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669) +[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669) ___ @@ -676,7 +676,7 @@ Sets the required level. #### Defined in -[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727) +[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727) ___ @@ -706,7 +706,7 @@ Xrm.Attributes.StringAttribute.setRequiredLevel #### Defined in -[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712) +[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712) ___ @@ -734,7 +734,7 @@ Xrm.Attributes.StringAttribute.setSubmitMode #### Defined in -[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627) +[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627) ___ @@ -762,7 +762,7 @@ Xrm.Attributes.StringAttribute.setValue #### Defined in -[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597) +[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597) ___ @@ -788,4 +788,4 @@ Sets the visibility state. #### Defined in -[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686) +[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686) diff --git a/docs/modules.md b/docs/modules.md index 8f345fc..def9aad 100644 --- a/docs/modules.md +++ b/docs/modules.md @@ -30,7 +30,7 @@ Represents a reference to an entity. #### Defined in -[XrmEx.ts:31](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L31) +[XrmEx.ts:31](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L31) ___ @@ -50,4 +50,4 @@ Represents a parameter for a request. #### Defined in -[XrmEx.ts:9](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L9) +[XrmEx.ts:9](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L9) diff --git a/docs/modules/XrmEx.md b/docs/modules/XrmEx.md index ae7236b..d36765b 100644 --- a/docs/modules/XrmEx.md +++ b/docs/modules/XrmEx.md @@ -56,7 +56,7 @@ Displays a notification for an app with the given message and level, and lets yo #### Defined in -[XrmEx.ts:70](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L70) +[XrmEx.ts:70](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L70) ___ @@ -82,7 +82,7 @@ Checks if the given request parameter is of a supported type and has a valid val #### Defined in -[XrmEx.ts:175](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L175) +[XrmEx.ts:175](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L175) ___ @@ -112,7 +112,7 @@ Executes an Action. #### Defined in -[XrmEx.ts:230](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L230) +[XrmEx.ts:230](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L230) ___ @@ -142,7 +142,7 @@ Executes a Function. #### Defined in -[XrmEx.ts:272](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L272) +[XrmEx.ts:272](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L272) ___ @@ -166,7 +166,7 @@ Retrieves the value of an environment variable by using its schema name as key. #### Defined in -[XrmEx.ts:113](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L113) +[XrmEx.ts:113](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L113) ___ @@ -184,7 +184,7 @@ Returns the name of the calling function. #### Defined in -[XrmEx.ts:48](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L48) +[XrmEx.ts:48](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L48) ___ @@ -208,7 +208,7 @@ Makes a GUID lowercase and removes brackets. #### Defined in -[XrmEx.ts:311](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L311) +[XrmEx.ts:311](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L311) ___ @@ -233,7 +233,7 @@ Opens a dialog with dynamic height and width based on text content. #### Defined in -[XrmEx.ts:322](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L322) +[XrmEx.ts:322](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L322) ___ @@ -257,7 +257,7 @@ Clears a notification in the app with the given unique ID. #### Defined in -[XrmEx.ts:99](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L99) +[XrmEx.ts:99](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L99) ___ @@ -283,4 +283,4 @@ Throws an error with the given error message. #### Defined in -[XrmEx.ts:41](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L41) +[XrmEx.ts:41](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L41) diff --git a/package.json b/package.json index 173045d..d66718c 100644 --- a/package.json +++ b/package.json @@ -35,13 +35,11 @@ "scripts": { "build": "npm run clean && npm run type:dts && npm run build:main && npm run format && npm run docs && npm run copy && npm run postbuild && npm run zip", "build:main": "tsc --build", - "clean": "rimraf build/dist coverage nyc_output", + "clean": "rimraf build/src coverage nyc_output", "docs": "npx typedoc --plugin typedoc-plugin-markdown --out docs src/XrmEx.ts", - "copy": "npm run copyPackage && npm run copyReadme && npm run copyEslint", - "copyPackage": "node -e \"require('fs').cpSync('./package.json', './build/package.json');\"", + "copy": "npm run copyReadme", "copyReadme": "node -e \"require('fs').cpSync('./README.md', './build/README.md');\"", - "copyEslint": "node -e \"require('fs').cpSync('./.eslintrc.cjs', './build/.eslintrc.cjs');\"", - "postbuild": "rimraf build/dist/tests", + "postbuild": "rimraf build/tests", "zip": "npm-build-zip --destination=release/ --name=xrm-ex --name_only=true", "type:dts": "tsc --emitDeclarationOnly --project tsconfig.build.json", "type:check": "tsc --noEmit", diff --git a/release/xrm-ex.zip b/release/xrm-ex.zip index 51d7d06..721068d 100644 Binary files a/release/xrm-ex.zip and b/release/xrm-ex.zip differ diff --git a/src/TemplateFunctions.ts b/src/TemplateFunctions.ts deleted file mode 100644 index 6ecc31d..0000000 --- a/src/TemplateFunctions.ts +++ /dev/null @@ -1,303 +0,0 @@ -/// - -// eslint-disable-next-line no-unused-vars -namespace Theia { - export namespace TemplateFunctions { - var formContext: Xrm.FormContext; - class Fields { - Firstname = new XrmEx.TextField("firstname"); - Lastname = new XrmEx.TextField("lastname"); - JobTitle = new XrmEx.TextField("jobtitle"); - PreferredContactMethod = new XrmEx.OptionsetField( - "preferredcontactmethodcode", - { - Any: 1, - Email: 2, - Phone: 3, - Fax: 4, - Mail: 5, - } - ); - Customer = new XrmEx.LookupField("parentcustomerid"); - BusinessPhone = new XrmEx.TextField("telephone1"); - Gender = new XrmEx.OptionsetField("gendercode"); - Email = new XrmEx.TextField("emailaddress1"); - MobilePhone = new XrmEx.TextField("mobilephone"); - Owner = new XrmEx.LookupField("ownerid"); - DoNotEmail = new XrmEx.BooleanField("donotemail"); - MaritalStatus = new XrmEx.OptionsetField("familystatuscode"); - SpousePartnerName = new XrmEx.TextField("spousesname"); - Birthday = new XrmEx.DateField("birthdate"); - } - class Tabs { - General = new XrmEx.Tab("tab1", { - Section1: new XrmEx.Section("section1"), - Section2: new XrmEx.Section("section2"), - }); - Details = new XrmEx.Tab("tab2", { - Section1: new XrmEx.Section("section1"), - Section2: new XrmEx.Section("section2"), - }); - } - class Grids { - ContactSubgrid = new XrmEx.GridControl("Test"); - } - var fields: Fields; - var tabs: Tabs; - var grids: Grids; - export async function Init( - executionContext: Xrm.FormContext | Xrm.Events.EventContext - ) { - if (!XrmEx) { - let errorMessage = - "XrmEx is not loaded. Please make sure you have XrmEx.js loaded in your form."; - console.error(errorMessage); - await Xrm.Navigation.openAlertDialog({ - title: "Error", - text: errorMessage, - }); - return; - } - XrmEx.Form.formContext = executionContext; - fields = new Fields(); - tabs = new Tabs(); - grids = new Grids(); - } - - export async function OnLoad( - executionContext: Xrm.FormContext | Xrm.Events.EventContext - ) { - await Init(executionContext); //Ensures XrmEx is only accessed after the OnLoad Event - try { - parent.window.XrmEx = XrmEx; - formContext = XrmEx.Form.formContext; - - await sample(); - //Register one or more Functions to execute OnSave - formContext.data.entity.addOnSave(sample); - //BETTER WAY - XrmEx.Form.addOnSaveEventHandler([sample]); - //Register one or more Functions to execute OnChange of multiple fields and execute it immediately - let firstname = formContext.getAttribute("firstname"); - let lastname = formContext.getAttribute("lastname"); - firstname.addOnChange(sample); - firstname.fireOnChange(); - lastname.fireOnChange(); - //BETTER WAY - XrmEx.Form.addOnChangeEventHandler( - [fields.Firstname, fields.Lastname], - [sample], - true - ); - } catch (error) { - console.error(error); - await XrmEx.openAlertDialog( - "Error", - `Error in Theia.TemplateFunctions.${XrmEx.getMethodName()}\n` + - error.message - ); - } - /** - * This Framework empowers developers to DO MORE by writing LESS CODE 👈(゚ヮ゚👈) - */ - async function sample() { - try { - //Continue only on Update Form - if (formContext.ui.getFormType() != 2) return; - //BETTER WAY - if (XrmEx.Form.IsNotUpdate) return; - - //If Firstname is empty, make it required and shows notification on the field - let firstname = formContext.getAttribute("firstname"); - if (!firstname.getValue()) { - firstname.setRequiredLevel("required"); - firstname.controls.forEach((c) => - c.setNotification("This property is required", "uniqueId") - ); - } - //BETTER WAY - if (!fields.Lastname.Value) - fields.Firstname.setRequired(true).setNotification( - "This property is required", - "uniqueId" - ); - - //If Owner has Value and Lastname does not, retrieve it's lastname and set it to Lastname - let ownerid = formContext.getAttribute("ownerid"); - let lastname = formContext.getAttribute("lastname"); - if (ownerid.getValue() && !lastname.getValue()) { - let user = await Xrm.WebApi.retrieveRecord( - ownerid.getValue()[0].entityType, - ownerid.getValue()[0].id, - "?$select=lastname" - ); - lastname.setValue(user.lastname); - } - //BETTER WAY - if (fields.Owner.Value && !fields.Lastname.Value) { - let user = await fields.Owner.retrieve("?$select=lastname"); - fields.Lastname.Value = user.lastname; - fields.Lastname.setValue(user.lastname); - } - //Set Optionset PreferredContactMethod to Email - fields.PreferredContactMethod.Value = - fields.PreferredContactMethod.Option.Email; - - //Add Lookup Filter to Customer and remove it later - let filterFunction = function filterFunction( - executionContext: Xrm.Events.EventContext - ) { - let formContext = executionContext.getFormContext(); - let customer: Xrm.Attributes.LookupAttribute = - formContext.getAttribute("parentcustomerid"); - customer.controls.forEach((c) => { - c.addCustomFilter( - ` - - ` - ); - }); - }; - let customer: Xrm.Attributes.LookupAttribute = - formContext.getAttribute("parentcustomerid"); - customer.controls.forEach((c) => c.addPreSearch(filterFunction)); - customer.controls.forEach((c) => c.removePreSearch(filterFunction)); - //BETTER WAY - fields.Customer.addPreFilterToLookup( - ` - - ` - ); - fields.Customer.clearPreFilterFromLookup(); - - fields.Lastname.setVisible(false) - .setDisabled(true) - .setRequired(false) - .setNotification("This property is required", "uniqueId"); - - //SPECIAL WAY (Go to Definition to see how to achieve this) - //Add Advanced Lookup Filter - await fields.Customer.addPreFilterToLookupAdvanced( - "contact", - "contactid", - ` - - - - - - ` - ); - - //Execute bound Action - class TestActionContactRequest { - Amount: number; - Account: any; - getMetadata() { - return { - boundParameter: "entity", - operationType: 0, - operationName: "theia_TestActionContact", - parameterTypes: { - Amount: { - typeName: "Edm.Int32", - structuralProperty: 1, - }, - Account: { - typeName: "mscrm.account", - structuralProperty: 5, - }, - entity: { - typeName: "mscrm.contact", - structuralProperty: 5, - }, - }, - }; - } - } - let testActionContactRequest = new TestActionContactRequest(); - testActionContactRequest.Amount = 5; - testActionContactRequest.Account = customer.getValue()[0]; - testActionContactRequest["entity"] = - formContext.data.entity.getEntityReference(); - let response = await Xrm.WebApi.online - .execute(testActionContactRequest) - .then(function (response) { - if (response.ok) { - return response.json().catch(() => { - return response; - }); - } - }) - .then((responseBody) => responseBody); - console.log(response); - - //BETTER WAY - let response2 = await XrmEx.executeAction( - "theia_TestActionContact", - [ - { Name: "Amount", Type: "Integer", Value: 5 }, - { - Name: "Account", - Type: "EntityReference", - Value: fields.Customer.Value[0], - }, - ], - XrmEx.Form.entityReference - ); - console.log(response2); - - //Retrieve EnvironmentVariableValue - class EnvironmentVariableRequest { - DefinitionSchemaName: string; - constructor(definitionSchemaName: string) { - this.DefinitionSchemaName = definitionSchemaName; - } - getMetadata() { - return { - boundParameter: null, - operationType: 1, - operationName: "RetrieveEnvironmentVariableValue", - parameterTypes: { - DefinitionSchemaName: { - typeName: "Edm.String", - structuralProperty: 1, - }, - }, - }; - } - } - let environmentVariableRequest = new EnvironmentVariableRequest( - "theia_Test" - ); - let value = await Xrm.WebApi.online - .execute(environmentVariableRequest) - .then(function (response) { - if (response.ok) { - return response.json().catch(() => { - return response; - }); - } - }) - .then((responseBody) => responseBody); - console.log(value); - //BETTER WAY - let value2 = await XrmEx.getEnvironmentVariableValue("theia_Test"); - console.log(value2); - - /** - * How to access Propoerties described in Microsofts Documentation - */ - /** You can access all Form Context Functions here: @see https://docs.microsoft.com/en-us/power-apps/developer/model-driven-apps/clientapi/clientapi-form-context*/ - XrmEx.Form.formContext.data.isValid(); - - /** You can access all Column Functions here: @see https://docs.microsoft.com/en-us/power-apps/developer/model-driven-apps/clientapi/reference/attributes*/ - fields.Birthday.Attribute.getIsDirty(); - } catch (error) { - console.error(error); - throw new Error(`.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - } - } -} diff --git a/tsconfig.json b/tsconfig.json index 87a0826..14daca8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,7 +13,7 @@ "target": "es2022", "moduleResolution": "Node", "rootDir": "./", - "outDir": "build/dist", + "outDir": "build", "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true,