UNPKG

rhizo-co-terraform-provider-oci

Version:

Prebuilt oci Provider for Terraform CDK (cdktf)

3,387 lines 540 kB
"use strict";
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y;
Object.defineProperty(exports, "__esModule", { value: true });
exports.IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettingsOutputReference = exports.identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettingsToHclTerraform = exports.identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettingsToTerraform = exports.IdentityDomainsAuthenticationFactorSettingTotpSettingsOutputReference = exports.identityDomainsAuthenticationFactorSettingTotpSettingsToHclTerraform = exports.identityDomainsAuthenticationFactorSettingTotpSettingsToTerraform = exports.IdentityDomainsAuthenticationFactorSettingTimeoutsOutputReference = exports.identityDomainsAuthenticationFactorSettingTimeoutsToHclTerraform = exports.identityDomainsAuthenticationFactorSettingTimeoutsToTerraform = exports.IdentityDomainsAuthenticationFactorSettingThirdPartyFactorOutputReference = exports.identityDomainsAuthenticationFactorSettingThirdPartyFactorToHclTerraform = exports.identityDomainsAuthenticationFactorSettingThirdPartyFactorToTerraform = exports.IdentityDomainsAuthenticationFactorSettingTagsList = exports.IdentityDomainsAuthenticationFactorSettingTagsOutputReference = exports.identityDomainsAuthenticationFactorSettingTagsToHclTerraform = exports.identityDomainsAuthenticationFactorSettingTagsToTerraform = exports.IdentityDomainsAuthenticationFactorSettingNotificationSettingsOutputReference = exports.identityDomainsAuthenticationFactorSettingNotificationSettingsToHclTerraform = exports.identityDomainsAuthenticationFactorSettingNotificationSettingsToTerraform = exports.IdentityDomainsAuthenticationFactorSettingIdentityStoreSettingsOutputReference = exports.identityDomainsAuthenticationFactorSettingIdentityStoreSettingsToHclTerraform = exports.identityDomainsAuthenticationFactorSettingIdentityStoreSettingsToTerraform = exports.IdentityDomainsAuthenticationFactorSettingEndpointRestrictionsOutputReference = exports.identityDomainsAuthenticationFactorSettingEndpointRestrictionsToHclTerraform = exports.identityDomainsAuthenticationFactorSettingEndpointRestrictionsToTerraform = exports.IdentityDomainsAuthenticationFactorSettingEmailSettingsOutputReference = exports.identityDomainsAuthenticationFactorSettingEmailSettingsToHclTerraform = exports.identityDomainsAuthenticationFactorSettingEmailSettingsToTerraform = exports.IdentityDomainsAuthenticationFactorSettingCompliancePolicyList = exports.IdentityDomainsAuthenticationFactorSettingCompliancePolicyOutputReference = exports.identityDomainsAuthenticationFactorSettingCompliancePolicyToHclTerraform = exports.identityDomainsAuthenticationFactorSettingCompliancePolicyToTerraform = exports.IdentityDomainsAuthenticationFactorSettingClientAppSettingsOutputReference = exports.identityDomainsAuthenticationFactorSettingClientAppSettingsToHclTerraform = exports.identityDomainsAuthenticationFactorSettingClientAppSettingsToTerraform = exports.IdentityDomainsAuthenticationFactorSettingBypassCodeSettingsOutputReference = exports.identityDomainsAuthenticationFactorSettingBypassCodeSettingsToHclTerraform = exports.identityDomainsAuthenticationFactorSettingBypassCodeSettingsToTerraform = exports.IdentityDomainsAuthenticationFactorSettingMetaList = exports.IdentityDomainsAuthenticationFactorSettingMetaOutputReference = exports.identityDomainsAuthenticationFactorSettingMetaToHclTerraform = exports.identityDomainsAuthenticationFactorSettingMetaToTerraform = exports.IdentityDomainsAuthenticationFactorSettingIdcsLastModifiedByList = exports.IdentityDomainsAuthenticationFactorSettingIdcsLastModifiedByOutputReference = exports.identityDomainsAuthenticationFactorSettingIdcsLastModifiedByToHclTerraform = exports.identityDomainsAuthenticationFactorSettingIdcsLastModifiedByToTerraform = exports.IdentityDomainsAuthenticationFactorSettingIdcsCreatedByList = exports.IdentityDomainsAuthenticationFactorSettingIdcsCreatedByOutputReference = exports.identityDomainsAuthenticationFactorSettingIdcsCreatedByToHclTerraform = exports.identityDomainsAuthenticationFactorSettingIdcsCreatedByToTerraform = void 0;
exports.IdentityDomainsAuthenticationFactorSetting = exports.IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsOutputReference = exports.identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsToHclTerraform = exports.identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsToTerraform = exports.IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsDuoSecuritySettingsOutputReference = exports.identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsDuoSecuritySettingsToHclTerraform = exports.identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsDuoSecuritySettingsToTerraform = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const cdktf = require("cdktf");
function identityDomainsAuthenticationFactorSettingIdcsCreatedByToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {};
}
exports.identityDomainsAuthenticationFactorSettingIdcsCreatedByToTerraform = identityDomainsAuthenticationFactorSettingIdcsCreatedByToTerraform;
function identityDomainsAuthenticationFactorSettingIdcsCreatedByToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {};
    return attrs;
}
exports.identityDomainsAuthenticationFactorSettingIdcsCreatedByToHclTerraform = identityDomainsAuthenticationFactorSettingIdcsCreatedByToHclTerraform;
class IdentityDomainsAuthenticationFactorSettingIdcsCreatedByOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param complexObjectIndex the index of this item in the list
    * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
    */
    constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
        super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
        }
    }
    // display - computed: true, optional: false, required: false
    get display() {
        return this.getStringAttribute('display');
    }
    // ocid - computed: true, optional: false, required: false
    get ocid() {
        return this.getStringAttribute('ocid');
    }
    // ref - computed: true, optional: false, required: false
    get ref() {
        return this.getStringAttribute('ref');
    }
    // type - computed: true, optional: false, required: false
    get type() {
        return this.getStringAttribute('type');
    }
    // value - computed: true, optional: false, required: false
    get value() {
        return this.getStringAttribute('value');
    }
}
exports.IdentityDomainsAuthenticationFactorSettingIdcsCreatedByOutputReference = IdentityDomainsAuthenticationFactorSettingIdcsCreatedByOutputReference;
_a = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingIdcsCreatedByOutputReference[_a] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingIdcsCreatedByOutputReference", version: "1.0.0" };
class IdentityDomainsAuthenticationFactorSettingIdcsCreatedByList extends cdktf.ComplexList {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
    */
    constructor(terraformResource, terraformAttribute, wrapsSet) {
        super(terraformResource, terraformAttribute, wrapsSet);
        this.terraformResource = terraformResource;
        this.terraformAttribute = terraformAttribute;
        this.wrapsSet = wrapsSet;
    }
    /**
    * @param index the index of the item to return
    */
    get(index) {
        return new IdentityDomainsAuthenticationFactorSettingIdcsCreatedByOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
    }
}
exports.IdentityDomainsAuthenticationFactorSettingIdcsCreatedByList = IdentityDomainsAuthenticationFactorSettingIdcsCreatedByList;
_b = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingIdcsCreatedByList[_b] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingIdcsCreatedByList", version: "1.0.0" };
function identityDomainsAuthenticationFactorSettingIdcsLastModifiedByToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {};
}
exports.identityDomainsAuthenticationFactorSettingIdcsLastModifiedByToTerraform = identityDomainsAuthenticationFactorSettingIdcsLastModifiedByToTerraform;
function identityDomainsAuthenticationFactorSettingIdcsLastModifiedByToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {};
    return attrs;
}
exports.identityDomainsAuthenticationFactorSettingIdcsLastModifiedByToHclTerraform = identityDomainsAuthenticationFactorSettingIdcsLastModifiedByToHclTerraform;
class IdentityDomainsAuthenticationFactorSettingIdcsLastModifiedByOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param complexObjectIndex the index of this item in the list
    * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
    */
    constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
        super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
        }
    }
    // display - computed: true, optional: false, required: false
    get display() {
        return this.getStringAttribute('display');
    }
    // ocid - computed: true, optional: false, required: false
    get ocid() {
        return this.getStringAttribute('ocid');
    }
    // ref - computed: true, optional: false, required: false
    get ref() {
        return this.getStringAttribute('ref');
    }
    // type - computed: true, optional: false, required: false
    get type() {
        return this.getStringAttribute('type');
    }
    // value - computed: true, optional: false, required: false
    get value() {
        return this.getStringAttribute('value');
    }
}
exports.IdentityDomainsAuthenticationFactorSettingIdcsLastModifiedByOutputReference = IdentityDomainsAuthenticationFactorSettingIdcsLastModifiedByOutputReference;
_c = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingIdcsLastModifiedByOutputReference[_c] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingIdcsLastModifiedByOutputReference", version: "1.0.0" };
class IdentityDomainsAuthenticationFactorSettingIdcsLastModifiedByList extends cdktf.ComplexList {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
    */
    constructor(terraformResource, terraformAttribute, wrapsSet) {
        super(terraformResource, terraformAttribute, wrapsSet);
        this.terraformResource = terraformResource;
        this.terraformAttribute = terraformAttribute;
        this.wrapsSet = wrapsSet;
    }
    /**
    * @param index the index of the item to return
    */
    get(index) {
        return new IdentityDomainsAuthenticationFactorSettingIdcsLastModifiedByOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
    }
}
exports.IdentityDomainsAuthenticationFactorSettingIdcsLastModifiedByList = IdentityDomainsAuthenticationFactorSettingIdcsLastModifiedByList;
_d = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingIdcsLastModifiedByList[_d] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingIdcsLastModifiedByList", version: "1.0.0" };
function identityDomainsAuthenticationFactorSettingMetaToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {};
}
exports.identityDomainsAuthenticationFactorSettingMetaToTerraform = identityDomainsAuthenticationFactorSettingMetaToTerraform;
function identityDomainsAuthenticationFactorSettingMetaToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {};
    return attrs;
}
exports.identityDomainsAuthenticationFactorSettingMetaToHclTerraform = identityDomainsAuthenticationFactorSettingMetaToHclTerraform;
class IdentityDomainsAuthenticationFactorSettingMetaOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param complexObjectIndex the index of this item in the list
    * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
    */
    constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
        super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
        }
    }
    // created - computed: true, optional: false, required: false
    get created() {
        return this.getStringAttribute('created');
    }
    // last_modified - computed: true, optional: false, required: false
    get lastModified() {
        return this.getStringAttribute('last_modified');
    }
    // location - computed: true, optional: false, required: false
    get location() {
        return this.getStringAttribute('location');
    }
    // resource_type - computed: true, optional: false, required: false
    get resourceType() {
        return this.getStringAttribute('resource_type');
    }
    // version - computed: true, optional: false, required: false
    get version() {
        return this.getStringAttribute('version');
    }
}
exports.IdentityDomainsAuthenticationFactorSettingMetaOutputReference = IdentityDomainsAuthenticationFactorSettingMetaOutputReference;
_e = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingMetaOutputReference[_e] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingMetaOutputReference", version: "1.0.0" };
class IdentityDomainsAuthenticationFactorSettingMetaList extends cdktf.ComplexList {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
    */
    constructor(terraformResource, terraformAttribute, wrapsSet) {
        super(terraformResource, terraformAttribute, wrapsSet);
        this.terraformResource = terraformResource;
        this.terraformAttribute = terraformAttribute;
        this.wrapsSet = wrapsSet;
    }
    /**
    * @param index the index of the item to return
    */
    get(index) {
        return new IdentityDomainsAuthenticationFactorSettingMetaOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
    }
}
exports.IdentityDomainsAuthenticationFactorSettingMetaList = IdentityDomainsAuthenticationFactorSettingMetaList;
_f = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingMetaList[_f] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingMetaList", version: "1.0.0" };
function identityDomainsAuthenticationFactorSettingBypassCodeSettingsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        help_desk_code_expiry_in_mins: cdktf.numberToTerraform(struct.helpDeskCodeExpiryInMins),
        help_desk_generation_enabled: cdktf.booleanToTerraform(struct.helpDeskGenerationEnabled),
        help_desk_max_usage: cdktf.numberToTerraform(struct.helpDeskMaxUsage),
        length: cdktf.numberToTerraform(struct.length),
        max_active: cdktf.numberToTerraform(struct.maxActive),
        self_service_generation_enabled: cdktf.booleanToTerraform(struct.selfServiceGenerationEnabled),
    };
}
exports.identityDomainsAuthenticationFactorSettingBypassCodeSettingsToTerraform = identityDomainsAuthenticationFactorSettingBypassCodeSettingsToTerraform;
function identityDomainsAuthenticationFactorSettingBypassCodeSettingsToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {
        help_desk_code_expiry_in_mins: {
            value: cdktf.numberToHclTerraform(struct.helpDeskCodeExpiryInMins),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        help_desk_generation_enabled: {
            value: cdktf.booleanToHclTerraform(struct.helpDeskGenerationEnabled),
            isBlock: false,
            type: "simple",
            storageClassType: "boolean",
        },
        help_desk_max_usage: {
            value: cdktf.numberToHclTerraform(struct.helpDeskMaxUsage),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        length: {
            value: cdktf.numberToHclTerraform(struct.length),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        max_active: {
            value: cdktf.numberToHclTerraform(struct.maxActive),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        self_service_generation_enabled: {
            value: cdktf.booleanToHclTerraform(struct.selfServiceGenerationEnabled),
            isBlock: false,
            type: "simple",
            storageClassType: "boolean",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.identityDomainsAuthenticationFactorSettingBypassCodeSettingsToHclTerraform = identityDomainsAuthenticationFactorSettingBypassCodeSettingsToHclTerraform;
class IdentityDomainsAuthenticationFactorSettingBypassCodeSettingsOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._helpDeskCodeExpiryInMins !== undefined) {
            hasAnyValues = true;
            internalValueResult.helpDeskCodeExpiryInMins = this._helpDeskCodeExpiryInMins;
        }
        if (this._helpDeskGenerationEnabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.helpDeskGenerationEnabled = this._helpDeskGenerationEnabled;
        }
        if (this._helpDeskMaxUsage !== undefined) {
            hasAnyValues = true;
            internalValueResult.helpDeskMaxUsage = this._helpDeskMaxUsage;
        }
        if (this._length !== undefined) {
            hasAnyValues = true;
            internalValueResult.length = this._length;
        }
        if (this._maxActive !== undefined) {
            hasAnyValues = true;
            internalValueResult.maxActive = this._maxActive;
        }
        if (this._selfServiceGenerationEnabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.selfServiceGenerationEnabled = this._selfServiceGenerationEnabled;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._helpDeskCodeExpiryInMins = undefined;
            this._helpDeskGenerationEnabled = undefined;
            this._helpDeskMaxUsage = undefined;
            this._length = undefined;
            this._maxActive = undefined;
            this._selfServiceGenerationEnabled = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._helpDeskCodeExpiryInMins = value.helpDeskCodeExpiryInMins;
            this._helpDeskGenerationEnabled = value.helpDeskGenerationEnabled;
            this._helpDeskMaxUsage = value.helpDeskMaxUsage;
            this._length = value.length;
            this._maxActive = value.maxActive;
            this._selfServiceGenerationEnabled = value.selfServiceGenerationEnabled;
        }
    }
    get helpDeskCodeExpiryInMins() {
        return this.getNumberAttribute('help_desk_code_expiry_in_mins');
    }
    set helpDeskCodeExpiryInMins(value) {
        this._helpDeskCodeExpiryInMins = value;
    }
    // Temporarily expose input value. Use with caution.
    get helpDeskCodeExpiryInMinsInput() {
        return this._helpDeskCodeExpiryInMins;
    }
    get helpDeskGenerationEnabled() {
        return this.getBooleanAttribute('help_desk_generation_enabled');
    }
    set helpDeskGenerationEnabled(value) {
        this._helpDeskGenerationEnabled = value;
    }
    // Temporarily expose input value. Use with caution.
    get helpDeskGenerationEnabledInput() {
        return this._helpDeskGenerationEnabled;
    }
    get helpDeskMaxUsage() {
        return this.getNumberAttribute('help_desk_max_usage');
    }
    set helpDeskMaxUsage(value) {
        this._helpDeskMaxUsage = value;
    }
    // Temporarily expose input value. Use with caution.
    get helpDeskMaxUsageInput() {
        return this._helpDeskMaxUsage;
    }
    get length() {
        return this.getNumberAttribute('length');
    }
    set length(value) {
        this._length = value;
    }
    // Temporarily expose input value. Use with caution.
    get lengthInput() {
        return this._length;
    }
    get maxActive() {
        return this.getNumberAttribute('max_active');
    }
    set maxActive(value) {
        this._maxActive = value;
    }
    // Temporarily expose input value. Use with caution.
    get maxActiveInput() {
        return this._maxActive;
    }
    get selfServiceGenerationEnabled() {
        return this.getBooleanAttribute('self_service_generation_enabled');
    }
    set selfServiceGenerationEnabled(value) {
        this._selfServiceGenerationEnabled = value;
    }
    // Temporarily expose input value. Use with caution.
    get selfServiceGenerationEnabledInput() {
        return this._selfServiceGenerationEnabled;
    }
}
exports.IdentityDomainsAuthenticationFactorSettingBypassCodeSettingsOutputReference = IdentityDomainsAuthenticationFactorSettingBypassCodeSettingsOutputReference;
_g = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingBypassCodeSettingsOutputReference[_g] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingBypassCodeSettingsOutputReference", version: "1.0.0" };
function identityDomainsAuthenticationFactorSettingClientAppSettingsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        device_protection_policy: cdktf.stringToTerraform(struct.deviceProtectionPolicy),
        initial_lockout_period_in_secs: cdktf.numberToTerraform(struct.initialLockoutPeriodInSecs),
        key_pair_length: cdktf.numberToTerraform(struct.keyPairLength),
        lockout_escalation_pattern: cdktf.stringToTerraform(struct.lockoutEscalationPattern),
        max_failures_before_lockout: cdktf.numberToTerraform(struct.maxFailuresBeforeLockout),
        max_failures_before_warning: cdktf.numberToTerraform(struct.maxFailuresBeforeWarning),
        max_lockout_interval_in_secs: cdktf.numberToTerraform(struct.maxLockoutIntervalInSecs),
        min_pin_length: cdktf.numberToTerraform(struct.minPinLength),
        policy_update_freq_in_days: cdktf.numberToTerraform(struct.policyUpdateFreqInDays),
        request_signing_algo: cdktf.stringToTerraform(struct.requestSigningAlgo),
        shared_secret_encoding: cdktf.stringToTerraform(struct.sharedSecretEncoding),
        unlock_app_for_each_request_enabled: cdktf.booleanToTerraform(struct.unlockAppForEachRequestEnabled),
        unlock_app_interval_in_secs: cdktf.numberToTerraform(struct.unlockAppIntervalInSecs),
        unlock_on_app_foreground_enabled: cdktf.booleanToTerraform(struct.unlockOnAppForegroundEnabled),
        unlock_on_app_start_enabled: cdktf.booleanToTerraform(struct.unlockOnAppStartEnabled),
    };
}
exports.identityDomainsAuthenticationFactorSettingClientAppSettingsToTerraform = identityDomainsAuthenticationFactorSettingClientAppSettingsToTerraform;
function identityDomainsAuthenticationFactorSettingClientAppSettingsToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {
        device_protection_policy: {
            value: cdktf.stringToHclTerraform(struct.deviceProtectionPolicy),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        initial_lockout_period_in_secs: {
            value: cdktf.numberToHclTerraform(struct.initialLockoutPeriodInSecs),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        key_pair_length: {
            value: cdktf.numberToHclTerraform(struct.keyPairLength),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        lockout_escalation_pattern: {
            value: cdktf.stringToHclTerraform(struct.lockoutEscalationPattern),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        max_failures_before_lockout: {
            value: cdktf.numberToHclTerraform(struct.maxFailuresBeforeLockout),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        max_failures_before_warning: {
            value: cdktf.numberToHclTerraform(struct.maxFailuresBeforeWarning),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        max_lockout_interval_in_secs: {
            value: cdktf.numberToHclTerraform(struct.maxLockoutIntervalInSecs),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        min_pin_length: {
            value: cdktf.numberToHclTerraform(struct.minPinLength),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        policy_update_freq_in_days: {
            value: cdktf.numberToHclTerraform(struct.policyUpdateFreqInDays),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        request_signing_algo: {
            value: cdktf.stringToHclTerraform(struct.requestSigningAlgo),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        shared_secret_encoding: {
            value: cdktf.stringToHclTerraform(struct.sharedSecretEncoding),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        unlock_app_for_each_request_enabled: {
            value: cdktf.booleanToHclTerraform(struct.unlockAppForEachRequestEnabled),
            isBlock: false,
            type: "simple",
            storageClassType: "boolean",
        },
        unlock_app_interval_in_secs: {
            value: cdktf.numberToHclTerraform(struct.unlockAppIntervalInSecs),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        unlock_on_app_foreground_enabled: {
            value: cdktf.booleanToHclTerraform(struct.unlockOnAppForegroundEnabled),
            isBlock: false,
            type: "simple",
            storageClassType: "boolean",
        },
        unlock_on_app_start_enabled: {
            value: cdktf.booleanToHclTerraform(struct.unlockOnAppStartEnabled),
            isBlock: false,
            type: "simple",
            storageClassType: "boolean",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.identityDomainsAuthenticationFactorSettingClientAppSettingsToHclTerraform = identityDomainsAuthenticationFactorSettingClientAppSettingsToHclTerraform;
class IdentityDomainsAuthenticationFactorSettingClientAppSettingsOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._deviceProtectionPolicy !== undefined) {
            hasAnyValues = true;
            internalValueResult.deviceProtectionPolicy = this._deviceProtectionPolicy;
        }
        if (this._initialLockoutPeriodInSecs !== undefined) {
            hasAnyValues = true;
            internalValueResult.initialLockoutPeriodInSecs = this._initialLockoutPeriodInSecs;
        }
        if (this._keyPairLength !== undefined) {
            hasAnyValues = true;
            internalValueResult.keyPairLength = this._keyPairLength;
        }
        if (this._lockoutEscalationPattern !== undefined) {
            hasAnyValues = true;
            internalValueResult.lockoutEscalationPattern = this._lockoutEscalationPattern;
        }
        if (this._maxFailuresBeforeLockout !== undefined) {
            hasAnyValues = true;
            internalValueResult.maxFailuresBeforeLockout = this._maxFailuresBeforeLockout;
        }
        if (this._maxFailuresBeforeWarning !== undefined) {
            hasAnyValues = true;
            internalValueResult.maxFailuresBeforeWarning = this._maxFailuresBeforeWarning;
        }
        if (this._maxLockoutIntervalInSecs !== undefined) {
            hasAnyValues = true;
            internalValueResult.maxLockoutIntervalInSecs = this._maxLockoutIntervalInSecs;
        }
        if (this._minPinLength !== undefined) {
            hasAnyValues = true;
            internalValueResult.minPinLength = this._minPinLength;
        }
        if (this._policyUpdateFreqInDays !== undefined) {
            hasAnyValues = true;
            internalValueResult.policyUpdateFreqInDays = this._policyUpdateFreqInDays;
        }
        if (this._requestSigningAlgo !== undefined) {
            hasAnyValues = true;
            internalValueResult.requestSigningAlgo = this._requestSigningAlgo;
        }
        if (this._sharedSecretEncoding !== undefined) {
            hasAnyValues = true;
            internalValueResult.sharedSecretEncoding = this._sharedSecretEncoding;
        }
        if (this._unlockAppForEachRequestEnabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.unlockAppForEachRequestEnabled = this._unlockAppForEachRequestEnabled;
        }
        if (this._unlockAppIntervalInSecs !== undefined) {
            hasAnyValues = true;
            internalValueResult.unlockAppIntervalInSecs = this._unlockAppIntervalInSecs;
        }
        if (this._unlockOnAppForegroundEnabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.unlockOnAppForegroundEnabled = this._unlockOnAppForegroundEnabled;
        }
        if (this._unlockOnAppStartEnabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.unlockOnAppStartEnabled = this._unlockOnAppStartEnabled;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._deviceProtectionPolicy = undefined;
            this._initialLockoutPeriodInSecs = undefined;
            this._keyPairLength = undefined;
            this._lockoutEscalationPattern = undefined;
            this._maxFailuresBeforeLockout = undefined;
            this._maxFailuresBeforeWarning = undefined;
            this._maxLockoutIntervalInSecs = undefined;
            this._minPinLength = undefined;
            this._policyUpdateFreqInDays = undefined;
            this._requestSigningAlgo = undefined;
            this._sharedSecretEncoding = undefined;
            this._unlockAppForEachRequestEnabled = undefined;
            this._unlockAppIntervalInSecs = undefined;
            this._unlockOnAppForegroundEnabled = undefined;
            this._unlockOnAppStartEnabled = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._deviceProtectionPolicy = value.deviceProtectionPolicy;
            this._initialLockoutPeriodInSecs = value.initialLockoutPeriodInSecs;
            this._keyPairLength = value.keyPairLength;
            this._lockoutEscalationPattern = value.lockoutEscalationPattern;
            this._maxFailuresBeforeLockout = value.maxFailuresBeforeLockout;
            this._maxFailuresBeforeWarning = value.maxFailuresBeforeWarning;
            this._maxLockoutIntervalInSecs = value.maxLockoutIntervalInSecs;
            this._minPinLength = value.minPinLength;
            this._policyUpdateFreqInDays = value.policyUpdateFreqInDays;
            this._requestSigningAlgo = value.requestSigningAlgo;
            this._sharedSecretEncoding = value.sharedSecretEncoding;
            this._unlockAppForEachRequestEnabled = value.unlockAppForEachRequestEnabled;
            this._unlockAppIntervalInSecs = value.unlockAppIntervalInSecs;
            this._unlockOnAppForegroundEnabled = value.unlockOnAppForegroundEnabled;
            this._unlockOnAppStartEnabled = value.unlockOnAppStartEnabled;
        }
    }
    get deviceProtectionPolicy() {
        return this.getStringAttribute('device_protection_policy');
    }
    set deviceProtectionPolicy(value) {
        this._deviceProtectionPolicy = value;
    }
    // Temporarily expose input value. Use with caution.
    get deviceProtectionPolicyInput() {
        return this._deviceProtectionPolicy;
    }
    get initialLockoutPeriodInSecs() {
        return this.getNumberAttribute('initial_lockout_period_in_secs');
    }
    set initialLockoutPeriodInSecs(value) {
        this._initialLockoutPeriodInSecs = value;
    }
    // Temporarily expose input value. Use with caution.
    get initialLockoutPeriodInSecsInput() {
        return this._initialLockoutPeriodInSecs;
    }
    get keyPairLength() {
        return this.getNumberAttribute('key_pair_length');
    }
    set keyPairLength(value) {
        this._keyPairLength = value;
    }
    // Temporarily expose input value. Use with caution.
    get keyPairLengthInput() {
        return this._keyPairLength;
    }
    get lockoutEscalationPattern() {
        return this.getStringAttribute('lockout_escalation_pattern');
    }
    set lockoutEscalationPattern(value) {
        this._lockoutEscalationPattern = value;
    }
    // Temporarily expose input value. Use with caution.
    get lockoutEscalationPatternInput() {
        return this._lockoutEscalationPattern;
    }
    get maxFailuresBeforeLockout() {
        return this.getNumberAttribute('max_failures_before_lockout');
    }
    set maxFailuresBeforeLockout(value) {
        this._maxFailuresBeforeLockout = value;
    }
    // Temporarily expose input value. Use with caution.
    get maxFailuresBeforeLockoutInput() {
        return this._maxFailuresBeforeLockout;
    }
    get maxFailuresBeforeWarning() {
        return this.getNumberAttribute('max_failures_before_warning');
    }
    set maxFailuresBeforeWarning(value) {
        this._maxFailuresBeforeWarning = value;
    }
    // Temporarily expose input value. Use with caution.
    get maxFailuresBeforeWarningInput() {
        return this._maxFailuresBeforeWarning;
    }
    get maxLockoutIntervalInSecs() {
        return this.getNumberAttribute('max_lockout_interval_in_secs');
    }
    set maxLockoutIntervalInSecs(value) {
        this._maxLockoutIntervalInSecs = value;
    }
    // Temporarily expose input value. Use with caution.
    get maxLockoutIntervalInSecsInput() {
        return this._maxLockoutIntervalInSecs;
    }
    get minPinLength() {
        return this.getNumberAttribute('min_pin_length');
    }
    set minPinLength(value) {
        this._minPinLength = value;
    }
    // Temporarily expose input value. Use with caution.
    get minPinLengthInput() {
        return this._minPinLength;
    }
    get policyUpdateFreqInDays() {
        return this.getNumberAttribute('policy_update_freq_in_days');
    }
    set policyUpdateFreqInDays(value) {
        this._policyUpdateFreqInDays = value;
    }
    // Temporarily expose input value. Use with caution.
    get policyUpdateFreqInDaysInput() {
        return this._policyUpdateFreqInDays;
    }
    get requestSigningAlgo() {
        return this.getStringAttribute('request_signing_algo');
    }
    set requestSigningAlgo(value) {
        this._requestSigningAlgo = value;
    }
    // Temporarily expose input value. Use with caution.
    get requestSigningAlgoInput() {
        return this._requestSigningAlgo;
    }
    get sharedSecretEncoding() {
        return this.getStringAttribute('shared_secret_encoding');
    }
    set sharedSecretEncoding(value) {
        this._sharedSecretEncoding = value;
    }
    // Temporarily expose input value. Use with caution.
    get sharedSecretEncodingInput() {
        return this._sharedSecretEncoding;
    }
    get unlockAppForEachRequestEnabled() {
        return this.getBooleanAttribute('unlock_app_for_each_request_enabled');
    }
    set unlockAppForEachRequestEnabled(value) {
        this._unlockAppForEachRequestEnabled = value;
    }
    // Temporarily expose input value. Use with caution.
    get unlockAppForEachRequestEnabledInput() {
        return this._unlockAppForEachRequestEnabled;
    }
    get unlockAppIntervalInSecs() {
        return this.getNumberAttribute('unlock_app_interval_in_secs');
    }
    set unlockAppIntervalInSecs(value) {
        this._unlockAppIntervalInSecs = value;
    }
    // Temporarily expose input value. Use with caution.
    get unlockAppIntervalInSecsInput() {
        return this._unlockAppIntervalInSecs;
    }
    get unlockOnAppForegroundEnabled() {
        return this.getBooleanAttribute('unlock_on_app_foreground_enabled');
    }
    set unlockOnAppForegroundEnabled(value) {
        this._unlockOnAppForegroundEnabled = value;
    }
    // Temporarily expose input value. Use with caution.
    get unlockOnAppForegroundEnabledInput() {
        return this._unlockOnAppForegroundEnabled;
    }
    get unlockOnAppStartEnabled() {
        return this.getBooleanAttribute('unlock_on_app_start_enabled');
    }
    set unlockOnAppStartEnabled(value) {
        this._unlockOnAppStartEnabled = value;
    }
    // Temporarily expose input value. Use with caution.
    get unlockOnAppStartEnabledInput() {
        return this._unlockOnAppStartEnabled;
    }
}
exports.IdentityDomainsAuthenticationFactorSettingClientAppSettingsOutputReference = IdentityDomainsAuthenticationFactorSettingClientAppSettingsOutputReference;
_h = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingClientAppSettingsOutputReference[_h] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingClientAppSettingsOutputReference", version: "1.0.0" };
function identityDomainsAuthenticationFactorSettingCompliancePolicyToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        action: cdktf.stringToTerraform(struct.action),
        name: cdktf.stringToTerraform(struct.name),
        value: cdktf.stringToTerraform(struct.value),
    };
}
exports.identityDomainsAuthenticationFactorSettingCompliancePolicyToTerraform = identityDomainsAuthenticationFactorSettingCompliancePolicyToTerraform;
function identityDomainsAuthenticationFactorSettingCompliancePolicyToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {
        action: {
            value: cdktf.stringToHclTerraform(struct.action),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        name: {
            value: cdktf.stringToHclTerraform(struct.name),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        value: {
            value: cdktf.stringToHclTerraform(struct.value),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.identityDomainsAuthenticationFactorSettingCompliancePolicyToHclTerraform = identityDomainsAuthenticationFactorSettingCompliancePolicyToHclTerraform;
class IdentityDomainsAuthenticationFactorSettingCompliancePolicyOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param complexObjectIndex the index of this item in the list
    * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
    */
    constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
        super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
        this.isEmptyObject = false;
    }
    get internalValue() {
        if (this.resolvableValue) {
            return this.resolvableValue;
        }
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._action !== undefined) {
            hasAnyValues = true;
            internalValueResult.action = this._action;
        }
        if (this._name !== undefined) {
            hasAnyValues = true;
            internalValueResult.name = this._name;
        }
        if (this._value !== undefined) {
            hasAnyValues = true;
            internalValueResult.value = this._value;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this.resolvableValue = undefined;
            this._action = undefined;
            this._name = undefined;
            this._value = undefined;
        }
        else if (cdktf.Tokenization.isResolvable(value)) {
            this.isEmptyObject = false;
            this.resolvableValue = value;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this.resolvableValue = undefined;
            this._action = value.action;
            this._name = value.name;
            this._value = value.value;
        }
    }
    get action() {
        return this.getStringAttribute('action');
    }
    set action(value) {
        this._action = value;
    }
    // Temporarily expose input value. Use with caution.
    get actionInput() {
        return this._action;
    }
    get name() {
        return this.getStringAttribute('name');
    }
    set name(value) {
        this._name = value;
    }
    // Temporarily expose input value. Use with caution.
    get nameInput() {
        return this._name;
    }
    get value() {
        return this.getStringAttribute('value');
    }
    set value(value) {
        this._value = value;
    }
    // Temporarily expose input value. Use with caution.
    get valueInput() {
        return this._value;
    }
}
exports.IdentityDomainsAuthenticationFactorSettingCompliancePolicyOutputReference = IdentityDomainsAuthenticationFactorSettingCompliancePolicyOutputReference;
_j = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingCompliancePolicyOutputReference[_j] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingCompliancePolicyOutputReference", version: "1.0.0" };
class IdentityDomainsAuthenticationFactorSettingCompliancePolicyList extends cdktf.ComplexList {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
    */
    constructor(terraformResource, terraformAttribute, wrapsSet) {
        super(terraformResource, terraformAttribute, wrapsSet);
        this.terraformResource = terraformResource;
        this.terraformAttribute = terraformAttribute;
        this.wrapsSet = wrapsSet;
    }
    /**
    * @param index the index of the item to return
    */
    get(index) {
        return new IdentityDomainsAuthenticationFactorSettingCompliancePolicyOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
    }
}
exports.IdentityDomainsAuthenticationFactorSettingCompliancePolicyList = IdentityDomainsAuthenticationFactorSettingCompliancePolicyList;
_k = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingCompliancePolicyList[_k] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingCompliancePolicyList", version: "1.0.0" };
function identityDomainsAuthenticationFactorSettingEmailSettingsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        email_link_custom_url: cdktf.stringToTerraform(struct.emailLinkCustomUrl),
        email_link_enabled: cdktf.booleanToTerraform(struct.emailLinkEnabled),
    };
}
exports.identityDomainsAuthenticationFactorSettingEmailSettingsToTerraform = identityDomainsAuthenticationFactorSettingEmailSettingsToTerraform;
function identityDomainsAuthenticationFactorSettingEmailSettingsToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {
        email_link_custom_url: {
            value: cdktf.stringToHclTerraform(struct.emailLinkCustomUrl),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        email_link_enabled: {
            value: cdktf.booleanToHclTerraform(struct.emailLinkEnabled),
            isBlock: false,
            type: "simple",
            storageClassType: "boolean",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.identityDomainsAuthenticationFactorSettingEmailSettingsToHclTerraform = identityDomainsAuthenticationFactorSettingEmailSettingsToHclTerraform;
class IdentityDomainsAuthenticationFactorSettingEmailSettingsOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._emailLinkCustomUrl !== undefined) {
            hasAnyValues = true;
            internalValueResult.emailLinkCustomUrl = this._emailLinkCustomUrl;
        }
        if (this._emailLinkEnabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.emailLinkEnabled = this._emailLinkEnabled;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._emailLinkCustomUrl = undefined;
            this._emailLinkEnabled = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._emailLinkCustomUrl = value.emailLinkCustomUrl;
            this._emailLinkEnabled = value.emailLinkEnabled;
        }
    }
    get emailLinkCustomUrl() {
        return this.getStringAttribute('email_link_custom_url');
    }
    set emailLinkCustomUrl(value) {
        this._emailLinkCustomUrl = value;
    }
    resetEmailLinkCustomUrl() {
        this._emailLinkCustomUrl = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get emailLinkCustomUrlInput() {
        return this._emailLinkCustomUrl;
    }
    get emailLinkEnabled() {
        return this.getBooleanAttribute('email_link_enabled');
    }
    set emailLinkEnabled(value) {
        this._emailLinkEnabled = value;
    }
    // Temporarily expose input value. Use with caution.
    get emailLinkEnabledInput() {
        return this._emailLinkEnabled;
    }
}
exports.IdentityDomainsAuthenticationFactorSettingEmailSettingsOutputReference = IdentityDomainsAuthenticationFactorSettingEmailSettingsOutputReference;
_l = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingEmailSettingsOutputReference[_l] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingEmailSettingsOutputReference", version: "1.0.0" };
function identityDomainsAuthenticationFactorSettingEndpointRestrictionsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        max_endpoint_trust_duration_in_days: cdktf.numberToTerraform(struct.maxEndpointTrustDurationInDays),
        max_enrolled_devices: cdktf.numberToTerraform(struct.maxEnrolledDevices),
        max_incorrect_attempts: cdktf.numberToTerraform(struct.maxIncorrectAttempts),
        max_trusted_endpoints: cdktf.numberToTerraform(struct.maxTrustedEndpoints),
        trusted_endpoints_enabled: cdktf.booleanToTerraform(struct.trustedEndpointsEnabled),
    };
}
exports.identityDomainsAuthenticationFactorSettingEndpointRestrictionsToTerraform = identityDomainsAuthenticationFactorSettingEndpointRestrictionsToTerraform;
function identityDomainsAuthenticationFactorSettingEndpointRestrictionsToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {
        max_endpoint_trust_duration_in_days: {
            value: cdktf.numberToHclTerraform(struct.maxEndpointTrustDurationInDays),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        max_enrolled_devices: {
            value: cdktf.numberToHclTerraform(struct.maxEnrolledDevices),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        max_incorrect_attempts: {
            value: cdktf.numberToHclTerraform(struct.maxIncorrectAttempts),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        max_trusted_endpoints: {
            value: cdktf.numberToHclTerraform(struct.maxTrustedEndpoints),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        trusted_endpoints_enabled: {
            value: cdktf.booleanToHclTerraform(struct.trustedEndpointsEnabled),
            isBlock: false,
            type: "simple",
            storageClassType: "boolean",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.identityDomainsAuthenticationFactorSettingEndpointRestrictionsToHclTerraform = identityDomainsAuthenticationFactorSettingEndpointRestrictionsToHclTerraform;
class IdentityDomainsAuthenticationFactorSettingEndpointRestrictionsOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._maxEndpointTrustDurationInDays !== undefined) {
            hasAnyValues = true;
            internalValueResult.maxEndpointTrustDurationInDays = this._maxEndpointTrustDurationInDays;
        }
        if (this._maxEnrolledDevices !== undefined) {
            hasAnyValues = true;
            internalValueResult.maxEnrolledDevices = this._maxEnrolledDevices;
        }
        if (this._maxIncorrectAttempts !== undefined) {
            hasAnyValues = true;
            internalValueResult.maxIncorrectAttempts = this._maxIncorrectAttempts;
        }
        if (this._maxTrustedEndpoints !== undefined) {
            hasAnyValues = true;
            internalValueResult.maxTrustedEndpoints = this._maxTrustedEndpoints;
        }
        if (this._trustedEndpointsEnabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.trustedEndpointsEnabled = this._trustedEndpointsEnabled;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._maxEndpointTrustDurationInDays = undefined;
            this._maxEnrolledDevices = undefined;
            this._maxIncorrectAttempts = undefined;
            this._maxTrustedEndpoints = undefined;
            this._trustedEndpointsEnabled = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._maxEndpointTrustDurationInDays = value.maxEndpointTrustDurationInDays;
            this._maxEnrolledDevices = value.maxEnrolledDevices;
            this._maxIncorrectAttempts = value.maxIncorrectAttempts;
            this._maxTrustedEndpoints = value.maxTrustedEndpoints;
            this._trustedEndpointsEnabled = value.trustedEndpointsEnabled;
        }
    }
    get maxEndpointTrustDurationInDays() {
        return this.getNumberAttribute('max_endpoint_trust_duration_in_days');
    }
    set maxEndpointTrustDurationInDays(value) {
        this._maxEndpointTrustDurationInDays = value;
    }
    // Temporarily expose input value. Use with caution.
    get maxEndpointTrustDurationInDaysInput() {
        return this._maxEndpointTrustDurationInDays;
    }
    get maxEnrolledDevices() {
        return this.getNumberAttribute('max_enrolled_devices');
    }
    set maxEnrolledDevices(value) {
        this._maxEnrolledDevices = value;
    }
    // Temporarily expose input value. Use with caution.
    get maxEnrolledDevicesInput() {
        return this._maxEnrolledDevices;
    }
    get maxIncorrectAttempts() {
        return this.getNumberAttribute('max_incorrect_attempts');
    }
    set maxIncorrectAttempts(value) {
        this._maxIncorrectAttempts = value;
    }
    // Temporarily expose input value. Use with caution.
    get maxIncorrectAttemptsInput() {
        return this._maxIncorrectAttempts;
    }
    get maxTrustedEndpoints() {
        return this.getNumberAttribute('max_trusted_endpoints');
    }
    set maxTrustedEndpoints(value) {
        this._maxTrustedEndpoints = value;
    }
    // Temporarily expose input value. Use with caution.
    get maxTrustedEndpointsInput() {
        return this._maxTrustedEndpoints;
    }
    get trustedEndpointsEnabled() {
        return this.getBooleanAttribute('trusted_endpoints_enabled');
    }
    set trustedEndpointsEnabled(value) {
        this._trustedEndpointsEnabled = value;
    }
    // Temporarily expose input value. Use with caution.
    get trustedEndpointsEnabledInput() {
        return this._trustedEndpointsEnabled;
    }
}
exports.IdentityDomainsAuthenticationFactorSettingEndpointRestrictionsOutputReference = IdentityDomainsAuthenticationFactorSettingEndpointRestrictionsOutputReference;
_m = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingEndpointRestrictionsOutputReference[_m] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingEndpointRestrictionsOutputReference", version: "1.0.0" };
function identityDomainsAuthenticationFactorSettingIdentityStoreSettingsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        mobile_number_enabled: cdktf.booleanToTerraform(struct.mobileNumberEnabled),
        mobile_number_update_enabled: cdktf.booleanToTerraform(struct.mobileNumberUpdateEnabled),
    };
}
exports.identityDomainsAuthenticationFactorSettingIdentityStoreSettingsToTerraform = identityDomainsAuthenticationFactorSettingIdentityStoreSettingsToTerraform;
function identityDomainsAuthenticationFactorSettingIdentityStoreSettingsToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {
        mobile_number_enabled: {
            value: cdktf.booleanToHclTerraform(struct.mobileNumberEnabled),
            isBlock: false,
            type: "simple",
            storageClassType: "boolean",
        },
        mobile_number_update_enabled: {
            value: cdktf.booleanToHclTerraform(struct.mobileNumberUpdateEnabled),
            isBlock: false,
            type: "simple",
            storageClassType: "boolean",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.identityDomainsAuthenticationFactorSettingIdentityStoreSettingsToHclTerraform = identityDomainsAuthenticationFactorSettingIdentityStoreSettingsToHclTerraform;
class IdentityDomainsAuthenticationFactorSettingIdentityStoreSettingsOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._mobileNumberEnabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.mobileNumberEnabled = this._mobileNumberEnabled;
        }
        if (this._mobileNumberUpdateEnabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.mobileNumberUpdateEnabled = this._mobileNumberUpdateEnabled;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._mobileNumberEnabled = undefined;
            this._mobileNumberUpdateEnabled = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._mobileNumberEnabled = value.mobileNumberEnabled;
            this._mobileNumberUpdateEnabled = value.mobileNumberUpdateEnabled;
        }
    }
    get mobileNumberEnabled() {
        return this.getBooleanAttribute('mobile_number_enabled');
    }
    set mobileNumberEnabled(value) {
        this._mobileNumberEnabled = value;
    }
    resetMobileNumberEnabled() {
        this._mobileNumberEnabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get mobileNumberEnabledInput() {
        return this._mobileNumberEnabled;
    }
    get mobileNumberUpdateEnabled() {
        return this.getBooleanAttribute('mobile_number_update_enabled');
    }
    set mobileNumberUpdateEnabled(value) {
        this._mobileNumberUpdateEnabled = value;
    }
    resetMobileNumberUpdateEnabled() {
        this._mobileNumberUpdateEnabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get mobileNumberUpdateEnabledInput() {
        return this._mobileNumberUpdateEnabled;
    }
}
exports.IdentityDomainsAuthenticationFactorSettingIdentityStoreSettingsOutputReference = IdentityDomainsAuthenticationFactorSettingIdentityStoreSettingsOutputReference;
_o = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingIdentityStoreSettingsOutputReference[_o] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingIdentityStoreSettingsOutputReference", version: "1.0.0" };
function identityDomainsAuthenticationFactorSettingNotificationSettingsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        pull_enabled: cdktf.booleanToTerraform(struct.pullEnabled),
    };
}
exports.identityDomainsAuthenticationFactorSettingNotificationSettingsToTerraform = identityDomainsAuthenticationFactorSettingNotificationSettingsToTerraform;
function identityDomainsAuthenticationFactorSettingNotificationSettingsToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {
        pull_enabled: {
            value: cdktf.booleanToHclTerraform(struct.pullEnabled),
            isBlock: false,
            type: "simple",
            storageClassType: "boolean",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.identityDomainsAuthenticationFactorSettingNotificationSettingsToHclTerraform = identityDomainsAuthenticationFactorSettingNotificationSettingsToHclTerraform;
class IdentityDomainsAuthenticationFactorSettingNotificationSettingsOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._pullEnabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.pullEnabled = this._pullEnabled;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._pullEnabled = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._pullEnabled = value.pullEnabled;
        }
    }
    get pullEnabled() {
        return this.getBooleanAttribute('pull_enabled');
    }
    set pullEnabled(value) {
        this._pullEnabled = value;
    }
    // Temporarily expose input value. Use with caution.
    get pullEnabledInput() {
        return this._pullEnabled;
    }
}
exports.IdentityDomainsAuthenticationFactorSettingNotificationSettingsOutputReference = IdentityDomainsAuthenticationFactorSettingNotificationSettingsOutputReference;
_p = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingNotificationSettingsOutputReference[_p] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingNotificationSettingsOutputReference", version: "1.0.0" };
function identityDomainsAuthenticationFactorSettingTagsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        key: cdktf.stringToTerraform(struct.key),
        value: cdktf.stringToTerraform(struct.value),
    };
}
exports.identityDomainsAuthenticationFactorSettingTagsToTerraform = identityDomainsAuthenticationFactorSettingTagsToTerraform;
function identityDomainsAuthenticationFactorSettingTagsToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {
        key: {
            value: cdktf.stringToHclTerraform(struct.key),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        value: {
            value: cdktf.stringToHclTerraform(struct.value),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.identityDomainsAuthenticationFactorSettingTagsToHclTerraform = identityDomainsAuthenticationFactorSettingTagsToHclTerraform;
class IdentityDomainsAuthenticationFactorSettingTagsOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param complexObjectIndex the index of this item in the list
    * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
    */
    constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
        super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
        this.isEmptyObject = false;
    }
    get internalValue() {
        if (this.resolvableValue) {
            return this.resolvableValue;
        }
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._key !== undefined) {
            hasAnyValues = true;
            internalValueResult.key = this._key;
        }
        if (this._value !== undefined) {
            hasAnyValues = true;
            internalValueResult.value = this._value;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this.resolvableValue = undefined;
            this._key = undefined;
            this._value = undefined;
        }
        else if (cdktf.Tokenization.isResolvable(value)) {
            this.isEmptyObject = false;
            this.resolvableValue = value;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this.resolvableValue = undefined;
            this._key = value.key;
            this._value = value.value;
        }
    }
    get key() {
        return this.getStringAttribute('key');
    }
    set key(value) {
        this._key = value;
    }
    // Temporarily expose input value. Use with caution.
    get keyInput() {
        return this._key;
    }
    get value() {
        return this.getStringAttribute('value');
    }
    set value(value) {
        this._value = value;
    }
    // Temporarily expose input value. Use with caution.
    get valueInput() {
        return this._value;
    }
}
exports.IdentityDomainsAuthenticationFactorSettingTagsOutputReference = IdentityDomainsAuthenticationFactorSettingTagsOutputReference;
_q = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingTagsOutputReference[_q] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingTagsOutputReference", version: "1.0.0" };
class IdentityDomainsAuthenticationFactorSettingTagsList extends cdktf.ComplexList {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
    */
    constructor(terraformResource, terraformAttribute, wrapsSet) {
        super(terraformResource, terraformAttribute, wrapsSet);
        this.terraformResource = terraformResource;
        this.terraformAttribute = terraformAttribute;
        this.wrapsSet = wrapsSet;
    }
    /**
    * @param index the index of the item to return
    */
    get(index) {
        return new IdentityDomainsAuthenticationFactorSettingTagsOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
    }
}
exports.IdentityDomainsAuthenticationFactorSettingTagsList = IdentityDomainsAuthenticationFactorSettingTagsList;
_r = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingTagsList[_r] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingTagsList", version: "1.0.0" };
function identityDomainsAuthenticationFactorSettingThirdPartyFactorToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        duo_security: cdktf.booleanToTerraform(struct.duoSecurity),
    };
}
exports.identityDomainsAuthenticationFactorSettingThirdPartyFactorToTerraform = identityDomainsAuthenticationFactorSettingThirdPartyFactorToTerraform;
function identityDomainsAuthenticationFactorSettingThirdPartyFactorToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {
        duo_security: {
            value: cdktf.booleanToHclTerraform(struct.duoSecurity),
            isBlock: false,
            type: "simple",
            storageClassType: "boolean",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.identityDomainsAuthenticationFactorSettingThirdPartyFactorToHclTerraform = identityDomainsAuthenticationFactorSettingThirdPartyFactorToHclTerraform;
class IdentityDomainsAuthenticationFactorSettingThirdPartyFactorOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._duoSecurity !== undefined) {
            hasAnyValues = true;
            internalValueResult.duoSecurity = this._duoSecurity;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._duoSecurity = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._duoSecurity = value.duoSecurity;
        }
    }
    get duoSecurity() {
        return this.getBooleanAttribute('duo_security');
    }
    set duoSecurity(value) {
        this._duoSecurity = value;
    }
    // Temporarily expose input value. Use with caution.
    get duoSecurityInput() {
        return this._duoSecurity;
    }
}
exports.IdentityDomainsAuthenticationFactorSettingThirdPartyFactorOutputReference = IdentityDomainsAuthenticationFactorSettingThirdPartyFactorOutputReference;
_s = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingThirdPartyFactorOutputReference[_s] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingThirdPartyFactorOutputReference", version: "1.0.0" };
function identityDomainsAuthenticationFactorSettingTimeoutsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        create: cdktf.stringToTerraform(struct.create),
        delete: cdktf.stringToTerraform(struct.delete),
        update: cdktf.stringToTerraform(struct.update),
    };
}
exports.identityDomainsAuthenticationFactorSettingTimeoutsToTerraform = identityDomainsAuthenticationFactorSettingTimeoutsToTerraform;
function identityDomainsAuthenticationFactorSettingTimeoutsToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {
        create: {
            value: cdktf.stringToHclTerraform(struct.create),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        delete: {
            value: cdktf.stringToHclTerraform(struct.delete),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        update: {
            value: cdktf.stringToHclTerraform(struct.update),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.identityDomainsAuthenticationFactorSettingTimeoutsToHclTerraform = identityDomainsAuthenticationFactorSettingTimeoutsToHclTerraform;
class IdentityDomainsAuthenticationFactorSettingTimeoutsOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false);
        this.isEmptyObject = false;
    }
    get internalValue() {
        if (this.resolvableValue) {
            return this.resolvableValue;
        }
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._create !== undefined) {
            hasAnyValues = true;
            internalValueResult.create = this._create;
        }
        if (this._delete !== undefined) {
            hasAnyValues = true;
            internalValueResult.delete = this._delete;
        }
        if (this._update !== undefined) {
            hasAnyValues = true;
            internalValueResult.update = this._update;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this.resolvableValue = undefined;
            this._create = undefined;
            this._delete = undefined;
            this._update = undefined;
        }
        else if (cdktf.Tokenization.isResolvable(value)) {
            this.isEmptyObject = false;
            this.resolvableValue = value;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this.resolvableValue = undefined;
            this._create = value.create;
            this._delete = value.delete;
            this._update = value.update;
        }
    }
    get create() {
        return this.getStringAttribute('create');
    }
    set create(value) {
        this._create = value;
    }
    resetCreate() {
        this._create = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get createInput() {
        return this._create;
    }
    get delete() {
        return this.getStringAttribute('delete');
    }
    set delete(value) {
        this._delete = value;
    }
    resetDelete() {
        this._delete = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get deleteInput() {
        return this._delete;
    }
    get update() {
        return this.getStringAttribute('update');
    }
    set update(value) {
        this._update = value;
    }
    resetUpdate() {
        this._update = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get updateInput() {
        return this._update;
    }
}
exports.IdentityDomainsAuthenticationFactorSettingTimeoutsOutputReference = IdentityDomainsAuthenticationFactorSettingTimeoutsOutputReference;
_t = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingTimeoutsOutputReference[_t] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingTimeoutsOutputReference", version: "1.0.0" };
function identityDomainsAuthenticationFactorSettingTotpSettingsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        email_otp_validity_duration_in_mins: cdktf.numberToTerraform(struct.emailOtpValidityDurationInMins),
        email_passcode_length: cdktf.numberToTerraform(struct.emailPasscodeLength),
        hashing_algorithm: cdktf.stringToTerraform(struct.hashingAlgorithm),
        jwt_validity_duration_in_secs: cdktf.numberToTerraform(struct.jwtValidityDurationInSecs),
        key_refresh_interval_in_days: cdktf.numberToTerraform(struct.keyRefreshIntervalInDays),
        passcode_length: cdktf.numberToTerraform(struct.passcodeLength),
        sms_otp_validity_duration_in_mins: cdktf.numberToTerraform(struct.smsOtpValidityDurationInMins),
        sms_passcode_length: cdktf.numberToTerraform(struct.smsPasscodeLength),
        time_step_in_secs: cdktf.numberToTerraform(struct.timeStepInSecs),
        time_step_tolerance: cdktf.numberToTerraform(struct.timeStepTolerance),
    };
}
exports.identityDomainsAuthenticationFactorSettingTotpSettingsToTerraform = identityDomainsAuthenticationFactorSettingTotpSettingsToTerraform;
function identityDomainsAuthenticationFactorSettingTotpSettingsToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {
        email_otp_validity_duration_in_mins: {
            value: cdktf.numberToHclTerraform(struct.emailOtpValidityDurationInMins),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        email_passcode_length: {
            value: cdktf.numberToHclTerraform(struct.emailPasscodeLength),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        hashing_algorithm: {
            value: cdktf.stringToHclTerraform(struct.hashingAlgorithm),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        jwt_validity_duration_in_secs: {
            value: cdktf.numberToHclTerraform(struct.jwtValidityDurationInSecs),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        key_refresh_interval_in_days: {
            value: cdktf.numberToHclTerraform(struct.keyRefreshIntervalInDays),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        passcode_length: {
            value: cdktf.numberToHclTerraform(struct.passcodeLength),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        sms_otp_validity_duration_in_mins: {
            value: cdktf.numberToHclTerraform(struct.smsOtpValidityDurationInMins),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        sms_passcode_length: {
            value: cdktf.numberToHclTerraform(struct.smsPasscodeLength),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        time_step_in_secs: {
            value: cdktf.numberToHclTerraform(struct.timeStepInSecs),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        time_step_tolerance: {
            value: cdktf.numberToHclTerraform(struct.timeStepTolerance),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.identityDomainsAuthenticationFactorSettingTotpSettingsToHclTerraform = identityDomainsAuthenticationFactorSettingTotpSettingsToHclTerraform;
class IdentityDomainsAuthenticationFactorSettingTotpSettingsOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._emailOtpValidityDurationInMins !== undefined) {
            hasAnyValues = true;
            internalValueResult.emailOtpValidityDurationInMins = this._emailOtpValidityDurationInMins;
        }
        if (this._emailPasscodeLength !== undefined) {
            hasAnyValues = true;
            internalValueResult.emailPasscodeLength = this._emailPasscodeLength;
        }
        if (this._hashingAlgorithm !== undefined) {
            hasAnyValues = true;
            internalValueResult.hashingAlgorithm = this._hashingAlgorithm;
        }
        if (this._jwtValidityDurationInSecs !== undefined) {
            hasAnyValues = true;
            internalValueResult.jwtValidityDurationInSecs = this._jwtValidityDurationInSecs;
        }
        if (this._keyRefreshIntervalInDays !== undefined) {
            hasAnyValues = true;
            internalValueResult.keyRefreshIntervalInDays = this._keyRefreshIntervalInDays;
        }
        if (this._passcodeLength !== undefined) {
            hasAnyValues = true;
            internalValueResult.passcodeLength = this._passcodeLength;
        }
        if (this._smsOtpValidityDurationInMins !== undefined) {
            hasAnyValues = true;
            internalValueResult.smsOtpValidityDurationInMins = this._smsOtpValidityDurationInMins;
        }
        if (this._smsPasscodeLength !== undefined) {
            hasAnyValues = true;
            internalValueResult.smsPasscodeLength = this._smsPasscodeLength;
        }
        if (this._timeStepInSecs !== undefined) {
            hasAnyValues = true;
            internalValueResult.timeStepInSecs = this._timeStepInSecs;
        }
        if (this._timeStepTolerance !== undefined) {
            hasAnyValues = true;
            internalValueResult.timeStepTolerance = this._timeStepTolerance;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._emailOtpValidityDurationInMins = undefined;
            this._emailPasscodeLength = undefined;
            this._hashingAlgorithm = undefined;
            this._jwtValidityDurationInSecs = undefined;
            this._keyRefreshIntervalInDays = undefined;
            this._passcodeLength = undefined;
            this._smsOtpValidityDurationInMins = undefined;
            this._smsPasscodeLength = undefined;
            this._timeStepInSecs = undefined;
            this._timeStepTolerance = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._emailOtpValidityDurationInMins = value.emailOtpValidityDurationInMins;
            this._emailPasscodeLength = value.emailPasscodeLength;
            this._hashingAlgorithm = value.hashingAlgorithm;
            this._jwtValidityDurationInSecs = value.jwtValidityDurationInSecs;
            this._keyRefreshIntervalInDays = value.keyRefreshIntervalInDays;
            this._passcodeLength = value.passcodeLength;
            this._smsOtpValidityDurationInMins = value.smsOtpValidityDurationInMins;
            this._smsPasscodeLength = value.smsPasscodeLength;
            this._timeStepInSecs = value.timeStepInSecs;
            this._timeStepTolerance = value.timeStepTolerance;
        }
    }
    get emailOtpValidityDurationInMins() {
        return this.getNumberAttribute('email_otp_validity_duration_in_mins');
    }
    set emailOtpValidityDurationInMins(value) {
        this._emailOtpValidityDurationInMins = value;
    }
    // Temporarily expose input value. Use with caution.
    get emailOtpValidityDurationInMinsInput() {
        return this._emailOtpValidityDurationInMins;
    }
    get emailPasscodeLength() {
        return this.getNumberAttribute('email_passcode_length');
    }
    set emailPasscodeLength(value) {
        this._emailPasscodeLength = value;
    }
    // Temporarily expose input value. Use with caution.
    get emailPasscodeLengthInput() {
        return this._emailPasscodeLength;
    }
    get hashingAlgorithm() {
        return this.getStringAttribute('hashing_algorithm');
    }
    set hashingAlgorithm(value) {
        this._hashingAlgorithm = value;
    }
    // Temporarily expose input value. Use with caution.
    get hashingAlgorithmInput() {
        return this._hashingAlgorithm;
    }
    get jwtValidityDurationInSecs() {
        return this.getNumberAttribute('jwt_validity_duration_in_secs');
    }
    set jwtValidityDurationInSecs(value) {
        this._jwtValidityDurationInSecs = value;
    }
    // Temporarily expose input value. Use with caution.
    get jwtValidityDurationInSecsInput() {
        return this._jwtValidityDurationInSecs;
    }
    get keyRefreshIntervalInDays() {
        return this.getNumberAttribute('key_refresh_interval_in_days');
    }
    set keyRefreshIntervalInDays(value) {
        this._keyRefreshIntervalInDays = value;
    }
    // Temporarily expose input value. Use with caution.
    get keyRefreshIntervalInDaysInput() {
        return this._keyRefreshIntervalInDays;
    }
    get passcodeLength() {
        return this.getNumberAttribute('passcode_length');
    }
    set passcodeLength(value) {
        this._passcodeLength = value;
    }
    // Temporarily expose input value. Use with caution.
    get passcodeLengthInput() {
        return this._passcodeLength;
    }
    get smsOtpValidityDurationInMins() {
        return this.getNumberAttribute('sms_otp_validity_duration_in_mins');
    }
    set smsOtpValidityDurationInMins(value) {
        this._smsOtpValidityDurationInMins = value;
    }
    // Temporarily expose input value. Use with caution.
    get smsOtpValidityDurationInMinsInput() {
        return this._smsOtpValidityDurationInMins;
    }
    get smsPasscodeLength() {
        return this.getNumberAttribute('sms_passcode_length');
    }
    set smsPasscodeLength(value) {
        this._smsPasscodeLength = value;
    }
    // Temporarily expose input value. Use with caution.
    get smsPasscodeLengthInput() {
        return this._smsPasscodeLength;
    }
    get timeStepInSecs() {
        return this.getNumberAttribute('time_step_in_secs');
    }
    set timeStepInSecs(value) {
        this._timeStepInSecs = value;
    }
    // Temporarily expose input value. Use with caution.
    get timeStepInSecsInput() {
        return this._timeStepInSecs;
    }
    get timeStepTolerance() {
        return this.getNumberAttribute('time_step_tolerance');
    }
    set timeStepTolerance(value) {
        this._timeStepTolerance = value;
    }
    // Temporarily expose input value. Use with caution.
    get timeStepToleranceInput() {
        return this._timeStepTolerance;
    }
}
exports.IdentityDomainsAuthenticationFactorSettingTotpSettingsOutputReference = IdentityDomainsAuthenticationFactorSettingTotpSettingsOutputReference;
_u = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingTotpSettingsOutputReference[_u] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingTotpSettingsOutputReference", version: "1.0.0" };
function identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettingsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        attestation: cdktf.stringToTerraform(struct.attestation),
        authenticator_selection_attachment: cdktf.stringToTerraform(struct.authenticatorSelectionAttachment),
        authenticator_selection_require_resident_key: cdktf.booleanToTerraform(struct.authenticatorSelectionRequireResidentKey),
        authenticator_selection_resident_key: cdktf.stringToTerraform(struct.authenticatorSelectionResidentKey),
        authenticator_selection_user_verification: cdktf.stringToTerraform(struct.authenticatorSelectionUserVerification),
        domain_validation_level: cdktf.numberToTerraform(struct.domainValidationLevel),
        exclude_credentials: cdktf.booleanToTerraform(struct.excludeCredentials),
        public_key_types: cdktf.listMapper(cdktf.stringToTerraform, false)(struct.publicKeyTypes),
        timeout: cdktf.numberToTerraform(struct.timeout),
    };
}
exports.identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettingsToTerraform = identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettingsToTerraform;
function identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettingsToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {
        attestation: {
            value: cdktf.stringToHclTerraform(struct.attestation),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        authenticator_selection_attachment: {
            value: cdktf.stringToHclTerraform(struct.authenticatorSelectionAttachment),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        authenticator_selection_require_resident_key: {
            value: cdktf.booleanToHclTerraform(struct.authenticatorSelectionRequireResidentKey),
            isBlock: false,
            type: "simple",
            storageClassType: "boolean",
        },
        authenticator_selection_resident_key: {
            value: cdktf.stringToHclTerraform(struct.authenticatorSelectionResidentKey),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        authenticator_selection_user_verification: {
            value: cdktf.stringToHclTerraform(struct.authenticatorSelectionUserVerification),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        domain_validation_level: {
            value: cdktf.numberToHclTerraform(struct.domainValidationLevel),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        exclude_credentials: {
            value: cdktf.booleanToHclTerraform(struct.excludeCredentials),
            isBlock: false,
            type: "simple",
            storageClassType: "boolean",
        },
        public_key_types: {
            value: cdktf.listMapperHcl(cdktf.stringToHclTerraform, false)(struct.publicKeyTypes),
            isBlock: false,
            type: "list",
            storageClassType: "stringList",
        },
        timeout: {
            value: cdktf.numberToHclTerraform(struct.timeout),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettingsToHclTerraform = identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettingsToHclTerraform;
class IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettingsOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._attestation !== undefined) {
            hasAnyValues = true;
            internalValueResult.attestation = this._attestation;
        }
        if (this._authenticatorSelectionAttachment !== undefined) {
            hasAnyValues = true;
            internalValueResult.authenticatorSelectionAttachment = this._authenticatorSelectionAttachment;
        }
        if (this._authenticatorSelectionRequireResidentKey !== undefined) {
            hasAnyValues = true;
            internalValueResult.authenticatorSelectionRequireResidentKey = this._authenticatorSelectionRequireResidentKey;
        }
        if (this._authenticatorSelectionResidentKey !== undefined) {
            hasAnyValues = true;
            internalValueResult.authenticatorSelectionResidentKey = this._authenticatorSelectionResidentKey;
        }
        if (this._authenticatorSelectionUserVerification !== undefined) {
            hasAnyValues = true;
            internalValueResult.authenticatorSelectionUserVerification = this._authenticatorSelectionUserVerification;
        }
        if (this._domainValidationLevel !== undefined) {
            hasAnyValues = true;
            internalValueResult.domainValidationLevel = this._domainValidationLevel;
        }
        if (this._excludeCredentials !== undefined) {
            hasAnyValues = true;
            internalValueResult.excludeCredentials = this._excludeCredentials;
        }
        if (this._publicKeyTypes !== undefined) {
            hasAnyValues = true;
            internalValueResult.publicKeyTypes = this._publicKeyTypes;
        }
        if (this._timeout !== undefined) {
            hasAnyValues = true;
            internalValueResult.timeout = this._timeout;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._attestation = undefined;
            this._authenticatorSelectionAttachment = undefined;
            this._authenticatorSelectionRequireResidentKey = undefined;
            this._authenticatorSelectionResidentKey = undefined;
            this._authenticatorSelectionUserVerification = undefined;
            this._domainValidationLevel = undefined;
            this._excludeCredentials = undefined;
            this._publicKeyTypes = undefined;
            this._timeout = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._attestation = value.attestation;
            this._authenticatorSelectionAttachment = value.authenticatorSelectionAttachment;
            this._authenticatorSelectionRequireResidentKey = value.authenticatorSelectionRequireResidentKey;
            this._authenticatorSelectionResidentKey = value.authenticatorSelectionResidentKey;
            this._authenticatorSelectionUserVerification = value.authenticatorSelectionUserVerification;
            this._domainValidationLevel = value.domainValidationLevel;
            this._excludeCredentials = value.excludeCredentials;
            this._publicKeyTypes = value.publicKeyTypes;
            this._timeout = value.timeout;
        }
    }
    get attestation() {
        return this.getStringAttribute('attestation');
    }
    set attestation(value) {
        this._attestation = value;
    }
    // Temporarily expose input value. Use with caution.
    get attestationInput() {
        return this._attestation;
    }
    get authenticatorSelectionAttachment() {
        return this.getStringAttribute('authenticator_selection_attachment');
    }
    set authenticatorSelectionAttachment(value) {
        this._authenticatorSelectionAttachment = value;
    }
    // Temporarily expose input value. Use with caution.
    get authenticatorSelectionAttachmentInput() {
        return this._authenticatorSelectionAttachment;
    }
    get authenticatorSelectionRequireResidentKey() {
        return this.getBooleanAttribute('authenticator_selection_require_resident_key');
    }
    set authenticatorSelectionRequireResidentKey(value) {
        this._authenticatorSelectionRequireResidentKey = value;
    }
    // Temporarily expose input value. Use with caution.
    get authenticatorSelectionRequireResidentKeyInput() {
        return this._authenticatorSelectionRequireResidentKey;
    }
    get authenticatorSelectionResidentKey() {
        return this.getStringAttribute('authenticator_selection_resident_key');
    }
    set authenticatorSelectionResidentKey(value) {
        this._authenticatorSelectionResidentKey = value;
    }
    // Temporarily expose input value. Use with caution.
    get authenticatorSelectionResidentKeyInput() {
        return this._authenticatorSelectionResidentKey;
    }
    get authenticatorSelectionUserVerification() {
        return this.getStringAttribute('authenticator_selection_user_verification');
    }
    set authenticatorSelectionUserVerification(value) {
        this._authenticatorSelectionUserVerification = value;
    }
    // Temporarily expose input value. Use with caution.
    get authenticatorSelectionUserVerificationInput() {
        return this._authenticatorSelectionUserVerification;
    }
    get domainValidationLevel() {
        return this.getNumberAttribute('domain_validation_level');
    }
    set domainValidationLevel(value) {
        this._domainValidationLevel = value;
    }
    resetDomainValidationLevel() {
        this._domainValidationLevel = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get domainValidationLevelInput() {
        return this._domainValidationLevel;
    }
    get excludeCredentials() {
        return this.getBooleanAttribute('exclude_credentials');
    }
    set excludeCredentials(value) {
        this._excludeCredentials = value;
    }
    // Temporarily expose input value. Use with caution.
    get excludeCredentialsInput() {
        return this._excludeCredentials;
    }
    get publicKeyTypes() {
        return this.getListAttribute('public_key_types');
    }
    set publicKeyTypes(value) {
        this._publicKeyTypes = value;
    }
    // Temporarily expose input value. Use with caution.
    get publicKeyTypesInput() {
        return this._publicKeyTypes;
    }
    get timeout() {
        return this.getNumberAttribute('timeout');
    }
    set timeout(value) {
        this._timeout = value;
    }
    // Temporarily expose input value. Use with caution.
    get timeoutInput() {
        return this._timeout;
    }
}
exports.IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettingsOutputReference = IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettingsOutputReference;
_v = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettingsOutputReference[_v] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettingsOutputReference", version: "1.0.0" };
function identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsDuoSecuritySettingsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        api_hostname: cdktf.stringToTerraform(struct.apiHostname),
        attestation_key: cdktf.stringToTerraform(struct.attestationKey),
        integration_key: cdktf.stringToTerraform(struct.integrationKey),
        secret_key: cdktf.stringToTerraform(struct.secretKey),
        user_mapping_attribute: cdktf.stringToTerraform(struct.userMappingAttribute),
    };
}
exports.identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsDuoSecuritySettingsToTerraform = identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsDuoSecuritySettingsToTerraform;
function identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsDuoSecuritySettingsToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {
        api_hostname: {
            value: cdktf.stringToHclTerraform(struct.apiHostname),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        attestation_key: {
            value: cdktf.stringToHclTerraform(struct.attestationKey),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        integration_key: {
            value: cdktf.stringToHclTerraform(struct.integrationKey),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        secret_key: {
            value: cdktf.stringToHclTerraform(struct.secretKey),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        user_mapping_attribute: {
            value: cdktf.stringToHclTerraform(struct.userMappingAttribute),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsDuoSecuritySettingsToHclTerraform = identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsDuoSecuritySettingsToHclTerraform;
class IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsDuoSecuritySettingsOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._apiHostname !== undefined) {
            hasAnyValues = true;
            internalValueResult.apiHostname = this._apiHostname;
        }
        if (this._attestationKey !== undefined) {
            hasAnyValues = true;
            internalValueResult.attestationKey = this._attestationKey;
        }
        if (this._integrationKey !== undefined) {
            hasAnyValues = true;
            internalValueResult.integrationKey = this._integrationKey;
        }
        if (this._secretKey !== undefined) {
            hasAnyValues = true;
            internalValueResult.secretKey = this._secretKey;
        }
        if (this._userMappingAttribute !== undefined) {
            hasAnyValues = true;
            internalValueResult.userMappingAttribute = this._userMappingAttribute;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._apiHostname = undefined;
            this._attestationKey = undefined;
            this._integrationKey = undefined;
            this._secretKey = undefined;
            this._userMappingAttribute = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._apiHostname = value.apiHostname;
            this._attestationKey = value.attestationKey;
            this._integrationKey = value.integrationKey;
            this._secretKey = value.secretKey;
            this._userMappingAttribute = value.userMappingAttribute;
        }
    }
    get apiHostname() {
        return this.getStringAttribute('api_hostname');
    }
    set apiHostname(value) {
        this._apiHostname = value;
    }
    // Temporarily expose input value. Use with caution.
    get apiHostnameInput() {
        return this._apiHostname;
    }
    get attestationKey() {
        return this.getStringAttribute('attestation_key');
    }
    set attestationKey(value) {
        this._attestationKey = value;
    }
    resetAttestationKey() {
        this._attestationKey = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get attestationKeyInput() {
        return this._attestationKey;
    }
    get integrationKey() {
        return this.getStringAttribute('integration_key');
    }
    set integrationKey(value) {
        this._integrationKey = value;
    }
    // Temporarily expose input value. Use with caution.
    get integrationKeyInput() {
        return this._integrationKey;
    }
    get secretKey() {
        return this.getStringAttribute('secret_key');
    }
    set secretKey(value) {
        this._secretKey = value;
    }
    // Temporarily expose input value. Use with caution.
    get secretKeyInput() {
        return this._secretKey;
    }
    get userMappingAttribute() {
        return this.getStringAttribute('user_mapping_attribute');
    }
    set userMappingAttribute(value) {
        this._userMappingAttribute = value;
    }
    // Temporarily expose input value. Use with caution.
    get userMappingAttributeInput() {
        return this._userMappingAttribute;
    }
}
exports.IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsDuoSecuritySettingsOutputReference = IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsDuoSecuritySettingsOutputReference;
_w = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsDuoSecuritySettingsOutputReference[_w] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsDuoSecuritySettingsOutputReference", version: "1.0.0" };
function identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        duo_security_settings: identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsDuoSecuritySettingsToTerraform(struct.duoSecuritySettings),
    };
}
exports.identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsToTerraform = identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsToTerraform;
function identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {
        duo_security_settings: {
            value: identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsDuoSecuritySettingsToHclTerraform(struct.duoSecuritySettings),
            isBlock: true,
            type: "list",
            storageClassType: "IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsDuoSecuritySettingsList",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsToHclTerraform = identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsToHclTerraform;
class IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
        // duo_security_settings - computed: false, optional: true, required: false
        this._duoSecuritySettings = new IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsDuoSecuritySettingsOutputReference(this, "duo_security_settings");
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._duoSecuritySettings?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.duoSecuritySettings = this._duoSecuritySettings?.internalValue;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._duoSecuritySettings.internalValue = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._duoSecuritySettings.internalValue = value.duoSecuritySettings;
        }
    }
    get duoSecuritySettings() {
        return this._duoSecuritySettings;
    }
    putDuoSecuritySettings(value) {
        this._duoSecuritySettings.internalValue = value;
    }
    resetDuoSecuritySettings() {
        this._duoSecuritySettings.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get duoSecuritySettingsInput() {
        return this._duoSecuritySettings.internalValue;
    }
}
exports.IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsOutputReference = IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsOutputReference;
_x = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsOutputReference[_x] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsOutputReference", version: "1.0.0" };
/**
* Represents a {@link https://registry.terraform.io/providers/oracle/oci/6.18.0/docs/resources/identity_domains_authentication_factor_setting oci_identity_domains_authentication_factor_setting}
*/
class IdentityDomainsAuthenticationFactorSetting extends cdktf.TerraformResource {
    // ==============
    // STATIC Methods
    // ==============
    /**
    * Generates CDKTF code for importing a IdentityDomainsAuthenticationFactorSetting resource upon running "cdktf plan <stack-name>"
    * @param scope The scope in which to define this construct
    * @param importToId The construct id used in the generated config for the IdentityDomainsAuthenticationFactorSetting to import
    * @param importFromId The id of the existing IdentityDomainsAuthenticationFactorSetting that should be imported. Refer to the {@link https://registry.terraform.io/providers/oracle/oci/6.18.0/docs/resources/identity_domains_authentication_factor_setting#import import section} in the documentation of this resource for the id to use
    * @param provider? Optional instance of the provider where the IdentityDomainsAuthenticationFactorSetting to import is found
    */
    static generateConfigForImport(scope, importToId, importFromId, provider) {
        return new cdktf.ImportableResource(scope, importToId, { terraformResourceType: "oci_identity_domains_authentication_factor_setting", importId: importFromId, provider });
    }
    // ===========
    // INITIALIZER
    // ===========
    /**
    * Create a new {@link https://registry.terraform.io/providers/oracle/oci/6.18.0/docs/resources/identity_domains_authentication_factor_setting oci_identity_domains_authentication_factor_setting} Resource
    *
    * @param scope The scope in which to define this construct
    * @param id The scoped construct ID. Must be unique amongst siblings in the same scope
    * @param options IdentityDomainsAuthenticationFactorSettingConfig
    */
    constructor(scope, id, config) {
        super(scope, id, {
            terraformResourceType: 'oci_identity_domains_authentication_factor_setting',
            terraformGeneratorMetadata: {
                providerName: 'oci',
                providerVersion: '6.18.0',
                providerVersionConstraint: '~> 6.18.0'
            },
            provider: config.provider,
            dependsOn: config.dependsOn,
            count: config.count,
            lifecycle: config.lifecycle,
            provisioners: config.provisioners,
            connection: config.connection,
            forEach: config.forEach
        });
        // idcs_created_by - computed: true, optional: false, required: false
        this._idcsCreatedBy = new IdentityDomainsAuthenticationFactorSettingIdcsCreatedByList(this, "idcs_created_by", false);
        // idcs_last_modified_by - computed: true, optional: false, required: false
        this._idcsLastModifiedBy = new IdentityDomainsAuthenticationFactorSettingIdcsLastModifiedByList(this, "idcs_last_modified_by", false);
        // meta - computed: true, optional: false, required: false
        this._meta = new IdentityDomainsAuthenticationFactorSettingMetaList(this, "meta", false);
        // bypass_code_settings - computed: false, optional: false, required: true
        this._bypassCodeSettings = new IdentityDomainsAuthenticationFactorSettingBypassCodeSettingsOutputReference(this, "bypass_code_settings");
        // client_app_settings - computed: false, optional: false, required: true
        this._clientAppSettings = new IdentityDomainsAuthenticationFactorSettingClientAppSettingsOutputReference(this, "client_app_settings");
        // compliance_policy - computed: false, optional: false, required: true
        this._compliancePolicy = new IdentityDomainsAuthenticationFactorSettingCompliancePolicyList(this, "compliance_policy", false);
        // email_settings - computed: false, optional: true, required: false
        this._emailSettings = new IdentityDomainsAuthenticationFactorSettingEmailSettingsOutputReference(this, "email_settings");
        // endpoint_restrictions - computed: false, optional: false, required: true
        this._endpointRestrictions = new IdentityDomainsAuthenticationFactorSettingEndpointRestrictionsOutputReference(this, "endpoint_restrictions");
        // identity_store_settings - computed: false, optional: true, required: false
        this._identityStoreSettings = new IdentityDomainsAuthenticationFactorSettingIdentityStoreSettingsOutputReference(this, "identity_store_settings");
        // notification_settings - computed: false, optional: false, required: true
        this._notificationSettings = new IdentityDomainsAuthenticationFactorSettingNotificationSettingsOutputReference(this, "notification_settings");
        // tags - computed: false, optional: true, required: false
        this._tags = new IdentityDomainsAuthenticationFactorSettingTagsList(this, "tags", false);
        // third_party_factor - computed: false, optional: true, required: false
        this._thirdPartyFactor = new IdentityDomainsAuthenticationFactorSettingThirdPartyFactorOutputReference(this, "third_party_factor");
        // timeouts - computed: false, optional: true, required: false
        this._timeouts = new IdentityDomainsAuthenticationFactorSettingTimeoutsOutputReference(this, "timeouts");
        // totp_settings - computed: false, optional: false, required: true
        this._totpSettings = new IdentityDomainsAuthenticationFactorSettingTotpSettingsOutputReference(this, "totp_settings");
        // urnietfparamsscimschemasoracleidcsextensionfido_authentication_factor_settings - computed: false, optional: true, required: false
        this._urnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettings = new IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettingsOutputReference(this, "urnietfparamsscimschemasoracleidcsextensionfido_authentication_factor_settings");
        // urnietfparamsscimschemasoracleidcsextensionthird_party_authentication_factor_settings - computed: false, optional: true, required: false
        this._urnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettings = new IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsOutputReference(this, "urnietfparamsscimschemasoracleidcsextensionthird_party_authentication_factor_settings");
        this._attributeSets = config.attributeSets;
        this._attributes = config.attributes;
        this._authenticationFactorSettingId = config.authenticationFactorSettingId;
        this._authorization = config.authorization;
        this._autoEnrollEmailFactorDisabled = config.autoEnrollEmailFactorDisabled;
        this._bypassCodeEnabled = config.bypassCodeEnabled;
        this._emailEnabled = config.emailEnabled;
        this._fidoAuthenticatorEnabled = config.fidoAuthenticatorEnabled;
        this._hideBackupFactorEnabled = config.hideBackupFactorEnabled;
        this._idcsEndpoint = config.idcsEndpoint;
        this._mfaEnrollmentType = config.mfaEnrollmentType;
        this._ocid = config.ocid;
        this._phoneCallEnabled = config.phoneCallEnabled;
        this._pushEnabled = config.pushEnabled;
        this._resourceTypeSchemaVersion = config.resourceTypeSchemaVersion;
        this._schemas = config.schemas;
        this._securityQuestionsEnabled = config.securityQuestionsEnabled;
        this._smsEnabled = config.smsEnabled;
        this._totpEnabled = config.totpEnabled;
        this._userEnrollmentDisabledFactors = config.userEnrollmentDisabledFactors;
        this._yubicoOtpEnabled = config.yubicoOtpEnabled;
        this._bypassCodeSettings.internalValue = config.bypassCodeSettings;
        this._clientAppSettings.internalValue = config.clientAppSettings;
        this._compliancePolicy.internalValue = config.compliancePolicy;
        this._emailSettings.internalValue = config.emailSettings;
        this._endpointRestrictions.internalValue = config.endpointRestrictions;
        this._identityStoreSettings.internalValue = config.identityStoreSettings;
        this._notificationSettings.internalValue = config.notificationSettings;
        this._tags.internalValue = config.tags;
        this._thirdPartyFactor.internalValue = config.thirdPartyFactor;
        this._timeouts.internalValue = config.timeouts;
        this._totpSettings.internalValue = config.totpSettings;
        this._urnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettings.internalValue = config.urnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettings;
        this._urnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettings.internalValue = config.urnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettings;
    }
    get attributeSets() {
        return this.getListAttribute('attribute_sets');
    }
    set attributeSets(value) {
        this._attributeSets = value;
    }
    resetAttributeSets() {
        this._attributeSets = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get attributeSetsInput() {
        return this._attributeSets;
    }
    get attributes() {
        return this.getStringAttribute('attributes');
    }
    set attributes(value) {
        this._attributes = value;
    }
    resetAttributes() {
        this._attributes = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get attributesInput() {
        return this._attributes;
    }
    get authenticationFactorSettingId() {
        return this.getStringAttribute('authentication_factor_setting_id');
    }
    set authenticationFactorSettingId(value) {
        this._authenticationFactorSettingId = value;
    }
    // Temporarily expose input value. Use with caution.
    get authenticationFactorSettingIdInput() {
        return this._authenticationFactorSettingId;
    }
    get authorization() {
        return this.getStringAttribute('authorization');
    }
    set authorization(value) {
        this._authorization = value;
    }
    resetAuthorization() {
        this._authorization = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get authorizationInput() {
        return this._authorization;
    }
    get autoEnrollEmailFactorDisabled() {
        return this.getBooleanAttribute('auto_enroll_email_factor_disabled');
    }
    set autoEnrollEmailFactorDisabled(value) {
        this._autoEnrollEmailFactorDisabled = value;
    }
    resetAutoEnrollEmailFactorDisabled() {
        this._autoEnrollEmailFactorDisabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get autoEnrollEmailFactorDisabledInput() {
        return this._autoEnrollEmailFactorDisabled;
    }
    get bypassCodeEnabled() {
        return this.getBooleanAttribute('bypass_code_enabled');
    }
    set bypassCodeEnabled(value) {
        this._bypassCodeEnabled = value;
    }
    // Temporarily expose input value. Use with caution.
    get bypassCodeEnabledInput() {
        return this._bypassCodeEnabled;
    }
    // compartment_ocid - computed: true, optional: false, required: false
    get compartmentOcid() {
        return this.getStringAttribute('compartment_ocid');
    }
    // delete_in_progress - computed: true, optional: false, required: false
    get deleteInProgress() {
        return this.getBooleanAttribute('delete_in_progress');
    }
    // domain_ocid - computed: true, optional: false, required: false
    get domainOcid() {
        return this.getStringAttribute('domain_ocid');
    }
    get emailEnabled() {
        return this.getBooleanAttribute('email_enabled');
    }
    set emailEnabled(value) {
        this._emailEnabled = value;
    }
    resetEmailEnabled() {
        this._emailEnabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get emailEnabledInput() {
        return this._emailEnabled;
    }
    get fidoAuthenticatorEnabled() {
        return this.getBooleanAttribute('fido_authenticator_enabled');
    }
    set fidoAuthenticatorEnabled(value) {
        this._fidoAuthenticatorEnabled = value;
    }
    resetFidoAuthenticatorEnabled() {
        this._fidoAuthenticatorEnabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get fidoAuthenticatorEnabledInput() {
        return this._fidoAuthenticatorEnabled;
    }
    get hideBackupFactorEnabled() {
        return this.getBooleanAttribute('hide_backup_factor_enabled');
    }
    set hideBackupFactorEnabled(value) {
        this._hideBackupFactorEnabled = value;
    }
    resetHideBackupFactorEnabled() {
        this._hideBackupFactorEnabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get hideBackupFactorEnabledInput() {
        return this._hideBackupFactorEnabled;
    }
    // id - computed: true, optional: false, required: false
    get id() {
        return this.getStringAttribute('id');
    }
    get idcsCreatedBy() {
        return this._idcsCreatedBy;
    }
    get idcsEndpoint() {
        return this.getStringAttribute('idcs_endpoint');
    }
    set idcsEndpoint(value) {
        this._idcsEndpoint = value;
    }
    // Temporarily expose input value. Use with caution.
    get idcsEndpointInput() {
        return this._idcsEndpoint;
    }
    get idcsLastModifiedBy() {
        return this._idcsLastModifiedBy;
    }
    // idcs_last_upgraded_in_release - computed: true, optional: false, required: false
    get idcsLastUpgradedInRelease() {
        return this.getStringAttribute('idcs_last_upgraded_in_release');
    }
    // idcs_prevented_operations - computed: true, optional: false, required: false
    get idcsPreventedOperations() {
        return this.getListAttribute('idcs_prevented_operations');
    }
    get meta() {
        return this._meta;
    }
    // mfa_enabled_category - computed: true, optional: false, required: false
    get mfaEnabledCategory() {
        return this.getStringAttribute('mfa_enabled_category');
    }
    get mfaEnrollmentType() {
        return this.getStringAttribute('mfa_enrollment_type');
    }
    set mfaEnrollmentType(value) {
        this._mfaEnrollmentType = value;
    }
    // Temporarily expose input value. Use with caution.
    get mfaEnrollmentTypeInput() {
        return this._mfaEnrollmentType;
    }
    get ocid() {
        return this.getStringAttribute('ocid');
    }
    set ocid(value) {
        this._ocid = value;
    }
    resetOcid() {
        this._ocid = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get ocidInput() {
        return this._ocid;
    }
    get phoneCallEnabled() {
        return this.getBooleanAttribute('phone_call_enabled');
    }
    set phoneCallEnabled(value) {
        this._phoneCallEnabled = value;
    }
    resetPhoneCallEnabled() {
        this._phoneCallEnabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get phoneCallEnabledInput() {
        return this._phoneCallEnabled;
    }
    get pushEnabled() {
        return this.getBooleanAttribute('push_enabled');
    }
    set pushEnabled(value) {
        this._pushEnabled = value;
    }
    // Temporarily expose input value. Use with caution.
    get pushEnabledInput() {
        return this._pushEnabled;
    }
    get resourceTypeSchemaVersion() {
        return this.getStringAttribute('resource_type_schema_version');
    }
    set resourceTypeSchemaVersion(value) {
        this._resourceTypeSchemaVersion = value;
    }
    resetResourceTypeSchemaVersion() {
        this._resourceTypeSchemaVersion = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get resourceTypeSchemaVersionInput() {
        return this._resourceTypeSchemaVersion;
    }
    get schemas() {
        return this.getListAttribute('schemas');
    }
    set schemas(value) {
        this._schemas = value;
    }
    // Temporarily expose input value. Use with caution.
    get schemasInput() {
        return this._schemas;
    }
    get securityQuestionsEnabled() {
        return this.getBooleanAttribute('security_questions_enabled');
    }
    set securityQuestionsEnabled(value) {
        this._securityQuestionsEnabled = value;
    }
    // Temporarily expose input value. Use with caution.
    get securityQuestionsEnabledInput() {
        return this._securityQuestionsEnabled;
    }
    get smsEnabled() {
        return this.getBooleanAttribute('sms_enabled');
    }
    set smsEnabled(value) {
        this._smsEnabled = value;
    }
    // Temporarily expose input value. Use with caution.
    get smsEnabledInput() {
        return this._smsEnabled;
    }
    // tenancy_ocid - computed: true, optional: false, required: false
    get tenancyOcid() {
        return this.getStringAttribute('tenancy_ocid');
    }
    get totpEnabled() {
        return this.getBooleanAttribute('totp_enabled');
    }
    set totpEnabled(value) {
        this._totpEnabled = value;
    }
    // Temporarily expose input value. Use with caution.
    get totpEnabledInput() {
        return this._totpEnabled;
    }
    get userEnrollmentDisabledFactors() {
        return this.getListAttribute('user_enrollment_disabled_factors');
    }
    set userEnrollmentDisabledFactors(value) {
        this._userEnrollmentDisabledFactors = value;
    }
    resetUserEnrollmentDisabledFactors() {
        this._userEnrollmentDisabledFactors = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get userEnrollmentDisabledFactorsInput() {
        return this._userEnrollmentDisabledFactors;
    }
    get yubicoOtpEnabled() {
        return this.getBooleanAttribute('yubico_otp_enabled');
    }
    set yubicoOtpEnabled(value) {
        this._yubicoOtpEnabled = value;
    }
    resetYubicoOtpEnabled() {
        this._yubicoOtpEnabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get yubicoOtpEnabledInput() {
        return this._yubicoOtpEnabled;
    }
    get bypassCodeSettings() {
        return this._bypassCodeSettings;
    }
    putBypassCodeSettings(value) {
        this._bypassCodeSettings.internalValue = value;
    }
    // Temporarily expose input value. Use with caution.
    get bypassCodeSettingsInput() {
        return this._bypassCodeSettings.internalValue;
    }
    get clientAppSettings() {
        return this._clientAppSettings;
    }
    putClientAppSettings(value) {
        this._clientAppSettings.internalValue = value;
    }
    // Temporarily expose input value. Use with caution.
    get clientAppSettingsInput() {
        return this._clientAppSettings.internalValue;
    }
    get compliancePolicy() {
        return this._compliancePolicy;
    }
    putCompliancePolicy(value) {
        this._compliancePolicy.internalValue = value;
    }
    // Temporarily expose input value. Use with caution.
    get compliancePolicyInput() {
        return this._compliancePolicy.internalValue;
    }
    get emailSettings() {
        return this._emailSettings;
    }
    putEmailSettings(value) {
        this._emailSettings.internalValue = value;
    }
    resetEmailSettings() {
        this._emailSettings.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get emailSettingsInput() {
        return this._emailSettings.internalValue;
    }
    get endpointRestrictions() {
        return this._endpointRestrictions;
    }
    putEndpointRestrictions(value) {
        this._endpointRestrictions.internalValue = value;
    }
    // Temporarily expose input value. Use with caution.
    get endpointRestrictionsInput() {
        return this._endpointRestrictions.internalValue;
    }
    get identityStoreSettings() {
        return this._identityStoreSettings;
    }
    putIdentityStoreSettings(value) {
        this._identityStoreSettings.internalValue = value;
    }
    resetIdentityStoreSettings() {
        this._identityStoreSettings.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get identityStoreSettingsInput() {
        return this._identityStoreSettings.internalValue;
    }
    get notificationSettings() {
        return this._notificationSettings;
    }
    putNotificationSettings(value) {
        this._notificationSettings.internalValue = value;
    }
    // Temporarily expose input value. Use with caution.
    get notificationSettingsInput() {
        return this._notificationSettings.internalValue;
    }
    get tags() {
        return this._tags;
    }
    putTags(value) {
        this._tags.internalValue = value;
    }
    resetTags() {
        this._tags.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get tagsInput() {
        return this._tags.internalValue;
    }
    get thirdPartyFactor() {
        return this._thirdPartyFactor;
    }
    putThirdPartyFactor(value) {
        this._thirdPartyFactor.internalValue = value;
    }
    resetThirdPartyFactor() {
        this._thirdPartyFactor.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get thirdPartyFactorInput() {
        return this._thirdPartyFactor.internalValue;
    }
    get timeouts() {
        return this._timeouts;
    }
    putTimeouts(value) {
        this._timeouts.internalValue = value;
    }
    resetTimeouts() {
        this._timeouts.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get timeoutsInput() {
        return this._timeouts.internalValue;
    }
    get totpSettings() {
        return this._totpSettings;
    }
    putTotpSettings(value) {
        this._totpSettings.internalValue = value;
    }
    // Temporarily expose input value. Use with caution.
    get totpSettingsInput() {
        return this._totpSettings.internalValue;
    }
    get urnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettings() {
        return this._urnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettings;
    }
    putUrnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettings(value) {
        this._urnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettings.internalValue = value;
    }
    resetUrnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettings() {
        this._urnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettings.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get urnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettingsInput() {
        return this._urnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettings.internalValue;
    }
    get urnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettings() {
        return this._urnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettings;
    }
    putUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettings(value) {
        this._urnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettings.internalValue = value;
    }
    resetUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettings() {
        this._urnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettings.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get urnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsInput() {
        return this._urnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettings.internalValue;
    }
    // =========
    // SYNTHESIS
    // =========
    synthesizeAttributes() {
        return {
            attribute_sets: cdktf.listMapper(cdktf.stringToTerraform, false)(this._attributeSets),
            attributes: cdktf.stringToTerraform(this._attributes),
            authentication_factor_setting_id: cdktf.stringToTerraform(this._authenticationFactorSettingId),
            authorization: cdktf.stringToTerraform(this._authorization),
            auto_enroll_email_factor_disabled: cdktf.booleanToTerraform(this._autoEnrollEmailFactorDisabled),
            bypass_code_enabled: cdktf.booleanToTerraform(this._bypassCodeEnabled),
            email_enabled: cdktf.booleanToTerraform(this._emailEnabled),
            fido_authenticator_enabled: cdktf.booleanToTerraform(this._fidoAuthenticatorEnabled),
            hide_backup_factor_enabled: cdktf.booleanToTerraform(this._hideBackupFactorEnabled),
            idcs_endpoint: cdktf.stringToTerraform(this._idcsEndpoint),
            mfa_enrollment_type: cdktf.stringToTerraform(this._mfaEnrollmentType),
            ocid: cdktf.stringToTerraform(this._ocid),
            phone_call_enabled: cdktf.booleanToTerraform(this._phoneCallEnabled),
            push_enabled: cdktf.booleanToTerraform(this._pushEnabled),
            resource_type_schema_version: cdktf.stringToTerraform(this._resourceTypeSchemaVersion),
            schemas: cdktf.listMapper(cdktf.stringToTerraform, false)(this._schemas),
            security_questions_enabled: cdktf.booleanToTerraform(this._securityQuestionsEnabled),
            sms_enabled: cdktf.booleanToTerraform(this._smsEnabled),
            totp_enabled: cdktf.booleanToTerraform(this._totpEnabled),
            user_enrollment_disabled_factors: cdktf.listMapper(cdktf.stringToTerraform, false)(this._userEnrollmentDisabledFactors),
            yubico_otp_enabled: cdktf.booleanToTerraform(this._yubicoOtpEnabled),
            bypass_code_settings: identityDomainsAuthenticationFactorSettingBypassCodeSettingsToTerraform(this._bypassCodeSettings.internalValue),
            client_app_settings: identityDomainsAuthenticationFactorSettingClientAppSettingsToTerraform(this._clientAppSettings.internalValue),
            compliance_policy: cdktf.listMapper(identityDomainsAuthenticationFactorSettingCompliancePolicyToTerraform, true)(this._compliancePolicy.internalValue),
            email_settings: identityDomainsAuthenticationFactorSettingEmailSettingsToTerraform(this._emailSettings.internalValue),
            endpoint_restrictions: identityDomainsAuthenticationFactorSettingEndpointRestrictionsToTerraform(this._endpointRestrictions.internalValue),
            identity_store_settings: identityDomainsAuthenticationFactorSettingIdentityStoreSettingsToTerraform(this._identityStoreSettings.internalValue),
            notification_settings: identityDomainsAuthenticationFactorSettingNotificationSettingsToTerraform(this._notificationSettings.internalValue),
            tags: cdktf.listMapper(identityDomainsAuthenticationFactorSettingTagsToTerraform, true)(this._tags.internalValue),
            third_party_factor: identityDomainsAuthenticationFactorSettingThirdPartyFactorToTerraform(this._thirdPartyFactor.internalValue),
            timeouts: identityDomainsAuthenticationFactorSettingTimeoutsToTerraform(this._timeouts.internalValue),
            totp_settings: identityDomainsAuthenticationFactorSettingTotpSettingsToTerraform(this._totpSettings.internalValue),
            urnietfparamsscimschemasoracleidcsextensionfido_authentication_factor_settings: identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettingsToTerraform(this._urnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettings.internalValue),
            urnietfparamsscimschemasoracleidcsextensionthird_party_authentication_factor_settings: identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsToTerraform(this._urnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettings.internalValue),
        };
    }
    synthesizeHclAttributes() {
        const attrs = {
            attribute_sets: {
                value: cdktf.listMapperHcl(cdktf.stringToHclTerraform, false)(this._attributeSets),
                isBlock: false,
                type: "list",
                storageClassType: "stringList",
            },
            attributes: {
                value: cdktf.stringToHclTerraform(this._attributes),
                isBlock: false,
                type: "simple",
                storageClassType: "string",
            },
            authentication_factor_setting_id: {
                value: cdktf.stringToHclTerraform(this._authenticationFactorSettingId),
                isBlock: false,
                type: "simple",
                storageClassType: "string",
            },
            authorization: {
                value: cdktf.stringToHclTerraform(this._authorization),
                isBlock: false,
                type: "simple",
                storageClassType: "string",
            },
            auto_enroll_email_factor_disabled: {
                value: cdktf.booleanToHclTerraform(this._autoEnrollEmailFactorDisabled),
                isBlock: false,
                type: "simple",
                storageClassType: "boolean",
            },
            bypass_code_enabled: {
                value: cdktf.booleanToHclTerraform(this._bypassCodeEnabled),
                isBlock: false,
                type: "simple",
                storageClassType: "boolean",
            },
            email_enabled: {
                value: cdktf.booleanToHclTerraform(this._emailEnabled),
                isBlock: false,
                type: "simple",
                storageClassType: "boolean",
            },
            fido_authenticator_enabled: {
                value: cdktf.booleanToHclTerraform(this._fidoAuthenticatorEnabled),
                isBlock: false,
                type: "simple",
                storageClassType: "boolean",
            },
            hide_backup_factor_enabled: {
                value: cdktf.booleanToHclTerraform(this._hideBackupFactorEnabled),
                isBlock: false,
                type: "simple",
                storageClassType: "boolean",
            },
            idcs_endpoint: {
                value: cdktf.stringToHclTerraform(this._idcsEndpoint),
                isBlock: false,
                type: "simple",
                storageClassType: "string",
            },
            mfa_enrollment_type: {
                value: cdktf.stringToHclTerraform(this._mfaEnrollmentType),
                isBlock: false,
                type: "simple",
                storageClassType: "string",
            },
            ocid: {
                value: cdktf.stringToHclTerraform(this._ocid),
                isBlock: false,
                type: "simple",
                storageClassType: "string",
            },
            phone_call_enabled: {
                value: cdktf.booleanToHclTerraform(this._phoneCallEnabled),
                isBlock: false,
                type: "simple",
                storageClassType: "boolean",
            },
            push_enabled: {
                value: cdktf.booleanToHclTerraform(this._pushEnabled),
                isBlock: false,
                type: "simple",
                storageClassType: "boolean",
            },
            resource_type_schema_version: {
                value: cdktf.stringToHclTerraform(this._resourceTypeSchemaVersion),
                isBlock: false,
                type: "simple",
                storageClassType: "string",
            },
            schemas: {
                value: cdktf.listMapperHcl(cdktf.stringToHclTerraform, false)(this._schemas),
                isBlock: false,
                type: "list",
                storageClassType: "stringList",
            },
            security_questions_enabled: {
                value: cdktf.booleanToHclTerraform(this._securityQuestionsEnabled),
                isBlock: false,
                type: "simple",
                storageClassType: "boolean",
            },
            sms_enabled: {
                value: cdktf.booleanToHclTerraform(this._smsEnabled),
                isBlock: false,
                type: "simple",
                storageClassType: "boolean",
            },
            totp_enabled: {
                value: cdktf.booleanToHclTerraform(this._totpEnabled),
                isBlock: false,
                type: "simple",
                storageClassType: "boolean",
            },
            user_enrollment_disabled_factors: {
                value: cdktf.listMapperHcl(cdktf.stringToHclTerraform, false)(this._userEnrollmentDisabledFactors),
                isBlock: false,
                type: "list",
                storageClassType: "stringList",
            },
            yubico_otp_enabled: {
                value: cdktf.booleanToHclTerraform(this._yubicoOtpEnabled),
                isBlock: false,
                type: "simple",
                storageClassType: "boolean",
            },
            bypass_code_settings: {
                value: identityDomainsAuthenticationFactorSettingBypassCodeSettingsToHclTerraform(this._bypassCodeSettings.internalValue),
                isBlock: true,
                type: "list",
                storageClassType: "IdentityDomainsAuthenticationFactorSettingBypassCodeSettingsList",
            },
            client_app_settings: {
                value: identityDomainsAuthenticationFactorSettingClientAppSettingsToHclTerraform(this._clientAppSettings.internalValue),
                isBlock: true,
                type: "list",
                storageClassType: "IdentityDomainsAuthenticationFactorSettingClientAppSettingsList",
            },
            compliance_policy: {
                value: cdktf.listMapperHcl(identityDomainsAuthenticationFactorSettingCompliancePolicyToHclTerraform, true)(this._compliancePolicy.internalValue),
                isBlock: true,
                type: "list",
                storageClassType: "IdentityDomainsAuthenticationFactorSettingCompliancePolicyList",
            },
            email_settings: {
                value: identityDomainsAuthenticationFactorSettingEmailSettingsToHclTerraform(this._emailSettings.internalValue),
                isBlock: true,
                type: "list",
                storageClassType: "IdentityDomainsAuthenticationFactorSettingEmailSettingsList",
            },
            endpoint_restrictions: {
                value: identityDomainsAuthenticationFactorSettingEndpointRestrictionsToHclTerraform(this._endpointRestrictions.internalValue),
                isBlock: true,
                type: "list",
                storageClassType: "IdentityDomainsAuthenticationFactorSettingEndpointRestrictionsList",
            },
            identity_store_settings: {
                value: identityDomainsAuthenticationFactorSettingIdentityStoreSettingsToHclTerraform(this._identityStoreSettings.internalValue),
                isBlock: true,
                type: "list",
                storageClassType: "IdentityDomainsAuthenticationFactorSettingIdentityStoreSettingsList",
            },
            notification_settings: {
                value: identityDomainsAuthenticationFactorSettingNotificationSettingsToHclTerraform(this._notificationSettings.internalValue),
                isBlock: true,
                type: "list",
                storageClassType: "IdentityDomainsAuthenticationFactorSettingNotificationSettingsList",
            },
            tags: {
                value: cdktf.listMapperHcl(identityDomainsAuthenticationFactorSettingTagsToHclTerraform, true)(this._tags.internalValue),
                isBlock: true,
                type: "list",
                storageClassType: "IdentityDomainsAuthenticationFactorSettingTagsList",
            },
            third_party_factor: {
                value: identityDomainsAuthenticationFactorSettingThirdPartyFactorToHclTerraform(this._thirdPartyFactor.internalValue),
                isBlock: true,
                type: "list",
                storageClassType: "IdentityDomainsAuthenticationFactorSettingThirdPartyFactorList",
            },
            timeouts: {
                value: identityDomainsAuthenticationFactorSettingTimeoutsToHclTerraform(this._timeouts.internalValue),
                isBlock: true,
                type: "struct",
                storageClassType: "IdentityDomainsAuthenticationFactorSettingTimeouts",
            },
            totp_settings: {
                value: identityDomainsAuthenticationFactorSettingTotpSettingsToHclTerraform(this._totpSettings.internalValue),
                isBlock: true,
                type: "list",
                storageClassType: "IdentityDomainsAuthenticationFactorSettingTotpSettingsList",
            },
            urnietfparamsscimschemasoracleidcsextensionfido_authentication_factor_settings: {
                value: identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettingsToHclTerraform(this._urnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettings.internalValue),
                isBlock: true,
                type: "list",
                storageClassType: "IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionfidoAuthenticationFactorSettingsList",
            },
            urnietfparamsscimschemasoracleidcsextensionthird_party_authentication_factor_settings: {
                value: identityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsToHclTerraform(this._urnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettings.internalValue),
                isBlock: true,
                type: "list",
                storageClassType: "IdentityDomainsAuthenticationFactorSettingUrnietfparamsscimschemasoracleidcsextensionthirdPartyAuthenticationFactorSettingsList",
            },
        };
        // remove undefined attributes
        return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
    }
}
exports.IdentityDomainsAuthenticationFactorSetting = IdentityDomainsAuthenticationFactorSetting;
_y = JSII_RTTI_SYMBOL_1;
IdentityDomainsAuthenticationFactorSetting[_y] = { fqn: "rhizo-co-terraform-provider-oci.identityDomainsAuthenticationFactorSetting.IdentityDomainsAuthenticationFactorSetting", version: "1.0.0" };
// =================
// STATIC PROPERTIES
// =================
IdentityDomainsAuthenticationFactorSetting.tfResourceType = "oci_identity_domains_authentication_factor_setting";
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaWRlbnRpdHktZG9tYWlucy1hdXRoZW50aWNhdGlvbi1mYWN0b3Itc2V0dGluZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFJQSwrQkFBK0I7QUEySy9CLFNBQWdCLGtFQUFrRSxDQUFDLE1BQWdFO0lBQ2pKLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE9BQU8sRUFDTixDQUFBO0FBQ0gsQ0FBQztBQVBELGdKQU9DO0FBR0QsU0FBZ0IscUVBQXFFLENBQUMsTUFBZ0U7SUFDcEosSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsRUFDYixDQUFDO0lBQ0YsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBUkQsc0pBUUM7QUFFRCxNQUFhLHNFQUF1RSxTQUFRLEtBQUssQ0FBQyxhQUFhO0lBRzdHOzs7OztNQUtFO0lBQ0YsWUFBbUIsaUJBQTZDLEVBQUUsa0JBQTBCLEVB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SSxFQUFFLE1BQU07Z0JBQ1osZ0JBQWdCLEVBQUUsaUlBQWlJO2FBQ3BKO1NBQ0YsQ0FBQztRQUVGLDhCQUE4QjtRQUM5QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBRSxDQUFDLENBQUE7SUFDNUgsQ0FBQzs7QUFsNEJILGdHQW00QkM7OztBQWo0QkMsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDRyx5REFBYyxHQUFHLG9EQUFvRCxBQUF2RCxDQUF3RCIsInNvdXJjZXNDb250ZW50IjpbIi8vIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nXG4vLyBnZW5lcmF0ZWQgZnJvbSB0ZXJyYWZvcm0gcmVzb3VyY2Ugc2NoZW1hXG5cbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0ICogYXMgY2RrdGYgZnJvbSAnY2RrdGYnO1xuXG4vLyBDb25maWd1cmF0aW9uXG5cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQ29uZmlnIGV4dGVuZHMgY2RrdGYuVGVycmFmb3JtTWV0YUFyZ3VtZW50cyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjYXR0cmlidXRlX3NldHMgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI2F0dHJpYnV0ZV9zZXRzfVxuICAqL1xuICByZWFkb25seSBhdHRyaWJ1dGVTZXRzPzogc3RyaW5nW107XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjYXR0cmlidXRlcyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjYXR0cmlidXRlc31cbiAgKi9cbiAgcmVhZG9ubHkgYXR0cmlidXRlcz86IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNhdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZ19pZCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmdfaWR9XG4gICovXG4gIHJlYWRvbmx5IGF1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0lkOiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjYXV0aG9yaXphdGlvbiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjYXV0aG9yaXphdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgYXV0aG9yaXphdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNhdXRvX2Vucm9sbF9lbWFpbF9mYWN0b3JfZGlzYWJsZWQgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI2F1dG9fZW5yb2xsX2VtYWlsX2ZhY3Rvcl9kaXNhYmxlZH1cbiAgKi9cbiAgcmVhZG9ubHkgYXV0b0Vucm9sbEVtYWlsRmFjdG9yRGlzYWJsZWQ/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjYnlwYXNzX2NvZGVfZW5hYmxlZCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjYnlwYXNzX2NvZGVfZW5hYmxlZH1cbiAgKi9cbiAgcmVhZG9ubHkgYnlwYXNzQ29kZUVuYWJsZWQ6IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNlbWFpbF9lbmFibGVkIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNlbWFpbF9lbmFibGVkfVxuICAqL1xuICByZWFkb25seSBlbWFpbEVuYWJsZWQ/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjZmlkb19hdXRoZW50aWNhdG9yX2VuYWJsZWQgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI2ZpZG9fYXV0aGVudGljYXRvcl9lbmFibGVkfVxuICAqL1xuICByZWFkb25seSBmaWRvQXV0aGVudGljYXRvckVuYWJsZWQ/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjaGlkZV9iYWNrdXBfZmFjdG9yX2VuYWJsZWQgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI2hpZGVfYmFja3VwX2ZhY3Rvcl9lbmFibGVkfVxuICAqL1xuICByZWFkb25seSBoaWRlQmFja3VwRmFjdG9yRW5hYmxlZD86IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNpZGNzX2VuZHBvaW50IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNpZGNzX2VuZHBvaW50fVxuICAqL1xuICByZWFkb25seSBpZGNzRW5kcG9pbnQ6IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNtZmFfZW5yb2xsbWVudF90eXBlIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNtZmFfZW5yb2xsbWVudF90eXBlfVxuICAqL1xuICByZWFkb25seSBtZmFFbnJvbGxtZW50VHlwZTogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI29jaWQgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI29jaWR9XG4gICovXG4gIHJlYWRvbmx5IG9jaWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjcGhvbmVfY2FsbF9lbmFibGVkIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNwaG9uZV9jYWxsX2VuYWJsZWR9XG4gICovXG4gIHJlYWRvbmx5IHBob25lQ2FsbEVuYWJsZWQ/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjcHVzaF9lbmFibGVkIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNwdXNoX2VuYWJsZWR9XG4gICovXG4gIHJlYWRvbmx5IHB1c2hFbmFibGVkOiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjcmVzb3VyY2VfdHlwZV9zY2hlbWFfdmVyc2lvbiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjcmVzb3VyY2VfdHlwZV9zY2hlbWFfdmVyc2lvbn1cbiAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VUeXBlU2NoZW1hVmVyc2lvbj86IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNzY2hlbWFzIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNzY2hlbWFzfVxuICAqL1xuICByZWFkb25seSBzY2hlbWFzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNzZWN1cml0eV9xdWVzdGlvbnNfZW5hYmxlZCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjc2VjdXJpdHlfcXVlc3Rpb25zX2VuYWJsZWR9XG4gICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5UXVlc3Rpb25zRW5hYmxlZDogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI3Ntc19lbmFibGVkIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNzbXNfZW5hYmxlZH1cbiAgKi9cbiAgcmVhZG9ubHkgc21zRW5hYmxlZDogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI3RvdHBfZW5hYmxlZCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjdG90cF9lbmFibGVkfVxuICAqL1xuICByZWFkb25seSB0b3RwRW5hYmxlZDogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI3VzZXJfZW5yb2xsbWVudF9kaXNhYmxlZF9mYWN0b3JzIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyN1c2VyX2Vucm9sbG1lbnRfZGlzYWJsZWRfZmFjdG9yc31cbiAgKi9cbiAgcmVhZG9ubHkgdXNlckVucm9sbG1lbnREaXNhYmxlZEZhY3RvcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyN5dWJpY29fb3RwX2VuYWJsZWQgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI3l1Ymljb19vdHBfZW5hYmxlZH1cbiAgKi9cbiAgcmVhZG9ubHkgeXViaWNvT3RwRW5hYmxlZD86IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogYnlwYXNzX2NvZGVfc2V0dGluZ3MgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjYnlwYXNzX2NvZGVfc2V0dGluZ3MgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI2J5cGFzc19jb2RlX3NldHRpbmdzfVxuICAqL1xuICByZWFkb25seSBieXBhc3NDb2RlU2V0dGluZ3M6IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0J5cGFzc0NvZGVTZXR0aW5ncztcbiAgLyoqXG4gICogY2xpZW50X2FwcF9zZXR0aW5ncyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNjbGllbnRfYXBwX3NldHRpbmdzIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNjbGllbnRfYXBwX3NldHRpbmdzfVxuICAqL1xuICByZWFkb25seSBjbGllbnRBcHBTZXR0aW5nczogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQ2xpZW50QXBwU2V0dGluZ3M7XG4gIC8qKlxuICAqIGNvbXBsaWFuY2VfcG9saWN5IGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI2NvbXBsaWFuY2VfcG9saWN5IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNjb21wbGlhbmNlX3BvbGljeX1cbiAgKi9cbiAgcmVhZG9ubHkgY29tcGxpYW5jZVBvbGljeTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQ29tcGxpYW5jZVBvbGljeVtdIHwgY2RrdGYuSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIGVtYWlsX3NldHRpbmdzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI2VtYWlsX3NldHRpbmdzIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNlbWFpbF9zZXR0aW5nc31cbiAgKi9cbiAgcmVhZG9ubHkgZW1haWxTZXR0aW5ncz86IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0VtYWlsU2V0dGluZ3M7XG4gIC8qKlxuICAqIGVuZHBvaW50X3Jlc3RyaWN0aW9ucyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNlbmRwb2ludF9yZXN0cmljdGlvbnMgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI2VuZHBvaW50X3Jlc3RyaWN0aW9uc31cbiAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnRSZXN0cmljdGlvbnM6IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0VuZHBvaW50UmVzdHJpY3Rpb25zO1xuICAvKipcbiAgKiBpZGVudGl0eV9zdG9yZV9zZXR0aW5ncyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNpZGVudGl0eV9zdG9yZV9zZXR0aW5ncyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjaWRlbnRpdHlfc3RvcmVfc2V0dGluZ3N9XG4gICovXG4gIHJlYWRvbmx5IGlkZW50aXR5U3RvcmVTZXR0aW5ncz86IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0lkZW50aXR5U3RvcmVTZXR0aW5ncztcbiAgLyoqXG4gICogbm90aWZpY2F0aW9uX3NldHRpbmdzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI25vdGlmaWNhdGlvbl9zZXR0aW5ncyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjbm90aWZpY2F0aW9uX3NldHRpbmdzfVxuICAqL1xuICByZWFkb25seSBub3RpZmljYXRpb25TZXR0aW5nczogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nTm90aWZpY2F0aW9uU2V0dGluZ3M7XG4gIC8qKlxuICAqIHRhZ3MgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjdGFncyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjdGFnc31cbiAgKi9cbiAgcmVhZG9ubHkgdGFncz86IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1RhZ3NbXSB8IGNka3RmLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiB0aGlyZF9wYXJ0eV9mYWN0b3IgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjdGhpcmRfcGFydHlfZmFjdG9yIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyN0aGlyZF9wYXJ0eV9mYWN0b3J9XG4gICovXG4gIHJlYWRvbmx5IHRoaXJkUGFydHlGYWN0b3I/OiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUaGlyZFBhcnR5RmFjdG9yO1xuICAvKipcbiAgKiB0aW1lb3V0cyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyN0aW1lb3V0cyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjdGltZW91dHN9XG4gICovXG4gIHJlYWRvbmx5IHRpbWVvdXRzPzogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVGltZW91dHM7XG4gIC8qKlxuICAqIHRvdHBfc2V0dGluZ3MgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjdG90cF9zZXR0aW5ncyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjdG90cF9zZXR0aW5nc31cbiAgKi9cbiAgcmVhZG9ubHkgdG90cFNldHRpbmdzOiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUb3RwU2V0dGluZ3M7XG4gIC8qKlxuICAqIHVybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb25maWRvX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5ncyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyN1cm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9uZmlkb19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZ3MgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI3VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb25maWRvX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nc31cbiAgKi9cbiAgcmVhZG9ubHkgdXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbmZpZG9BdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzPzogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbmZpZG9BdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzO1xuICAvKipcbiAgKiB1cm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9udGhpcmRfcGFydHlfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmdzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI3VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZF9wYXJ0eV9hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZ3MgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI3VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZF9wYXJ0eV9hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZ3N9XG4gICovXG4gIHJlYWRvbmx5IHVybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZFBhcnR5QXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5ncz86IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZFBhcnR5QXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5ncztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWRjc0NyZWF0ZWRCeSB7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdJZGNzQ3JlYXRlZEJ5VG9UZXJyYWZvcm0oc3RydWN0PzogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWRjc0NyZWF0ZWRCeSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdJZGNzQ3JlYXRlZEJ5VG9IY2xUZXJyYWZvcm0oc3RydWN0PzogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWRjc0NyZWF0ZWRCeSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gIH07XG4gIHJldHVybiBhdHRycztcbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0lkY3NDcmVhdGVkQnlPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJbmRleCB0aGUgaW5kZXggb2YgdGhpcyBpdGVtIGluIHRoZSBsaXN0XG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBjb21wbGV4T2JqZWN0SW5kZXg6IG51bWJlciwgY29tcGxleE9iamVjdElzRnJvbVNldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQsIGNvbXBsZXhPYmplY3RJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWRjc0NyZWF0ZWRCeSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWRjc0NyZWF0ZWRCeSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgfVxuXG4gIC8vIGRpc3BsYXkgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBkaXNwbGF5KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZGlzcGxheScpO1xuICB9XG5cbiAgLy8gb2NpZCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IG9jaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdvY2lkJyk7XG4gIH1cblxuICAvLyByZWYgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCByZWYoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdyZWYnKTtcbiAgfVxuXG4gIC8vIHR5cGUgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCB0eXBlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndHlwZScpO1xuICB9XG5cbiAgLy8gdmFsdWUgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0lkY3NDcmVhdGVkQnlMaXN0IGV4dGVuZHMgY2RrdGYuQ29tcGxleExpc3Qge1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSB3cmFwc1NldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgcHJvdGVjdGVkIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBwcm90ZWN0ZWQgd3JhcHNTZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCB3cmFwc1NldClcbiAgfVxuXG4gIC8qKlxuICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0dXJuXG4gICovXG4gIHB1YmxpYyBnZXQoaW5kZXg6IG51bWJlcik6IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0lkY3NDcmVhdGVkQnlPdXRwdXRSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWRjc0NyZWF0ZWRCeU91dHB1dFJlZmVyZW5jZSh0aGlzLnRlcnJhZm9ybVJlc291cmNlLCB0aGlzLnRlcnJhZm9ybUF0dHJpYnV0ZSwgaW5kZXgsIHRoaXMud3JhcHNTZXQpO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0lkY3NMYXN0TW9kaWZpZWRCeSB7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdJZGNzTGFzdE1vZGlmaWVkQnlUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdJZGNzTGFzdE1vZGlmaWVkQnkpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWRjc0xhc3RNb2RpZmllZEJ5VG9IY2xUZXJyYWZvcm0oc3RydWN0PzogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWRjc0xhc3RNb2RpZmllZEJ5KTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgfTtcbiAgcmV0dXJuIGF0dHJzO1xufVxuXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWRjc0xhc3RNb2RpZmllZEJ5T3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdGYuQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSBjb21wbGV4T2JqZWN0SW5kZXggdGhlIGluZGV4IG9mIHRoaXMgaXRlbSBpbiB0aGUgbGlzdFxuICAqIEBwYXJhbSBjb21wbGV4T2JqZWN0SXNGcm9tU2V0IHdoZXRoZXIgdGhlIGxpc3QgaXMgd3JhcHBpbmcgYSBzZXQgKHdpbGwgYWRkIHRvbGlzdCgpIHRvIGJlIGFibGUgdG8gYWNjZXNzIGFuIGl0ZW0gdmlhIGFuIGluZGV4KVxuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgY29tcGxleE9iamVjdEluZGV4OiBudW1iZXIsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0LCBjb21wbGV4T2JqZWN0SW5kZXgpO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0lkY3NMYXN0TW9kaWZpZWRCeSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWRjc0xhc3RNb2RpZmllZEJ5IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgfVxuICB9XG5cbiAgLy8gZGlzcGxheSAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IGRpc3BsYXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdkaXNwbGF5Jyk7XG4gIH1cblxuICAvLyBvY2lkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgb2NpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ29jaWQnKTtcbiAgfVxuXG4gIC8vIHJlZiAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IHJlZigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3JlZicpO1xuICB9XG5cbiAgLy8gdHlwZSAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd0eXBlJyk7XG4gIH1cblxuICAvLyB2YWx1ZSAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndmFsdWUnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWRjc0xhc3RNb2RpZmllZEJ5TGlzdCBleHRlbmRzIGNka3RmLkNvbXBsZXhMaXN0IHtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gd3JhcHNTZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHByb3RlY3RlZCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgcHJvdGVjdGVkIHdyYXBzU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgd3JhcHNTZXQpXG4gIH1cblxuICAvKipcbiAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHVyblxuICAqL1xuICBwdWJsaWMgZ2V0KGluZGV4OiBudW1iZXIpOiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdJZGNzTGFzdE1vZGlmaWVkQnlPdXRwdXRSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWRjc0xhc3RNb2RpZmllZEJ5T3V0cHV0UmVmZXJlbmNlKHRoaXMudGVycmFmb3JtUmVzb3VyY2UsIHRoaXMudGVycmFmb3JtQXR0cmlidXRlLCBpbmRleCwgdGhpcy53cmFwc1NldCk7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nTWV0YSB7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdNZXRhVG9UZXJyYWZvcm0oc3RydWN0PzogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nTWV0YSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdNZXRhVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nTWV0YSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gIH07XG4gIHJldHVybiBhdHRycztcbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ01ldGFPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJbmRleCB0aGUgaW5kZXggb2YgdGhpcyBpdGVtIGluIHRoZSBsaXN0XG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBjb21wbGV4T2JqZWN0SW5kZXg6IG51bWJlciwgY29tcGxleE9iamVjdElzRnJvbVNldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQsIGNvbXBsZXhPYmplY3RJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nTWV0YSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nTWV0YSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNyZWF0ZWQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBjcmVhdGVkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnY3JlYXRlZCcpO1xuICB9XG5cbiAgLy8gbGFzdF9tb2RpZmllZCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IGxhc3RNb2RpZmllZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2xhc3RfbW9kaWZpZWQnKTtcbiAgfVxuXG4gIC8vIGxvY2F0aW9uIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgbG9jYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdsb2NhdGlvbicpO1xuICB9XG5cbiAgLy8gcmVzb3VyY2VfdHlwZSAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IHJlc291cmNlVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3Jlc291cmNlX3R5cGUnKTtcbiAgfVxuXG4gIC8vIHZlcnNpb24gLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCB2ZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndmVyc2lvbicpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdNZXRhTGlzdCBleHRlbmRzIGNka3RmLkNvbXBsZXhMaXN0IHtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gd3JhcHNTZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHByb3RlY3RlZCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgcHJvdGVjdGVkIHdyYXBzU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgd3JhcHNTZXQpXG4gIH1cblxuICAvKipcbiAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHVyblxuICAqL1xuICBwdWJsaWMgZ2V0KGluZGV4OiBudW1iZXIpOiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdNZXRhT3V0cHV0UmVmZXJlbmNlIHtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ01ldGFPdXRwdXRSZWZlcmVuY2UodGhpcy50ZXJyYWZvcm1SZXNvdXJjZSwgdGhpcy50ZXJyYWZvcm1BdHRyaWJ1dGUsIGluZGV4LCB0aGlzLndyYXBzU2V0KTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdCeXBhc3NDb2RlU2V0dGluZ3Mge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI2hlbHBfZGVza19jb2RlX2V4cGlyeV9pbl9taW5zIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNoZWxwX2Rlc2tfY29kZV9leHBpcnlfaW5fbWluc31cbiAgKi9cbiAgcmVhZG9ubHkgaGVscERlc2tDb2RlRXhwaXJ5SW5NaW5zOiBudW1iZXI7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjaGVscF9kZXNrX2dlbmVyYXRpb25fZW5hYmxlZCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjaGVscF9kZXNrX2dlbmVyYXRpb25fZW5hYmxlZH1cbiAgKi9cbiAgcmVhZG9ubHkgaGVscERlc2tHZW5lcmF0aW9uRW5hYmxlZDogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI2hlbHBfZGVza19tYXhfdXNhZ2UgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI2hlbHBfZGVza19tYXhfdXNhZ2V9XG4gICovXG4gIHJlYWRvbmx5IGhlbHBEZXNrTWF4VXNhZ2U6IG51bWJlcjtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNsZW5ndGggSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI2xlbmd0aH1cbiAgKi9cbiAgcmVhZG9ubHkgbGVuZ3RoOiBudW1iZXI7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjbWF4X2FjdGl2ZSBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjbWF4X2FjdGl2ZX1cbiAgKi9cbiAgcmVhZG9ubHkgbWF4QWN0aXZlOiBudW1iZXI7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjc2VsZl9zZXJ2aWNlX2dlbmVyYXRpb25fZW5hYmxlZCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjc2VsZl9zZXJ2aWNlX2dlbmVyYXRpb25fZW5hYmxlZH1cbiAgKi9cbiAgcmVhZG9ubHkgc2VsZlNlcnZpY2VHZW5lcmF0aW9uRW5hYmxlZDogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQnlwYXNzQ29kZVNldHRpbmdzVG9UZXJyYWZvcm0oc3RydWN0PzogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQnlwYXNzQ29kZVNldHRpbmdzT3V0cHV0UmVmZXJlbmNlIHwgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQnlwYXNzQ29kZVNldHRpbmdzKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGhlbHBfZGVza19jb2RlX2V4cGlyeV9pbl9taW5zOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLmhlbHBEZXNrQ29kZUV4cGlyeUluTWlucyksXG4gICAgaGVscF9kZXNrX2dlbmVyYXRpb25fZW5hYmxlZDogY2RrdGYuYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuaGVscERlc2tHZW5lcmF0aW9uRW5hYmxlZCksXG4gICAgaGVscF9kZXNrX21heF91c2FnZTogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5oZWxwRGVza01heFVzYWdlKSxcbiAgICBsZW5ndGg6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubGVuZ3RoKSxcbiAgICBtYXhfYWN0aXZlOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1heEFjdGl2ZSksXG4gICAgc2VsZl9zZXJ2aWNlX2dlbmVyYXRpb25fZW5hYmxlZDogY2RrdGYuYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuc2VsZlNlcnZpY2VHZW5lcmF0aW9uRW5hYmxlZCksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQnlwYXNzQ29kZVNldHRpbmdzVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQnlwYXNzQ29kZVNldHRpbmdzT3V0cHV0UmVmZXJlbmNlIHwgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQnlwYXNzQ29kZVNldHRpbmdzKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBoZWxwX2Rlc2tfY29kZV9leHBpcnlfaW5fbWluczoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEuaGVscERlc2tDb2RlRXhwaXJ5SW5NaW5zKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBoZWxwX2Rlc2tfZ2VuZXJhdGlvbl9lbmFibGVkOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuaGVscERlc2tHZW5lcmF0aW9uRW5hYmxlZCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIGhlbHBfZGVza19tYXhfdXNhZ2U6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmhlbHBEZXNrTWF4VXNhZ2UpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIGxlbmd0aDoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEubGVuZ3RoKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBtYXhfYWN0aXZlOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5tYXhBY3RpdmUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHNlbGZfc2VydmljZV9nZW5lcmF0aW9uX2VuYWJsZWQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5zZWxmU2VydmljZUdlbmVyYXRpb25FbmFibGVkKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdCeXBhc3NDb2RlU2V0dGluZ3NPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0J5cGFzc0NvZGVTZXR0aW5ncyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5faGVscERlc2tDb2RlRXhwaXJ5SW5NaW5zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmhlbHBEZXNrQ29kZUV4cGlyeUluTWlucyA9IHRoaXMuX2hlbHBEZXNrQ29kZUV4cGlyeUluTWlucztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2hlbHBEZXNrR2VuZXJhdGlvbkVuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuaGVscERlc2tHZW5lcmF0aW9uRW5hYmxlZCA9IHRoaXMuX2hlbHBEZXNrR2VuZXJhdGlvbkVuYWJsZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9oZWxwRGVza01heFVzYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmhlbHBEZXNrTWF4VXNhZ2UgPSB0aGlzLl9oZWxwRGVza01heFVzYWdlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lmxlbmd0aCA9IHRoaXMuX2xlbmd0aDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX21heEFjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tYXhBY3RpdmUgPSB0aGlzLl9tYXhBY3RpdmU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zZWxmU2VydmljZUdlbmVyYXRpb25FbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnNlbGZTZXJ2aWNlR2VuZXJhdGlvbkVuYWJsZWQgPSB0aGlzLl9zZWxmU2VydmljZUdlbmVyYXRpb25FbmFibGVkO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQnlwYXNzQ29kZVNldHRpbmdzIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5faGVscERlc2tDb2RlRXhwaXJ5SW5NaW5zID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5faGVscERlc2tHZW5lcmF0aW9uRW5hYmxlZCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2hlbHBEZXNrTWF4VXNhZ2UgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9sZW5ndGggPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tYXhBY3RpdmUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zZWxmU2VydmljZUdlbmVyYXRpb25FbmFibGVkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9oZWxwRGVza0NvZGVFeHBpcnlJbk1pbnMgPSB2YWx1ZS5oZWxwRGVza0NvZGVFeHBpcnlJbk1pbnM7XG4gICAgICB0aGlzLl9oZWxwRGVza0dlbmVyYXRpb25FbmFibGVkID0gdmFsdWUuaGVscERlc2tHZW5lcmF0aW9uRW5hYmxlZDtcbiAgICAgIHRoaXMuX2hlbHBEZXNrTWF4VXNhZ2UgPSB2YWx1ZS5oZWxwRGVza01heFVzYWdlO1xuICAgICAgdGhpcy5fbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICAgICAgdGhpcy5fbWF4QWN0aXZlID0gdmFsdWUubWF4QWN0aXZlO1xuICAgICAgdGhpcy5fc2VsZlNlcnZpY2VHZW5lcmF0aW9uRW5hYmxlZCA9IHZhbHVlLnNlbGZTZXJ2aWNlR2VuZXJhdGlvbkVuYWJsZWQ7XG4gICAgfVxuICB9XG5cbiAgLy8gaGVscF9kZXNrX2NvZGVfZXhwaXJ5X2luX21pbnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfaGVscERlc2tDb2RlRXhwaXJ5SW5NaW5zPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBoZWxwRGVza0NvZGVFeHBpcnlJbk1pbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdoZWxwX2Rlc2tfY29kZV9leHBpcnlfaW5fbWlucycpO1xuICB9XG4gIHB1YmxpYyBzZXQgaGVscERlc2tDb2RlRXhwaXJ5SW5NaW5zKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9oZWxwRGVza0NvZGVFeHBpcnlJbk1pbnMgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaGVscERlc2tDb2RlRXhwaXJ5SW5NaW5zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlbHBEZXNrQ29kZUV4cGlyeUluTWlucztcbiAgfVxuXG4gIC8vIGhlbHBfZGVza19nZW5lcmF0aW9uX2VuYWJsZWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfaGVscERlc2tHZW5lcmF0aW9uRW5hYmxlZD86IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgaGVscERlc2tHZW5lcmF0aW9uRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdoZWxwX2Rlc2tfZ2VuZXJhdGlvbl9lbmFibGVkJyk7XG4gIH1cbiAgcHVibGljIHNldCBoZWxwRGVza0dlbmVyYXRpb25FbmFibGVkKHZhbHVlOiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9oZWxwRGVza0dlbmVyYXRpb25FbmFibGVkID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGhlbHBEZXNrR2VuZXJhdGlvbkVuYWJsZWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5faGVscERlc2tHZW5lcmF0aW9uRW5hYmxlZDtcbiAgfVxuXG4gIC8vIGhlbHBfZGVza19tYXhfdXNhZ2UgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfaGVscERlc2tNYXhVc2FnZT86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgaGVscERlc2tNYXhVc2FnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ2hlbHBfZGVza19tYXhfdXNhZ2UnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhlbHBEZXNrTWF4VXNhZ2UodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2hlbHBEZXNrTWF4VXNhZ2UgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaGVscERlc2tNYXhVc2FnZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9oZWxwRGVza01heFVzYWdlO1xuICB9XG5cbiAgLy8gbGVuZ3RoIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2xlbmd0aD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnbGVuZ3RoJyk7XG4gIH1cbiAgcHVibGljIHNldCBsZW5ndGgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2xlbmd0aCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBsZW5ndGhJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgLy8gbWF4X2FjdGl2ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9tYXhBY3RpdmU/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IG1heEFjdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21heF9hY3RpdmUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heEFjdGl2ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4QWN0aXZlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1heEFjdGl2ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tYXhBY3RpdmU7XG4gIH1cblxuICAvLyBzZWxmX3NlcnZpY2VfZ2VuZXJhdGlvbl9lbmFibGVkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3NlbGZTZXJ2aWNlR2VuZXJhdGlvbkVuYWJsZWQ/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IHNlbGZTZXJ2aWNlR2VuZXJhdGlvbkVuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnc2VsZl9zZXJ2aWNlX2dlbmVyYXRpb25fZW5hYmxlZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2VsZlNlcnZpY2VHZW5lcmF0aW9uRW5hYmxlZCh2YWx1ZTogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fc2VsZlNlcnZpY2VHZW5lcmF0aW9uRW5hYmxlZCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzZWxmU2VydmljZUdlbmVyYXRpb25FbmFibGVkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGZTZXJ2aWNlR2VuZXJhdGlvbkVuYWJsZWQ7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQ2xpZW50QXBwU2V0dGluZ3Mge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI2RldmljZV9wcm90ZWN0aW9uX3BvbGljeSBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjZGV2aWNlX3Byb3RlY3Rpb25fcG9saWN5fVxuICAqL1xuICByZWFkb25seSBkZXZpY2VQcm90ZWN0aW9uUG9saWN5OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjaW5pdGlhbF9sb2Nrb3V0X3BlcmlvZF9pbl9zZWNzIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNpbml0aWFsX2xvY2tvdXRfcGVyaW9kX2luX3NlY3N9XG4gICovXG4gIHJlYWRvbmx5IGluaXRpYWxMb2Nrb3V0UGVyaW9kSW5TZWNzOiBudW1iZXI7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcja2V5X3BhaXJfbGVuZ3RoIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNrZXlfcGFpcl9sZW5ndGh9XG4gICovXG4gIHJlYWRvbmx5IGtleVBhaXJMZW5ndGg6IG51bWJlcjtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNsb2Nrb3V0X2VzY2FsYXRpb25fcGF0dGVybiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjbG9ja291dF9lc2NhbGF0aW9uX3BhdHRlcm59XG4gICovXG4gIHJlYWRvbmx5IGxvY2tvdXRFc2NhbGF0aW9uUGF0dGVybjogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI21heF9mYWlsdXJlc19iZWZvcmVfbG9ja291dCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjbWF4X2ZhaWx1cmVzX2JlZm9yZV9sb2Nrb3V0fVxuICAqL1xuICByZWFkb25seSBtYXhGYWlsdXJlc0JlZm9yZUxvY2tvdXQ6IG51bWJlcjtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNtYXhfZmFpbHVyZXNfYmVmb3JlX3dhcm5pbmcgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI21heF9mYWlsdXJlc19iZWZvcmVfd2FybmluZ31cbiAgKi9cbiAgcmVhZG9ubHkgbWF4RmFpbHVyZXNCZWZvcmVXYXJuaW5nOiBudW1iZXI7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjbWF4X2xvY2tvdXRfaW50ZXJ2YWxfaW5fc2VjcyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjbWF4X2xvY2tvdXRfaW50ZXJ2YWxfaW5fc2Vjc31cbiAgKi9cbiAgcmVhZG9ubHkgbWF4TG9ja291dEludGVydmFsSW5TZWNzOiBudW1iZXI7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjbWluX3Bpbl9sZW5ndGggSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI21pbl9waW5fbGVuZ3RofVxuICAqL1xuICByZWFkb25seSBtaW5QaW5MZW5ndGg6IG51bWJlcjtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNwb2xpY3lfdXBkYXRlX2ZyZXFfaW5fZGF5cyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjcG9saWN5X3VwZGF0ZV9mcmVxX2luX2RheXN9XG4gICovXG4gIHJlYWRvbmx5IHBvbGljeVVwZGF0ZUZyZXFJbkRheXM6IG51bWJlcjtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNyZXF1ZXN0X3NpZ25pbmdfYWxnbyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjcmVxdWVzdF9zaWduaW5nX2FsZ299XG4gICovXG4gIHJlYWRvbmx5IHJlcXVlc3RTaWduaW5nQWxnbzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI3NoYXJlZF9zZWNyZXRfZW5jb2RpbmcgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI3NoYXJlZF9zZWNyZXRfZW5jb2Rpbmd9XG4gICovXG4gIHJlYWRvbmx5IHNoYXJlZFNlY3JldEVuY29kaW5nOiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjdW5sb2NrX2FwcF9mb3JfZWFjaF9yZXF1ZXN0X2VuYWJsZWQgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI3VubG9ja19hcHBfZm9yX2VhY2hfcmVxdWVzdF9lbmFibGVkfVxuICAqL1xuICByZWFkb25seSB1bmxvY2tBcHBGb3JFYWNoUmVxdWVzdEVuYWJsZWQ6IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyN1bmxvY2tfYXBwX2ludGVydmFsX2luX3NlY3MgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI3VubG9ja19hcHBfaW50ZXJ2YWxfaW5fc2Vjc31cbiAgKi9cbiAgcmVhZG9ubHkgdW5sb2NrQXBwSW50ZXJ2YWxJblNlY3M6IG51bWJlcjtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyN1bmxvY2tfb25fYXBwX2ZvcmVncm91bmRfZW5hYmxlZCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjdW5sb2NrX29uX2FwcF9mb3JlZ3JvdW5kX2VuYWJsZWR9XG4gICovXG4gIHJlYWRvbmx5IHVubG9ja09uQXBwRm9yZWdyb3VuZEVuYWJsZWQ6IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyN1bmxvY2tfb25fYXBwX3N0YXJ0X2VuYWJsZWQgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI3VubG9ja19vbl9hcHBfc3RhcnRfZW5hYmxlZH1cbiAgKi9cbiAgcmVhZG9ubHkgdW5sb2NrT25BcHBTdGFydEVuYWJsZWQ6IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0NsaWVudEFwcFNldHRpbmdzVG9UZXJyYWZvcm0oc3RydWN0PzogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQ2xpZW50QXBwU2V0dGluZ3NPdXRwdXRSZWZlcmVuY2UgfCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdDbGllbnRBcHBTZXR0aW5ncyk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBkZXZpY2VfcHJvdGVjdGlvbl9wb2xpY3k6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuZGV2aWNlUHJvdGVjdGlvblBvbGljeSksXG4gICAgaW5pdGlhbF9sb2Nrb3V0X3BlcmlvZF9pbl9zZWNzOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLmluaXRpYWxMb2Nrb3V0UGVyaW9kSW5TZWNzKSxcbiAgICBrZXlfcGFpcl9sZW5ndGg6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEua2V5UGFpckxlbmd0aCksXG4gICAgbG9ja291dF9lc2NhbGF0aW9uX3BhdHRlcm46IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEubG9ja291dEVzY2FsYXRpb25QYXR0ZXJuKSxcbiAgICBtYXhfZmFpbHVyZXNfYmVmb3JlX2xvY2tvdXQ6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWF4RmFpbHVyZXNCZWZvcmVMb2Nrb3V0KSxcbiAgICBtYXhfZmFpbHVyZXNfYmVmb3JlX3dhcm5pbmc6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWF4RmFpbHVyZXNCZWZvcmVXYXJuaW5nKSxcbiAgICBtYXhfbG9ja291dF9pbnRlcnZhbF9pbl9zZWNzOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1heExvY2tvdXRJbnRlcnZhbEluU2VjcyksXG4gICAgbWluX3Bpbl9sZW5ndGg6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWluUGluTGVuZ3RoKSxcbiAgICBwb2xpY3lfdXBkYXRlX2ZyZXFfaW5fZGF5czogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5wb2xpY3lVcGRhdGVGcmVxSW5EYXlzKSxcbiAgICByZXF1ZXN0X3NpZ25pbmdfYWxnbzogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5yZXF1ZXN0U2lnbmluZ0FsZ28pLFxuICAgIHNoYXJlZF9zZWNyZXRfZW5jb2Rpbmc6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuc2hhcmVkU2VjcmV0RW5jb2RpbmcpLFxuICAgIHVubG9ja19hcHBfZm9yX2VhY2hfcmVxdWVzdF9lbmFibGVkOiBjZGt0Zi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS51bmxvY2tBcHBGb3JFYWNoUmVxdWVzdEVuYWJsZWQpLFxuICAgIHVubG9ja19hcHBfaW50ZXJ2YWxfaW5fc2VjczogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS51bmxvY2tBcHBJbnRlcnZhbEluU2VjcyksXG4gICAgdW5sb2NrX29uX2FwcF9mb3JlZ3JvdW5kX2VuYWJsZWQ6IGNka3RmLmJvb2xlYW5Ub1RlcnJhZm9ybShzdHJ1Y3QhLnVubG9ja09uQXBwRm9yZWdyb3VuZEVuYWJsZWQpLFxuICAgIHVubG9ja19vbl9hcHBfc3RhcnRfZW5hYmxlZDogY2RrdGYuYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEudW5sb2NrT25BcHBTdGFydEVuYWJsZWQpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0NsaWVudEFwcFNldHRpbmdzVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQ2xpZW50QXBwU2V0dGluZ3NPdXRwdXRSZWZlcmVuY2UgfCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdDbGllbnRBcHBTZXR0aW5ncyk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgZGV2aWNlX3Byb3RlY3Rpb25fcG9saWN5OiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5kZXZpY2VQcm90ZWN0aW9uUG9saWN5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBpbml0aWFsX2xvY2tvdXRfcGVyaW9kX2luX3NlY3M6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmluaXRpYWxMb2Nrb3V0UGVyaW9kSW5TZWNzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBrZXlfcGFpcl9sZW5ndGg6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmtleVBhaXJMZW5ndGgpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIGxvY2tvdXRfZXNjYWxhdGlvbl9wYXR0ZXJuOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5sb2Nrb3V0RXNjYWxhdGlvblBhdHRlcm4pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIG1heF9mYWlsdXJlc19iZWZvcmVfbG9ja291dDoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEubWF4RmFpbHVyZXNCZWZvcmVMb2Nrb3V0KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBtYXhfZmFpbHVyZXNfYmVmb3JlX3dhcm5pbmc6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1heEZhaWx1cmVzQmVmb3JlV2FybmluZyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgbWF4X2xvY2tvdXRfaW50ZXJ2YWxfaW5fc2Vjczoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEubWF4TG9ja291dEludGVydmFsSW5TZWNzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBtaW5fcGluX2xlbmd0aDoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEubWluUGluTGVuZ3RoKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBwb2xpY3lfdXBkYXRlX2ZyZXFfaW5fZGF5czoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEucG9saWN5VXBkYXRlRnJlcUluRGF5cyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgcmVxdWVzdF9zaWduaW5nX2FsZ286IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnJlcXVlc3RTaWduaW5nQWxnbyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgc2hhcmVkX3NlY3JldF9lbmNvZGluZzoge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuc2hhcmVkU2VjcmV0RW5jb2RpbmcpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHVubG9ja19hcHBfZm9yX2VhY2hfcmVxdWVzdF9lbmFibGVkOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEudW5sb2NrQXBwRm9yRWFjaFJlcXVlc3RFbmFibGVkKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgdW5sb2NrX2FwcF9pbnRlcnZhbF9pbl9zZWNzOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS51bmxvY2tBcHBJbnRlcnZhbEluU2VjcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgdW5sb2NrX29uX2FwcF9mb3JlZ3JvdW5kX2VuYWJsZWQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS51bmxvY2tPbkFwcEZvcmVncm91bmRFbmFibGVkKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgdW5sb2NrX29uX2FwcF9zdGFydF9lbmFibGVkOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEudW5sb2NrT25BcHBTdGFydEVuYWJsZWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0NsaWVudEFwcFNldHRpbmdzT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdGYuQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdDbGllbnRBcHBTZXR0aW5ncyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZGV2aWNlUHJvdGVjdGlvblBvbGljeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5kZXZpY2VQcm90ZWN0aW9uUG9saWN5ID0gdGhpcy5fZGV2aWNlUHJvdGVjdGlvblBvbGljeTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2luaXRpYWxMb2Nrb3V0UGVyaW9kSW5TZWNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmluaXRpYWxMb2Nrb3V0UGVyaW9kSW5TZWNzID0gdGhpcy5faW5pdGlhbExvY2tvdXRQZXJpb2RJblNlY3M7XG4gICAgfVxuICAgIGlmICh0aGlzLl9rZXlQYWlyTGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmtleVBhaXJMZW5ndGggPSB0aGlzLl9rZXlQYWlyTGVuZ3RoO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbG9ja291dEVzY2FsYXRpb25QYXR0ZXJuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmxvY2tvdXRFc2NhbGF0aW9uUGF0dGVybiA9IHRoaXMuX2xvY2tvdXRFc2NhbGF0aW9uUGF0dGVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX21heEZhaWx1cmVzQmVmb3JlTG9ja291dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tYXhGYWlsdXJlc0JlZm9yZUxvY2tvdXQgPSB0aGlzLl9tYXhGYWlsdXJlc0JlZm9yZUxvY2tvdXQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9tYXhGYWlsdXJlc0JlZm9yZVdhcm5pbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWF4RmFpbHVyZXNCZWZvcmVXYXJuaW5nID0gdGhpcy5fbWF4RmFpbHVyZXNCZWZvcmVXYXJuaW5nO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWF4TG9ja291dEludGVydmFsSW5TZWNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1heExvY2tvdXRJbnRlcnZhbEluU2VjcyA9IHRoaXMuX21heExvY2tvdXRJbnRlcnZhbEluU2VjcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX21pblBpbkxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5taW5QaW5MZW5ndGggPSB0aGlzLl9taW5QaW5MZW5ndGg7XG4gICAgfVxuICAgIGlmICh0aGlzLl9wb2xpY3lVcGRhdGVGcmVxSW5EYXlzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnBvbGljeVVwZGF0ZUZyZXFJbkRheXMgPSB0aGlzLl9wb2xpY3lVcGRhdGVGcmVxSW5EYXlzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcmVxdWVzdFNpZ25pbmdBbGdvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnJlcXVlc3RTaWduaW5nQWxnbyA9IHRoaXMuX3JlcXVlc3RTaWduaW5nQWxnbztcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NoYXJlZFNlY3JldEVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnNoYXJlZFNlY3JldEVuY29kaW5nID0gdGhpcy5fc2hhcmVkU2VjcmV0RW5jb2Rpbmc7XG4gICAgfVxuICAgIGlmICh0aGlzLl91bmxvY2tBcHBGb3JFYWNoUmVxdWVzdEVuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudW5sb2NrQXBwRm9yRWFjaFJlcXVlc3RFbmFibGVkID0gdGhpcy5fdW5sb2NrQXBwRm9yRWFjaFJlcXVlc3RFbmFibGVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdW5sb2NrQXBwSW50ZXJ2YWxJblNlY3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudW5sb2NrQXBwSW50ZXJ2YWxJblNlY3MgPSB0aGlzLl91bmxvY2tBcHBJbnRlcnZhbEluU2VjcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX3VubG9ja09uQXBwRm9yZWdyb3VuZEVuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudW5sb2NrT25BcHBGb3JlZ3JvdW5kRW5hYmxlZCA9IHRoaXMuX3VubG9ja09uQXBwRm9yZWdyb3VuZEVuYWJsZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl91bmxvY2tPbkFwcFN0YXJ0RW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC51bmxvY2tPbkFwcFN0YXJ0RW5hYmxlZCA9IHRoaXMuX3VubG9ja09uQXBwU3RhcnRFbmFibGVkO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQ2xpZW50QXBwU2V0dGluZ3MgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9kZXZpY2VQcm90ZWN0aW9uUG9saWN5ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5faW5pdGlhbExvY2tvdXRQZXJpb2RJblNlY3MgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9rZXlQYWlyTGVuZ3RoID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbG9ja291dEVzY2FsYXRpb25QYXR0ZXJuID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbWF4RmFpbHVyZXNCZWZvcmVMb2Nrb3V0ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbWF4RmFpbHVyZXNCZWZvcmVXYXJuaW5nID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbWF4TG9ja291dEludGVydmFsSW5TZWNzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbWluUGluTGVuZ3RoID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcG9saWN5VXBkYXRlRnJlcUluRGF5cyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3JlcXVlc3RTaWduaW5nQWxnbyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3NoYXJlZFNlY3JldEVuY29kaW5nID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdW5sb2NrQXBwRm9yRWFjaFJlcXVlc3RFbmFibGVkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdW5sb2NrQXBwSW50ZXJ2YWxJblNlY3MgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl91bmxvY2tPbkFwcEZvcmVncm91bmRFbmFibGVkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdW5sb2NrT25BcHBTdGFydEVuYWJsZWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2RldmljZVByb3RlY3Rpb25Qb2xpY3kgPSB2YWx1ZS5kZXZpY2VQcm90ZWN0aW9uUG9saWN5O1xuICAgICAgdGhpcy5faW5pdGlhbExvY2tvdXRQZXJpb2RJblNlY3MgPSB2YWx1ZS5pbml0aWFsTG9ja291dFBlcmlvZEluU2VjcztcbiAgICAgIHRoaXMuX2tleVBhaXJMZW5ndGggPSB2YWx1ZS5rZXlQYWlyTGVuZ3RoO1xuICAgICAgdGhpcy5fbG9ja291dEVzY2FsYXRpb25QYXR0ZXJuID0gdmFsdWUubG9ja291dEVzY2FsYXRpb25QYXR0ZXJuO1xuICAgICAgdGhpcy5fbWF4RmFpbHVyZXNCZWZvcmVMb2Nrb3V0ID0gdmFsdWUubWF4RmFpbHVyZXNCZWZvcmVMb2Nrb3V0O1xuICAgICAgdGhpcy5fbWF4RmFpbHVyZXNCZWZvcmVXYXJuaW5nID0gdmFsdWUubWF4RmFpbHVyZXNCZWZvcmVXYXJuaW5nO1xuICAgICAgdGhpcy5fbWF4TG9ja291dEludGVydmFsSW5TZWNzID0gdmFsdWUubWF4TG9ja291dEludGVydmFsSW5TZWNzO1xuICAgICAgdGhpcy5fbWluUGluTGVuZ3RoID0gdmFsdWUubWluUGluTGVuZ3RoO1xuICAgICAgdGhpcy5fcG9saWN5VXBkYXRlRnJlcUluRGF5cyA9IHZhbHVlLnBvbGljeVVwZGF0ZUZyZXFJbkRheXM7XG4gICAgICB0aGlzLl9yZXF1ZXN0U2lnbmluZ0FsZ28gPSB2YWx1ZS5yZXF1ZXN0U2lnbmluZ0FsZ287XG4gICAgICB0aGlzLl9zaGFyZWRTZWNyZXRFbmNvZGluZyA9IHZhbHVlLnNoYXJlZFNlY3JldEVuY29kaW5nO1xuICAgICAgdGhpcy5fdW5sb2NrQXBwRm9yRWFjaFJlcXVlc3RFbmFibGVkID0gdmFsdWUudW5sb2NrQXBwRm9yRWFjaFJlcXVlc3RFbmFibGVkO1xuICAgICAgdGhpcy5fdW5sb2NrQXBwSW50ZXJ2YWxJblNlY3MgPSB2YWx1ZS51bmxvY2tBcHBJbnRlcnZhbEluU2VjcztcbiAgICAgIHRoaXMuX3VubG9ja09uQXBwRm9yZWdyb3VuZEVuYWJsZWQgPSB2YWx1ZS51bmxvY2tPbkFwcEZvcmVncm91bmRFbmFibGVkO1xuICAgICAgdGhpcy5fdW5sb2NrT25BcHBTdGFydEVuYWJsZWQgPSB2YWx1ZS51bmxvY2tPbkFwcFN0YXJ0RW5hYmxlZDtcbiAgICB9XG4gIH1cblxuICAvLyBkZXZpY2VfcHJvdGVjdGlvbl9wb2xpY3kgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfZGV2aWNlUHJvdGVjdGlvblBvbGljeT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgZGV2aWNlUHJvdGVjdGlvblBvbGljeSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2RldmljZV9wcm90ZWN0aW9uX3BvbGljeScpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGV2aWNlUHJvdGVjdGlvblBvbGljeSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGV2aWNlUHJvdGVjdGlvblBvbGljeSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkZXZpY2VQcm90ZWN0aW9uUG9saWN5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RldmljZVByb3RlY3Rpb25Qb2xpY3k7XG4gIH1cblxuICAvLyBpbml0aWFsX2xvY2tvdXRfcGVyaW9kX2luX3NlY3MgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfaW5pdGlhbExvY2tvdXRQZXJpb2RJblNlY3M/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGluaXRpYWxMb2Nrb3V0UGVyaW9kSW5TZWNzKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnaW5pdGlhbF9sb2Nrb3V0X3BlcmlvZF9pbl9zZWNzJyk7XG4gIH1cbiAgcHVibGljIHNldCBpbml0aWFsTG9ja291dFBlcmlvZEluU2Vjcyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5faW5pdGlhbExvY2tvdXRQZXJpb2RJblNlY3MgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaW5pdGlhbExvY2tvdXRQZXJpb2RJblNlY3NJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5pdGlhbExvY2tvdXRQZXJpb2RJblNlY3M7XG4gIH1cblxuICAvLyBrZXlfcGFpcl9sZW5ndGggLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfa2V5UGFpckxlbmd0aD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQga2V5UGFpckxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ2tleV9wYWlyX2xlbmd0aCcpO1xuICB9XG4gIHB1YmxpYyBzZXQga2V5UGFpckxlbmd0aCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fa2V5UGFpckxlbmd0aCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBrZXlQYWlyTGVuZ3RoSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2tleVBhaXJMZW5ndGg7XG4gIH1cblxuICAvLyBsb2Nrb3V0X2VzY2FsYXRpb25fcGF0dGVybiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9sb2Nrb3V0RXNjYWxhdGlvblBhdHRlcm4/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGxvY2tvdXRFc2NhbGF0aW9uUGF0dGVybigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2xvY2tvdXRfZXNjYWxhdGlvbl9wYXR0ZXJuJyk7XG4gIH1cbiAgcHVibGljIHNldCBsb2Nrb3V0RXNjYWxhdGlvblBhdHRlcm4odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2xvY2tvdXRFc2NhbGF0aW9uUGF0dGVybiA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBsb2Nrb3V0RXNjYWxhdGlvblBhdHRlcm5JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbG9ja291dEVzY2FsYXRpb25QYXR0ZXJuO1xuICB9XG5cbiAgLy8gbWF4X2ZhaWx1cmVzX2JlZm9yZV9sb2Nrb3V0IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX21heEZhaWx1cmVzQmVmb3JlTG9ja291dD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWF4RmFpbHVyZXNCZWZvcmVMb2Nrb3V0KCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnbWF4X2ZhaWx1cmVzX2JlZm9yZV9sb2Nrb3V0Jyk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhGYWlsdXJlc0JlZm9yZUxvY2tvdXQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heEZhaWx1cmVzQmVmb3JlTG9ja291dCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtYXhGYWlsdXJlc0JlZm9yZUxvY2tvdXRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4RmFpbHVyZXNCZWZvcmVMb2Nrb3V0O1xuICB9XG5cbiAgLy8gbWF4X2ZhaWx1cmVzX2JlZm9yZV93YXJuaW5nIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX21heEZhaWx1cmVzQmVmb3JlV2FybmluZz86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWF4RmFpbHVyZXNCZWZvcmVXYXJuaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnbWF4X2ZhaWx1cmVzX2JlZm9yZV93YXJuaW5nJyk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhGYWlsdXJlc0JlZm9yZVdhcm5pbmcodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heEZhaWx1cmVzQmVmb3JlV2FybmluZyA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtYXhGYWlsdXJlc0JlZm9yZVdhcm5pbmdJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4RmFpbHVyZXNCZWZvcmVXYXJuaW5nO1xuICB9XG5cbiAgLy8gbWF4X2xvY2tvdXRfaW50ZXJ2YWxfaW5fc2VjcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9tYXhMb2Nrb3V0SW50ZXJ2YWxJblNlY3M/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IG1heExvY2tvdXRJbnRlcnZhbEluU2VjcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21heF9sb2Nrb3V0X2ludGVydmFsX2luX3NlY3MnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heExvY2tvdXRJbnRlcnZhbEluU2Vjcyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4TG9ja291dEludGVydmFsSW5TZWNzID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1heExvY2tvdXRJbnRlcnZhbEluU2Vjc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tYXhMb2Nrb3V0SW50ZXJ2YWxJblNlY3M7XG4gIH1cblxuICAvLyBtaW5fcGluX2xlbmd0aCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9taW5QaW5MZW5ndGg/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IG1pblBpbkxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21pbl9waW5fbGVuZ3RoJyk7XG4gIH1cbiAgcHVibGljIHNldCBtaW5QaW5MZW5ndGgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21pblBpbkxlbmd0aCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtaW5QaW5MZW5ndGhJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWluUGluTGVuZ3RoO1xuICB9XG5cbiAgLy8gcG9saWN5X3VwZGF0ZV9mcmVxX2luX2RheXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfcG9saWN5VXBkYXRlRnJlcUluRGF5cz86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgcG9saWN5VXBkYXRlRnJlcUluRGF5cygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ3BvbGljeV91cGRhdGVfZnJlcV9pbl9kYXlzJyk7XG4gIH1cbiAgcHVibGljIHNldCBwb2xpY3lVcGRhdGVGcmVxSW5EYXlzKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wb2xpY3lVcGRhdGVGcmVxSW5EYXlzID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHBvbGljeVVwZGF0ZUZyZXFJbkRheXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcG9saWN5VXBkYXRlRnJlcUluRGF5cztcbiAgfVxuXG4gIC8vIHJlcXVlc3Rfc2lnbmluZ19hbGdvIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3JlcXVlc3RTaWduaW5nQWxnbz86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgcmVxdWVzdFNpZ25pbmdBbGdvKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgncmVxdWVzdF9zaWduaW5nX2FsZ28nKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlcXVlc3RTaWduaW5nQWxnbyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcmVxdWVzdFNpZ25pbmdBbGdvID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHJlcXVlc3RTaWduaW5nQWxnb0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0U2lnbmluZ0FsZ287XG4gIH1cblxuICAvLyBzaGFyZWRfc2VjcmV0X2VuY29kaW5nIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3NoYXJlZFNlY3JldEVuY29kaW5nPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBzaGFyZWRTZWNyZXRFbmNvZGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3NoYXJlZF9zZWNyZXRfZW5jb2RpbmcnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNoYXJlZFNlY3JldEVuY29kaW5nKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zaGFyZWRTZWNyZXRFbmNvZGluZyA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzaGFyZWRTZWNyZXRFbmNvZGluZ0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zaGFyZWRTZWNyZXRFbmNvZGluZztcbiAgfVxuXG4gIC8vIHVubG9ja19hcHBfZm9yX2VhY2hfcmVxdWVzdF9lbmFibGVkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3VubG9ja0FwcEZvckVhY2hSZXF1ZXN0RW5hYmxlZD86IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgdW5sb2NrQXBwRm9yRWFjaFJlcXVlc3RFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ3VubG9ja19hcHBfZm9yX2VhY2hfcmVxdWVzdF9lbmFibGVkJyk7XG4gIH1cbiAgcHVibGljIHNldCB1bmxvY2tBcHBGb3JFYWNoUmVxdWVzdEVuYWJsZWQodmFsdWU6IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX3VubG9ja0FwcEZvckVhY2hSZXF1ZXN0RW5hYmxlZCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB1bmxvY2tBcHBGb3JFYWNoUmVxdWVzdEVuYWJsZWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdW5sb2NrQXBwRm9yRWFjaFJlcXVlc3RFbmFibGVkO1xuICB9XG5cbiAgLy8gdW5sb2NrX2FwcF9pbnRlcnZhbF9pbl9zZWNzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3VubG9ja0FwcEludGVydmFsSW5TZWNzPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCB1bmxvY2tBcHBJbnRlcnZhbEluU2VjcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ3VubG9ja19hcHBfaW50ZXJ2YWxfaW5fc2VjcycpO1xuICB9XG4gIHB1YmxpYyBzZXQgdW5sb2NrQXBwSW50ZXJ2YWxJblNlY3ModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3VubG9ja0FwcEludGVydmFsSW5TZWNzID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHVubG9ja0FwcEludGVydmFsSW5TZWNzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VubG9ja0FwcEludGVydmFsSW5TZWNzO1xuICB9XG5cbiAgLy8gdW5sb2NrX29uX2FwcF9mb3JlZ3JvdW5kX2VuYWJsZWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfdW5sb2NrT25BcHBGb3JlZ3JvdW5kRW5hYmxlZD86IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgdW5sb2NrT25BcHBGb3JlZ3JvdW5kRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCd1bmxvY2tfb25fYXBwX2ZvcmVncm91bmRfZW5hYmxlZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgdW5sb2NrT25BcHBGb3JlZ3JvdW5kRW5hYmxlZCh2YWx1ZTogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fdW5sb2NrT25BcHBGb3JlZ3JvdW5kRW5hYmxlZCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB1bmxvY2tPbkFwcEZvcmVncm91bmRFbmFibGVkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VubG9ja09uQXBwRm9yZWdyb3VuZEVuYWJsZWQ7XG4gIH1cblxuICAvLyB1bmxvY2tfb25fYXBwX3N0YXJ0X2VuYWJsZWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfdW5sb2NrT25BcHBTdGFydEVuYWJsZWQ/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IHVubG9ja09uQXBwU3RhcnRFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ3VubG9ja19vbl9hcHBfc3RhcnRfZW5hYmxlZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgdW5sb2NrT25BcHBTdGFydEVuYWJsZWQodmFsdWU6IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX3VubG9ja09uQXBwU3RhcnRFbmFibGVkID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHVubG9ja09uQXBwU3RhcnRFbmFibGVkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VubG9ja09uQXBwU3RhcnRFbmFibGVkO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0NvbXBsaWFuY2VQb2xpY3kge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI2FjdGlvbiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjYWN0aW9ufVxuICAqL1xuICByZWFkb25seSBhY3Rpb246IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNuYW1lIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNuYW1lfVxuICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjdmFsdWUgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI3ZhbHVlfVxuICAqL1xuICByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQ29tcGxpYW5jZVBvbGljeVRvVGVycmFmb3JtKHN0cnVjdD86IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0NvbXBsaWFuY2VQb2xpY3kgfCBjZGt0Zi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhY3Rpb246IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuYWN0aW9uKSxcbiAgICBuYW1lOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLm5hbWUpLFxuICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnZhbHVlKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdDb21wbGlhbmNlUG9saWN5VG9IY2xUZXJyYWZvcm0oc3RydWN0PzogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQ29tcGxpYW5jZVBvbGljeSB8IGNka3RmLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBhY3Rpb246IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmFjdGlvbiksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgbmFtZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEubmFtZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgdmFsdWU6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnZhbHVlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0NvbXBsaWFuY2VQb2xpY3lPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gIHByaXZhdGUgcmVzb2x2YWJsZVZhbHVlPzogY2RrdGYuSVJlc29sdmFibGU7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJbmRleCB0aGUgaW5kZXggb2YgdGhpcyBpdGVtIGluIHRoZSBsaXN0XG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBjb21wbGV4T2JqZWN0SW5kZXg6IG51bWJlciwgY29tcGxleE9iamVjdElzRnJvbVNldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQsIGNvbXBsZXhPYmplY3RJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQ29tcGxpYW5jZVBvbGljeSB8IGNka3RmLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yZXNvbHZhYmxlVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmFibGVWYWx1ZTtcbiAgICB9XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fYWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmFjdGlvbiA9IHRoaXMuX2FjdGlvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX25hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubmFtZSA9IHRoaXMuX25hbWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC52YWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQ29tcGxpYW5jZVBvbGljeSB8IGNka3RmLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9hY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9uYW1lID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUodmFsdWUpKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fYWN0aW9uID0gdmFsdWUuYWN0aW9uO1xuICAgICAgdGhpcy5fbmFtZSA9IHZhbHVlLm5hbWU7XG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlLnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFjdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9hY3Rpb24/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGFjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2FjdGlvbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWN0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9hY3Rpb24gPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYWN0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGlvbjtcbiAgfVxuXG4gIC8vIG5hbWUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbmFtZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ25hbWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hbWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX25hbWUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbmFtZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgLy8gdmFsdWUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfdmFsdWU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndmFsdWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB2YWx1ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQ29tcGxpYW5jZVBvbGljeUxpc3QgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4TGlzdCB7XG4gIHB1YmxpYyBpbnRlcm5hbFZhbHVlPyA6IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0NvbXBsaWFuY2VQb2xpY3lbXSB8IGNka3RmLklSZXNvbHZhYmxlXG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIHdyYXBzU2V0IHdoZXRoZXIgdGhlIGxpc3QgaXMgd3JhcHBpbmcgYSBzZXQgKHdpbGwgYWRkIHRvbGlzdCgpIHRvIGJlIGFibGUgdG8gYWNjZXNzIGFuIGl0ZW0gdmlhIGFuIGluZGV4KVxuICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgdGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCBwcm90ZWN0ZWQgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIHByb3RlY3RlZCB3cmFwc1NldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIHdyYXBzU2V0KVxuICB9XG5cbiAgLyoqXG4gICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm5cbiAgKi9cbiAgcHVibGljIGdldChpbmRleDogbnVtYmVyKTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQ29tcGxpYW5jZVBvbGljeU91dHB1dFJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIG5ldyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdDb21wbGlhbmNlUG9saWN5T3V0cHV0UmVmZXJlbmNlKHRoaXMudGVycmFmb3JtUmVzb3VyY2UsIHRoaXMudGVycmFmb3JtQXR0cmlidXRlLCBpbmRleCwgdGhpcy53cmFwc1NldCk7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nRW1haWxTZXR0aW5ncyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjZW1haWxfbGlua19jdXN0b21fdXJsIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNlbWFpbF9saW5rX2N1c3RvbV91cmx9XG4gICovXG4gIHJlYWRvbmx5IGVtYWlsTGlua0N1c3RvbVVybD86IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNlbWFpbF9saW5rX2VuYWJsZWQgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI2VtYWlsX2xpbmtfZW5hYmxlZH1cbiAgKi9cbiAgcmVhZG9ubHkgZW1haWxMaW5rRW5hYmxlZDogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nRW1haWxTZXR0aW5nc1RvVGVycmFmb3JtKHN0cnVjdD86IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0VtYWlsU2V0dGluZ3NPdXRwdXRSZWZlcmVuY2UgfCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdFbWFpbFNldHRpbmdzKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGVtYWlsX2xpbmtfY3VzdG9tX3VybDogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5lbWFpbExpbmtDdXN0b21VcmwpLFxuICAgIGVtYWlsX2xpbmtfZW5hYmxlZDogY2RrdGYuYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuZW1haWxMaW5rRW5hYmxlZCksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nRW1haWxTZXR0aW5nc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0VtYWlsU2V0dGluZ3NPdXRwdXRSZWZlcmVuY2UgfCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdFbWFpbFNldHRpbmdzKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBlbWFpbF9saW5rX2N1c3RvbV91cmw6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmVtYWlsTGlua0N1c3RvbVVybCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgZW1haWxfbGlua19lbmFibGVkOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZW1haWxMaW5rRW5hYmxlZCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nRW1haWxTZXR0aW5nc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nRW1haWxTZXR0aW5ncyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZW1haWxMaW5rQ3VzdG9tVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmVtYWlsTGlua0N1c3RvbVVybCA9IHRoaXMuX2VtYWlsTGlua0N1c3RvbVVybDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2VtYWlsTGlua0VuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZW1haWxMaW5rRW5hYmxlZCA9IHRoaXMuX2VtYWlsTGlua0VuYWJsZWQ7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdFbWFpbFNldHRpbmdzIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fZW1haWxMaW5rQ3VzdG9tVXJsID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZW1haWxMaW5rRW5hYmxlZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fZW1haWxMaW5rQ3VzdG9tVXJsID0gdmFsdWUuZW1haWxMaW5rQ3VzdG9tVXJsO1xuICAgICAgdGhpcy5fZW1haWxMaW5rRW5hYmxlZCA9IHZhbHVlLmVtYWlsTGlua0VuYWJsZWQ7XG4gICAgfVxuICB9XG5cbiAgLy8gZW1haWxfbGlua19jdXN0b21fdXJsIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZW1haWxMaW5rQ3VzdG9tVXJsPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBlbWFpbExpbmtDdXN0b21VcmwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdlbWFpbF9saW5rX2N1c3RvbV91cmwnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGVtYWlsTGlua0N1c3RvbVVybCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZW1haWxMaW5rQ3VzdG9tVXJsID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RW1haWxMaW5rQ3VzdG9tVXJsKCkge1xuICAgIHRoaXMuX2VtYWlsTGlua0N1c3RvbVVybCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZW1haWxMaW5rQ3VzdG9tVXJsSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VtYWlsTGlua0N1c3RvbVVybDtcbiAgfVxuXG4gIC8vIGVtYWlsX2xpbmtfZW5hYmxlZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9lbWFpbExpbmtFbmFibGVkPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBlbWFpbExpbmtFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2VtYWlsX2xpbmtfZW5hYmxlZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgZW1haWxMaW5rRW5hYmxlZCh2YWx1ZTogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZW1haWxMaW5rRW5hYmxlZCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBlbWFpbExpbmtFbmFibGVkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VtYWlsTGlua0VuYWJsZWQ7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nRW5kcG9pbnRSZXN0cmljdGlvbnMge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI21heF9lbmRwb2ludF90cnVzdF9kdXJhdGlvbl9pbl9kYXlzIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNtYXhfZW5kcG9pbnRfdHJ1c3RfZHVyYXRpb25faW5fZGF5c31cbiAgKi9cbiAgcmVhZG9ubHkgbWF4RW5kcG9pbnRUcnVzdER1cmF0aW9uSW5EYXlzOiBudW1iZXI7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjbWF4X2Vucm9sbGVkX2RldmljZXMgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI21heF9lbnJvbGxlZF9kZXZpY2VzfVxuICAqL1xuICByZWFkb25seSBtYXhFbnJvbGxlZERldmljZXM6IG51bWJlcjtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNtYXhfaW5jb3JyZWN0X2F0dGVtcHRzIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNtYXhfaW5jb3JyZWN0X2F0dGVtcHRzfVxuICAqL1xuICByZWFkb25seSBtYXhJbmNvcnJlY3RBdHRlbXB0czogbnVtYmVyO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI21heF90cnVzdGVkX2VuZHBvaW50cyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjbWF4X3RydXN0ZWRfZW5kcG9pbnRzfVxuICAqL1xuICByZWFkb25seSBtYXhUcnVzdGVkRW5kcG9pbnRzOiBudW1iZXI7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjdHJ1c3RlZF9lbmRwb2ludHNfZW5hYmxlZCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjdHJ1c3RlZF9lbmRwb2ludHNfZW5hYmxlZH1cbiAgKi9cbiAgcmVhZG9ubHkgdHJ1c3RlZEVuZHBvaW50c0VuYWJsZWQ6IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0VuZHBvaW50UmVzdHJpY3Rpb25zVG9UZXJyYWZvcm0oc3RydWN0PzogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nRW5kcG9pbnRSZXN0cmljdGlvbnNPdXRwdXRSZWZlcmVuY2UgfCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdFbmRwb2ludFJlc3RyaWN0aW9ucyk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtYXhfZW5kcG9pbnRfdHJ1c3RfZHVyYXRpb25faW5fZGF5czogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5tYXhFbmRwb2ludFRydXN0RHVyYXRpb25JbkRheXMpLFxuICAgIG1heF9lbnJvbGxlZF9kZXZpY2VzOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1heEVucm9sbGVkRGV2aWNlcyksXG4gICAgbWF4X2luY29ycmVjdF9hdHRlbXB0czogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5tYXhJbmNvcnJlY3RBdHRlbXB0cyksXG4gICAgbWF4X3RydXN0ZWRfZW5kcG9pbnRzOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1heFRydXN0ZWRFbmRwb2ludHMpLFxuICAgIHRydXN0ZWRfZW5kcG9pbnRzX2VuYWJsZWQ6IGNka3RmLmJvb2xlYW5Ub1RlcnJhZm9ybShzdHJ1Y3QhLnRydXN0ZWRFbmRwb2ludHNFbmFibGVkKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdFbmRwb2ludFJlc3RyaWN0aW9uc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0VuZHBvaW50UmVzdHJpY3Rpb25zT3V0cHV0UmVmZXJlbmNlIHwgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nRW5kcG9pbnRSZXN0cmljdGlvbnMpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIG1heF9lbmRwb2ludF90cnVzdF9kdXJhdGlvbl9pbl9kYXlzOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5tYXhFbmRwb2ludFRydXN0RHVyYXRpb25JbkRheXMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIG1heF9lbnJvbGxlZF9kZXZpY2VzOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5tYXhFbnJvbGxlZERldmljZXMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIG1heF9pbmNvcnJlY3RfYXR0ZW1wdHM6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1heEluY29ycmVjdEF0dGVtcHRzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBtYXhfdHJ1c3RlZF9lbmRwb2ludHM6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1heFRydXN0ZWRFbmRwb2ludHMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHRydXN0ZWRfZW5kcG9pbnRzX2VuYWJsZWQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS50cnVzdGVkRW5kcG9pbnRzRW5hYmxlZCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nRW5kcG9pbnRSZXN0cmljdGlvbnNPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0VuZHBvaW50UmVzdHJpY3Rpb25zIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9tYXhFbmRwb2ludFRydXN0RHVyYXRpb25JbkRheXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWF4RW5kcG9pbnRUcnVzdER1cmF0aW9uSW5EYXlzID0gdGhpcy5fbWF4RW5kcG9pbnRUcnVzdER1cmF0aW9uSW5EYXlzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWF4RW5yb2xsZWREZXZpY2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1heEVucm9sbGVkRGV2aWNlcyA9IHRoaXMuX21heEVucm9sbGVkRGV2aWNlcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX21heEluY29ycmVjdEF0dGVtcHRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1heEluY29ycmVjdEF0dGVtcHRzID0gdGhpcy5fbWF4SW5jb3JyZWN0QXR0ZW1wdHM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9tYXhUcnVzdGVkRW5kcG9pbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1heFRydXN0ZWRFbmRwb2ludHMgPSB0aGlzLl9tYXhUcnVzdGVkRW5kcG9pbnRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdHJ1c3RlZEVuZHBvaW50c0VuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudHJ1c3RlZEVuZHBvaW50c0VuYWJsZWQgPSB0aGlzLl90cnVzdGVkRW5kcG9pbnRzRW5hYmxlZDtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0VuZHBvaW50UmVzdHJpY3Rpb25zIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fbWF4RW5kcG9pbnRUcnVzdER1cmF0aW9uSW5EYXlzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbWF4RW5yb2xsZWREZXZpY2VzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbWF4SW5jb3JyZWN0QXR0ZW1wdHMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tYXhUcnVzdGVkRW5kcG9pbnRzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdHJ1c3RlZEVuZHBvaW50c0VuYWJsZWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX21heEVuZHBvaW50VHJ1c3REdXJhdGlvbkluRGF5cyA9IHZhbHVlLm1heEVuZHBvaW50VHJ1c3REdXJhdGlvbkluRGF5cztcbiAgICAgIHRoaXMuX21heEVucm9sbGVkRGV2aWNlcyA9IHZhbHVlLm1heEVucm9sbGVkRGV2aWNlcztcbiAgICAgIHRoaXMuX21heEluY29ycmVjdEF0dGVtcHRzID0gdmFsdWUubWF4SW5jb3JyZWN0QXR0ZW1wdHM7XG4gICAgICB0aGlzLl9tYXhUcnVzdGVkRW5kcG9pbnRzID0gdmFsdWUubWF4VHJ1c3RlZEVuZHBvaW50cztcbiAgICAgIHRoaXMuX3RydXN0ZWRFbmRwb2ludHNFbmFibGVkID0gdmFsdWUudHJ1c3RlZEVuZHBvaW50c0VuYWJsZWQ7XG4gICAgfVxuICB9XG5cbiAgLy8gbWF4X2VuZHBvaW50X3RydXN0X2R1cmF0aW9uX2luX2RheXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbWF4RW5kcG9pbnRUcnVzdER1cmF0aW9uSW5EYXlzPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtYXhFbmRwb2ludFRydXN0RHVyYXRpb25JbkRheXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdtYXhfZW5kcG9pbnRfdHJ1c3RfZHVyYXRpb25faW5fZGF5cycpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4RW5kcG9pbnRUcnVzdER1cmF0aW9uSW5EYXlzKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXhFbmRwb2ludFRydXN0RHVyYXRpb25JbkRheXMgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWF4RW5kcG9pbnRUcnVzdER1cmF0aW9uSW5EYXlzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21heEVuZHBvaW50VHJ1c3REdXJhdGlvbkluRGF5cztcbiAgfVxuXG4gIC8vIG1heF9lbnJvbGxlZF9kZXZpY2VzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX21heEVucm9sbGVkRGV2aWNlcz86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWF4RW5yb2xsZWREZXZpY2VzKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnbWF4X2Vucm9sbGVkX2RldmljZXMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heEVucm9sbGVkRGV2aWNlcyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4RW5yb2xsZWREZXZpY2VzID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1heEVucm9sbGVkRGV2aWNlc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tYXhFbnJvbGxlZERldmljZXM7XG4gIH1cblxuICAvLyBtYXhfaW5jb3JyZWN0X2F0dGVtcHRzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX21heEluY29ycmVjdEF0dGVtcHRzPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtYXhJbmNvcnJlY3RBdHRlbXB0cygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21heF9pbmNvcnJlY3RfYXR0ZW1wdHMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heEluY29ycmVjdEF0dGVtcHRzKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXhJbmNvcnJlY3RBdHRlbXB0cyA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtYXhJbmNvcnJlY3RBdHRlbXB0c0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tYXhJbmNvcnJlY3RBdHRlbXB0cztcbiAgfVxuXG4gIC8vIG1heF90cnVzdGVkX2VuZHBvaW50cyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9tYXhUcnVzdGVkRW5kcG9pbnRzPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtYXhUcnVzdGVkRW5kcG9pbnRzKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnbWF4X3RydXN0ZWRfZW5kcG9pbnRzJyk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhUcnVzdGVkRW5kcG9pbnRzKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXhUcnVzdGVkRW5kcG9pbnRzID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1heFRydXN0ZWRFbmRwb2ludHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4VHJ1c3RlZEVuZHBvaW50cztcbiAgfVxuXG4gIC8vIHRydXN0ZWRfZW5kcG9pbnRzX2VuYWJsZWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfdHJ1c3RlZEVuZHBvaW50c0VuYWJsZWQ/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IHRydXN0ZWRFbmRwb2ludHNFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ3RydXN0ZWRfZW5kcG9pbnRzX2VuYWJsZWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRydXN0ZWRFbmRwb2ludHNFbmFibGVkKHZhbHVlOiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl90cnVzdGVkRW5kcG9pbnRzRW5hYmxlZCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0cnVzdGVkRW5kcG9pbnRzRW5hYmxlZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90cnVzdGVkRW5kcG9pbnRzRW5hYmxlZDtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdJZGVudGl0eVN0b3JlU2V0dGluZ3Mge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI21vYmlsZV9udW1iZXJfZW5hYmxlZCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjbW9iaWxlX251bWJlcl9lbmFibGVkfVxuICAqL1xuICByZWFkb25seSBtb2JpbGVOdW1iZXJFbmFibGVkPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI21vYmlsZV9udW1iZXJfdXBkYXRlX2VuYWJsZWQgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI21vYmlsZV9udW1iZXJfdXBkYXRlX2VuYWJsZWR9XG4gICovXG4gIHJlYWRvbmx5IG1vYmlsZU51bWJlclVwZGF0ZUVuYWJsZWQ/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdJZGVudGl0eVN0b3JlU2V0dGluZ3NUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdJZGVudGl0eVN0b3JlU2V0dGluZ3NPdXRwdXRSZWZlcmVuY2UgfCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdJZGVudGl0eVN0b3JlU2V0dGluZ3MpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgbW9iaWxlX251bWJlcl9lbmFibGVkOiBjZGt0Zi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5tb2JpbGVOdW1iZXJFbmFibGVkKSxcbiAgICBtb2JpbGVfbnVtYmVyX3VwZGF0ZV9lbmFibGVkOiBjZGt0Zi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5tb2JpbGVOdW1iZXJVcGRhdGVFbmFibGVkKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdJZGVudGl0eVN0b3JlU2V0dGluZ3NUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdJZGVudGl0eVN0b3JlU2V0dGluZ3NPdXRwdXRSZWZlcmVuY2UgfCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdJZGVudGl0eVN0b3JlU2V0dGluZ3MpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIG1vYmlsZV9udW1iZXJfZW5hYmxlZDoge1xuICAgICAgdmFsdWU6IGNka3RmLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1vYmlsZU51bWJlckVuYWJsZWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBtb2JpbGVfbnVtYmVyX3VwZGF0ZV9lbmFibGVkOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEubW9iaWxlTnVtYmVyVXBkYXRlRW5hYmxlZCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWRlbnRpdHlTdG9yZVNldHRpbmdzT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdGYuQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdJZGVudGl0eVN0b3JlU2V0dGluZ3MgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX21vYmlsZU51bWJlckVuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubW9iaWxlTnVtYmVyRW5hYmxlZCA9IHRoaXMuX21vYmlsZU51bWJlckVuYWJsZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9tb2JpbGVOdW1iZXJVcGRhdGVFbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1vYmlsZU51bWJlclVwZGF0ZUVuYWJsZWQgPSB0aGlzLl9tb2JpbGVOdW1iZXJVcGRhdGVFbmFibGVkO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWRlbnRpdHlTdG9yZVNldHRpbmdzIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fbW9iaWxlTnVtYmVyRW5hYmxlZCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21vYmlsZU51bWJlclVwZGF0ZUVuYWJsZWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX21vYmlsZU51bWJlckVuYWJsZWQgPSB2YWx1ZS5tb2JpbGVOdW1iZXJFbmFibGVkO1xuICAgICAgdGhpcy5fbW9iaWxlTnVtYmVyVXBkYXRlRW5hYmxlZCA9IHZhbHVlLm1vYmlsZU51bWJlclVwZGF0ZUVuYWJsZWQ7XG4gICAgfVxuICB9XG5cbiAgLy8gbW9iaWxlX251bWJlcl9lbmFibGVkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbW9iaWxlTnVtYmVyRW5hYmxlZD86IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgbW9iaWxlTnVtYmVyRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdtb2JpbGVfbnVtYmVyX2VuYWJsZWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1vYmlsZU51bWJlckVuYWJsZWQodmFsdWU6IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX21vYmlsZU51bWJlckVuYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRNb2JpbGVOdW1iZXJFbmFibGVkKCkge1xuICAgIHRoaXMuX21vYmlsZU51bWJlckVuYWJsZWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1vYmlsZU51bWJlckVuYWJsZWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbW9iaWxlTnVtYmVyRW5hYmxlZDtcbiAgfVxuXG4gIC8vIG1vYmlsZV9udW1iZXJfdXBkYXRlX2VuYWJsZWQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9tb2JpbGVOdW1iZXJVcGRhdGVFbmFibGVkPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBtb2JpbGVOdW1iZXJVcGRhdGVFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ21vYmlsZV9udW1iZXJfdXBkYXRlX2VuYWJsZWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1vYmlsZU51bWJlclVwZGF0ZUVuYWJsZWQodmFsdWU6IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX21vYmlsZU51bWJlclVwZGF0ZUVuYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRNb2JpbGVOdW1iZXJVcGRhdGVFbmFibGVkKCkge1xuICAgIHRoaXMuX21vYmlsZU51bWJlclVwZGF0ZUVuYWJsZWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1vYmlsZU51bWJlclVwZGF0ZUVuYWJsZWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbW9iaWxlTnVtYmVyVXBkYXRlRW5hYmxlZDtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdOb3RpZmljYXRpb25TZXR0aW5ncyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjcHVsbF9lbmFibGVkIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNwdWxsX2VuYWJsZWR9XG4gICovXG4gIHJlYWRvbmx5IHB1bGxFbmFibGVkOiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdOb3RpZmljYXRpb25TZXR0aW5nc1RvVGVycmFmb3JtKHN0cnVjdD86IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ05vdGlmaWNhdGlvblNldHRpbmdzT3V0cHV0UmVmZXJlbmNlIHwgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nTm90aWZpY2F0aW9uU2V0dGluZ3MpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcHVsbF9lbmFibGVkOiBjZGt0Zi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5wdWxsRW5hYmxlZCksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nTm90aWZpY2F0aW9uU2V0dGluZ3NUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdOb3RpZmljYXRpb25TZXR0aW5nc091dHB1dFJlZmVyZW5jZSB8IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ05vdGlmaWNhdGlvblNldHRpbmdzKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBwdWxsX2VuYWJsZWQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5wdWxsRW5hYmxlZCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nTm90aWZpY2F0aW9uU2V0dGluZ3NPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ05vdGlmaWNhdGlvblNldHRpbmdzIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9wdWxsRW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5wdWxsRW5hYmxlZCA9IHRoaXMuX3B1bGxFbmFibGVkO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nTm90aWZpY2F0aW9uU2V0dGluZ3MgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9wdWxsRW5hYmxlZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fcHVsbEVuYWJsZWQgPSB2YWx1ZS5wdWxsRW5hYmxlZDtcbiAgICB9XG4gIH1cblxuICAvLyBwdWxsX2VuYWJsZWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfcHVsbEVuYWJsZWQ/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IHB1bGxFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ3B1bGxfZW5hYmxlZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgcHVsbEVuYWJsZWQodmFsdWU6IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX3B1bGxFbmFibGVkID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHB1bGxFbmFibGVkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3B1bGxFbmFibGVkO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1RhZ3Mge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI2tleSBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcja2V5fVxuICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyN2YWx1ZSBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjdmFsdWV9XG4gICovXG4gIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUYWdzVG9UZXJyYWZvcm0oc3RydWN0PzogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVGFncyB8IGNka3RmLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGtleTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5rZXkpLFxuICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnZhbHVlKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUYWdzVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVGFncyB8IGNka3RmLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBrZXk6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmtleSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgdmFsdWU6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnZhbHVlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1RhZ3NPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gIHByaXZhdGUgcmVzb2x2YWJsZVZhbHVlPzogY2RrdGYuSVJlc29sdmFibGU7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJbmRleCB0aGUgaW5kZXggb2YgdGhpcyBpdGVtIGluIHRoZSBsaXN0XG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBjb21wbGV4T2JqZWN0SW5kZXg6IG51bWJlciwgY29tcGxleE9iamVjdElzRnJvbVNldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQsIGNvbXBsZXhPYmplY3RJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVGFncyB8IGNka3RmLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yZXNvbHZhYmxlVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmFibGVWYWx1ZTtcbiAgICB9XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fa2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmtleSA9IHRoaXMuX2tleTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnZhbHVlID0gdGhpcy5fdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUYWdzIHwgY2RrdGYuSVJlc29sdmFibGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2tleSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2tleSA9IHZhbHVlLmtleTtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWUudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8ga2V5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2tleT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQga2V5KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgna2V5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBrZXkodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2tleSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBrZXlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fa2V5O1xuICB9XG5cbiAgLy8gdmFsdWUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfdmFsdWU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndmFsdWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB2YWx1ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVGFnc0xpc3QgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4TGlzdCB7XG4gIHB1YmxpYyBpbnRlcm5hbFZhbHVlPyA6IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1RhZ3NbXSB8IGNka3RmLklSZXNvbHZhYmxlXG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIHdyYXBzU2V0IHdoZXRoZXIgdGhlIGxpc3QgaXMgd3JhcHBpbmcgYSBzZXQgKHdpbGwgYWRkIHRvbGlzdCgpIHRvIGJlIGFibGUgdG8gYWNjZXNzIGFuIGl0ZW0gdmlhIGFuIGluZGV4KVxuICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgdGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCBwcm90ZWN0ZWQgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIHByb3RlY3RlZCB3cmFwc1NldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIHdyYXBzU2V0KVxuICB9XG5cbiAgLyoqXG4gICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm5cbiAgKi9cbiAgcHVibGljIGdldChpbmRleDogbnVtYmVyKTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVGFnc091dHB1dFJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIG5ldyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUYWdzT3V0cHV0UmVmZXJlbmNlKHRoaXMudGVycmFmb3JtUmVzb3VyY2UsIHRoaXMudGVycmFmb3JtQXR0cmlidXRlLCBpbmRleCwgdGhpcy53cmFwc1NldCk7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVGhpcmRQYXJ0eUZhY3RvciB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjZHVvX3NlY3VyaXR5IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNkdW9fc2VjdXJpdHl9XG4gICovXG4gIHJlYWRvbmx5IGR1b1NlY3VyaXR5OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUaGlyZFBhcnR5RmFjdG9yVG9UZXJyYWZvcm0oc3RydWN0PzogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVGhpcmRQYXJ0eUZhY3Rvck91dHB1dFJlZmVyZW5jZSB8IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1RoaXJkUGFydHlGYWN0b3IpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZHVvX3NlY3VyaXR5OiBjZGt0Zi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5kdW9TZWN1cml0eSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVGhpcmRQYXJ0eUZhY3RvclRvSGNsVGVycmFmb3JtKHN0cnVjdD86IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1RoaXJkUGFydHlGYWN0b3JPdXRwdXRSZWZlcmVuY2UgfCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUaGlyZFBhcnR5RmFjdG9yKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBkdW9fc2VjdXJpdHk6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5kdW9TZWN1cml0eSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVGhpcmRQYXJ0eUZhY3Rvck91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVGhpcmRQYXJ0eUZhY3RvciB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZHVvU2VjdXJpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZHVvU2VjdXJpdHkgPSB0aGlzLl9kdW9TZWN1cml0eTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1RoaXJkUGFydHlGYWN0b3IgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9kdW9TZWN1cml0eSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fZHVvU2VjdXJpdHkgPSB2YWx1ZS5kdW9TZWN1cml0eTtcbiAgICB9XG4gIH1cblxuICAvLyBkdW9fc2VjdXJpdHkgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfZHVvU2VjdXJpdHk/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGR1b1NlY3VyaXR5KCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2R1b19zZWN1cml0eScpO1xuICB9XG4gIHB1YmxpYyBzZXQgZHVvU2VjdXJpdHkodmFsdWU6IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2R1b1NlY3VyaXR5ID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGR1b1NlY3VyaXR5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2R1b1NlY3VyaXR5O1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1RpbWVvdXRzIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNjcmVhdGUgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI2NyZWF0ZX1cbiAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI2RlbGV0ZSBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjZGVsZXRlfVxuICAqL1xuICByZWFkb25seSBkZWxldGU/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjdXBkYXRlIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyN1cGRhdGV9XG4gICovXG4gIHJlYWRvbmx5IHVwZGF0ZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1RpbWVvdXRzVG9UZXJyYWZvcm0oc3RydWN0PzogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVGltZW91dHMgfCBjZGt0Zi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjcmVhdGU6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuY3JlYXRlKSxcbiAgICBkZWxldGU6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuZGVsZXRlKSxcbiAgICB1cGRhdGU6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEudXBkYXRlKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUaW1lb3V0c1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1RpbWVvdXRzIHwgY2RrdGYuSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGNyZWF0ZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuY3JlYXRlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBkZWxldGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmRlbGV0ZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgdXBkYXRlOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS51cGRhdGUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVGltZW91dHNPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gIHByaXZhdGUgcmVzb2x2YWJsZVZhbHVlPzogY2RrdGYuSVJlc29sdmFibGU7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1RpbWVvdXRzIHwgY2RrdGYuSVJlc29sdmFibGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJlc29sdmFibGVWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2YWJsZVZhbHVlO1xuICAgIH1cbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9jcmVhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuY3JlYXRlID0gdGhpcy5fY3JlYXRlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGVsZXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmRlbGV0ZSA9IHRoaXMuX2RlbGV0ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3VwZGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC51cGRhdGUgPSB0aGlzLl91cGRhdGU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUaW1lb3V0cyB8IGNka3RmLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jcmVhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9kZWxldGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl91cGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUodmFsdWUpKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fY3JlYXRlID0gdmFsdWUuY3JlYXRlO1xuICAgICAgdGhpcy5fZGVsZXRlID0gdmFsdWUuZGVsZXRlO1xuICAgICAgdGhpcy5fdXBkYXRlID0gdmFsdWUudXBkYXRlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNyZWF0ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jcmVhdGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGNyZWF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2NyZWF0ZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgY3JlYXRlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jcmVhdGUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDcmVhdGUoKSB7XG4gICAgdGhpcy5fY3JlYXRlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBjcmVhdGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlO1xuICB9XG5cbiAgLy8gZGVsZXRlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2RlbGV0ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgZGVsZXRlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZGVsZXRlJyk7XG4gIH1cbiAgcHVibGljIHNldCBkZWxldGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2RlbGV0ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldERlbGV0ZSgpIHtcbiAgICB0aGlzLl9kZWxldGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGRlbGV0ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kZWxldGU7XG4gIH1cblxuICAvLyB1cGRhdGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdXBkYXRlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCB1cGRhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd1cGRhdGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHVwZGF0ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdXBkYXRlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VXBkYXRlKCkge1xuICAgIHRoaXMuX3VwZGF0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdXBkYXRlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VwZGF0ZTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUb3RwU2V0dGluZ3Mge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI2VtYWlsX290cF92YWxpZGl0eV9kdXJhdGlvbl9pbl9taW5zIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNlbWFpbF9vdHBfdmFsaWRpdHlfZHVyYXRpb25faW5fbWluc31cbiAgKi9cbiAgcmVhZG9ubHkgZW1haWxPdHBWYWxpZGl0eUR1cmF0aW9uSW5NaW5zOiBudW1iZXI7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjZW1haWxfcGFzc2NvZGVfbGVuZ3RoIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNlbWFpbF9wYXNzY29kZV9sZW5ndGh9XG4gICovXG4gIHJlYWRvbmx5IGVtYWlsUGFzc2NvZGVMZW5ndGg6IG51bWJlcjtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNoYXNoaW5nX2FsZ29yaXRobSBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjaGFzaGluZ19hbGdvcml0aG19XG4gICovXG4gIHJlYWRvbmx5IGhhc2hpbmdBbGdvcml0aG06IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNqd3RfdmFsaWRpdHlfZHVyYXRpb25faW5fc2VjcyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjand0X3ZhbGlkaXR5X2R1cmF0aW9uX2luX3NlY3N9XG4gICovXG4gIHJlYWRvbmx5IGp3dFZhbGlkaXR5RHVyYXRpb25JblNlY3M6IG51bWJlcjtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNrZXlfcmVmcmVzaF9pbnRlcnZhbF9pbl9kYXlzIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNrZXlfcmVmcmVzaF9pbnRlcnZhbF9pbl9kYXlzfVxuICAqL1xuICByZWFkb25seSBrZXlSZWZyZXNoSW50ZXJ2YWxJbkRheXM6IG51bWJlcjtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNwYXNzY29kZV9sZW5ndGggSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI3Bhc3Njb2RlX2xlbmd0aH1cbiAgKi9cbiAgcmVhZG9ubHkgcGFzc2NvZGVMZW5ndGg6IG51bWJlcjtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNzbXNfb3RwX3ZhbGlkaXR5X2R1cmF0aW9uX2luX21pbnMgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI3Ntc19vdHBfdmFsaWRpdHlfZHVyYXRpb25faW5fbWluc31cbiAgKi9cbiAgcmVhZG9ubHkgc21zT3RwVmFsaWRpdHlEdXJhdGlvbkluTWluczogbnVtYmVyO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI3Ntc19wYXNzY29kZV9sZW5ndGggSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI3Ntc19wYXNzY29kZV9sZW5ndGh9XG4gICovXG4gIHJlYWRvbmx5IHNtc1Bhc3Njb2RlTGVuZ3RoOiBudW1iZXI7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjdGltZV9zdGVwX2luX3NlY3MgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI3RpbWVfc3RlcF9pbl9zZWNzfVxuICAqL1xuICByZWFkb25seSB0aW1lU3RlcEluU2VjczogbnVtYmVyO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI3RpbWVfc3RlcF90b2xlcmFuY2UgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI3RpbWVfc3RlcF90b2xlcmFuY2V9XG4gICovXG4gIHJlYWRvbmx5IHRpbWVTdGVwVG9sZXJhbmNlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUb3RwU2V0dGluZ3NUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUb3RwU2V0dGluZ3NPdXRwdXRSZWZlcmVuY2UgfCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUb3RwU2V0dGluZ3MpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZW1haWxfb3RwX3ZhbGlkaXR5X2R1cmF0aW9uX2luX21pbnM6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEuZW1haWxPdHBWYWxpZGl0eUR1cmF0aW9uSW5NaW5zKSxcbiAgICBlbWFpbF9wYXNzY29kZV9sZW5ndGg6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEuZW1haWxQYXNzY29kZUxlbmd0aCksXG4gICAgaGFzaGluZ19hbGdvcml0aG06IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuaGFzaGluZ0FsZ29yaXRobSksXG4gICAgand0X3ZhbGlkaXR5X2R1cmF0aW9uX2luX3NlY3M6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEuand0VmFsaWRpdHlEdXJhdGlvbkluU2VjcyksXG4gICAga2V5X3JlZnJlc2hfaW50ZXJ2YWxfaW5fZGF5czogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5rZXlSZWZyZXNoSW50ZXJ2YWxJbkRheXMpLFxuICAgIHBhc3Njb2RlX2xlbmd0aDogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5wYXNzY29kZUxlbmd0aCksXG4gICAgc21zX290cF92YWxpZGl0eV9kdXJhdGlvbl9pbl9taW5zOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLnNtc090cFZhbGlkaXR5RHVyYXRpb25Jbk1pbnMpLFxuICAgIHNtc19wYXNzY29kZV9sZW5ndGg6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEuc21zUGFzc2NvZGVMZW5ndGgpLFxuICAgIHRpbWVfc3RlcF9pbl9zZWNzOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLnRpbWVTdGVwSW5TZWNzKSxcbiAgICB0aW1lX3N0ZXBfdG9sZXJhbmNlOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLnRpbWVTdGVwVG9sZXJhbmNlKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUb3RwU2V0dGluZ3NUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUb3RwU2V0dGluZ3NPdXRwdXRSZWZlcmVuY2UgfCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUb3RwU2V0dGluZ3MpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGVtYWlsX290cF92YWxpZGl0eV9kdXJhdGlvbl9pbl9taW5zOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5lbWFpbE90cFZhbGlkaXR5RHVyYXRpb25Jbk1pbnMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIGVtYWlsX3Bhc3Njb2RlX2xlbmd0aDoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZW1haWxQYXNzY29kZUxlbmd0aCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgaGFzaGluZ19hbGdvcml0aG06IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmhhc2hpbmdBbGdvcml0aG0pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGp3dF92YWxpZGl0eV9kdXJhdGlvbl9pbl9zZWNzOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5qd3RWYWxpZGl0eUR1cmF0aW9uSW5TZWNzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBrZXlfcmVmcmVzaF9pbnRlcnZhbF9pbl9kYXlzOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5rZXlSZWZyZXNoSW50ZXJ2YWxJbkRheXMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHBhc3Njb2RlX2xlbmd0aDoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEucGFzc2NvZGVMZW5ndGgpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHNtc19vdHBfdmFsaWRpdHlfZHVyYXRpb25faW5fbWluczoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEuc21zT3RwVmFsaWRpdHlEdXJhdGlvbkluTWlucyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgc21zX3Bhc3Njb2RlX2xlbmd0aDoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEuc21zUGFzc2NvZGVMZW5ndGgpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHRpbWVfc3RlcF9pbl9zZWNzOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS50aW1lU3RlcEluU2VjcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgdGltZV9zdGVwX3RvbGVyYW5jZToge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEudGltZVN0ZXBUb2xlcmFuY2UpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVG90cFNldHRpbmdzT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdGYuQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUb3RwU2V0dGluZ3MgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2VtYWlsT3RwVmFsaWRpdHlEdXJhdGlvbkluTWlucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5lbWFpbE90cFZhbGlkaXR5RHVyYXRpb25Jbk1pbnMgPSB0aGlzLl9lbWFpbE90cFZhbGlkaXR5RHVyYXRpb25Jbk1pbnM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9lbWFpbFBhc3Njb2RlTGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmVtYWlsUGFzc2NvZGVMZW5ndGggPSB0aGlzLl9lbWFpbFBhc3Njb2RlTGVuZ3RoO1xuICAgIH1cbiAgICBpZiAodGhpcy5faGFzaGluZ0FsZ29yaXRobSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5oYXNoaW5nQWxnb3JpdGhtID0gdGhpcy5faGFzaGluZ0FsZ29yaXRobTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2p3dFZhbGlkaXR5RHVyYXRpb25JblNlY3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuand0VmFsaWRpdHlEdXJhdGlvbkluU2VjcyA9IHRoaXMuX2p3dFZhbGlkaXR5RHVyYXRpb25JblNlY3M7XG4gICAgfVxuICAgIGlmICh0aGlzLl9rZXlSZWZyZXNoSW50ZXJ2YWxJbkRheXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQua2V5UmVmcmVzaEludGVydmFsSW5EYXlzID0gdGhpcy5fa2V5UmVmcmVzaEludGVydmFsSW5EYXlzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcGFzc2NvZGVMZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucGFzc2NvZGVMZW5ndGggPSB0aGlzLl9wYXNzY29kZUxlbmd0aDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3Ntc090cFZhbGlkaXR5RHVyYXRpb25Jbk1pbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuc21zT3RwVmFsaWRpdHlEdXJhdGlvbkluTWlucyA9IHRoaXMuX3Ntc090cFZhbGlkaXR5RHVyYXRpb25Jbk1pbnM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zbXNQYXNzY29kZUxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zbXNQYXNzY29kZUxlbmd0aCA9IHRoaXMuX3Ntc1Bhc3Njb2RlTGVuZ3RoO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGltZVN0ZXBJblNlY3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudGltZVN0ZXBJblNlY3MgPSB0aGlzLl90aW1lU3RlcEluU2VjcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RpbWVTdGVwVG9sZXJhbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnRpbWVTdGVwVG9sZXJhbmNlID0gdGhpcy5fdGltZVN0ZXBUb2xlcmFuY2U7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUb3RwU2V0dGluZ3MgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9lbWFpbE90cFZhbGlkaXR5RHVyYXRpb25Jbk1pbnMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9lbWFpbFBhc3Njb2RlTGVuZ3RoID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5faGFzaGluZ0FsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2p3dFZhbGlkaXR5RHVyYXRpb25JblNlY3MgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9rZXlSZWZyZXNoSW50ZXJ2YWxJbkRheXMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9wYXNzY29kZUxlbmd0aCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3Ntc090cFZhbGlkaXR5RHVyYXRpb25Jbk1pbnMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zbXNQYXNzY29kZUxlbmd0aCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RpbWVTdGVwSW5TZWNzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGltZVN0ZXBUb2xlcmFuY2UgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2VtYWlsT3RwVmFsaWRpdHlEdXJhdGlvbkluTWlucyA9IHZhbHVlLmVtYWlsT3RwVmFsaWRpdHlEdXJhdGlvbkluTWlucztcbiAgICAgIHRoaXMuX2VtYWlsUGFzc2NvZGVMZW5ndGggPSB2YWx1ZS5lbWFpbFBhc3Njb2RlTGVuZ3RoO1xuICAgICAgdGhpcy5faGFzaGluZ0FsZ29yaXRobSA9IHZhbHVlLmhhc2hpbmdBbGdvcml0aG07XG4gICAgICB0aGlzLl9qd3RWYWxpZGl0eUR1cmF0aW9uSW5TZWNzID0gdmFsdWUuand0VmFsaWRpdHlEdXJhdGlvbkluU2VjcztcbiAgICAgIHRoaXMuX2tleVJlZnJlc2hJbnRlcnZhbEluRGF5cyA9IHZhbHVlLmtleVJlZnJlc2hJbnRlcnZhbEluRGF5cztcbiAgICAgIHRoaXMuX3Bhc3Njb2RlTGVuZ3RoID0gdmFsdWUucGFzc2NvZGVMZW5ndGg7XG4gICAgICB0aGlzLl9zbXNPdHBWYWxpZGl0eUR1cmF0aW9uSW5NaW5zID0gdmFsdWUuc21zT3RwVmFsaWRpdHlEdXJhdGlvbkluTWlucztcbiAgICAgIHRoaXMuX3Ntc1Bhc3Njb2RlTGVuZ3RoID0gdmFsdWUuc21zUGFzc2NvZGVMZW5ndGg7XG4gICAgICB0aGlzLl90aW1lU3RlcEluU2VjcyA9IHZhbHVlLnRpbWVTdGVwSW5TZWNzO1xuICAgICAgdGhpcy5fdGltZVN0ZXBUb2xlcmFuY2UgPSB2YWx1ZS50aW1lU3RlcFRvbGVyYW5jZTtcbiAgICB9XG4gIH1cblxuICAvLyBlbWFpbF9vdHBfdmFsaWRpdHlfZHVyYXRpb25faW5fbWlucyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9lbWFpbE90cFZhbGlkaXR5RHVyYXRpb25Jbk1pbnM/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGVtYWlsT3RwVmFsaWRpdHlEdXJhdGlvbkluTWlucygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ2VtYWlsX290cF92YWxpZGl0eV9kdXJhdGlvbl9pbl9taW5zJyk7XG4gIH1cbiAgcHVibGljIHNldCBlbWFpbE90cFZhbGlkaXR5RHVyYXRpb25Jbk1pbnModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2VtYWlsT3RwVmFsaWRpdHlEdXJhdGlvbkluTWlucyA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBlbWFpbE90cFZhbGlkaXR5RHVyYXRpb25Jbk1pbnNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZW1haWxPdHBWYWxpZGl0eUR1cmF0aW9uSW5NaW5zO1xuICB9XG5cbiAgLy8gZW1haWxfcGFzc2NvZGVfbGVuZ3RoIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2VtYWlsUGFzc2NvZGVMZW5ndGg/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGVtYWlsUGFzc2NvZGVMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdlbWFpbF9wYXNzY29kZV9sZW5ndGgnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGVtYWlsUGFzc2NvZGVMZW5ndGgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2VtYWlsUGFzc2NvZGVMZW5ndGggPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZW1haWxQYXNzY29kZUxlbmd0aElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9lbWFpbFBhc3Njb2RlTGVuZ3RoO1xuICB9XG5cbiAgLy8gaGFzaGluZ19hbGdvcml0aG0gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfaGFzaGluZ0FsZ29yaXRobT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgaGFzaGluZ0FsZ29yaXRobSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2hhc2hpbmdfYWxnb3JpdGhtJyk7XG4gIH1cbiAgcHVibGljIHNldCBoYXNoaW5nQWxnb3JpdGhtKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9oYXNoaW5nQWxnb3JpdGhtID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGhhc2hpbmdBbGdvcml0aG1JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5faGFzaGluZ0FsZ29yaXRobTtcbiAgfVxuXG4gIC8vIGp3dF92YWxpZGl0eV9kdXJhdGlvbl9pbl9zZWNzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2p3dFZhbGlkaXR5RHVyYXRpb25JblNlY3M/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGp3dFZhbGlkaXR5RHVyYXRpb25JblNlY3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdqd3RfdmFsaWRpdHlfZHVyYXRpb25faW5fc2VjcycpO1xuICB9XG4gIHB1YmxpYyBzZXQgand0VmFsaWRpdHlEdXJhdGlvbkluU2Vjcyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fand0VmFsaWRpdHlEdXJhdGlvbkluU2VjcyA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBqd3RWYWxpZGl0eUR1cmF0aW9uSW5TZWNzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2p3dFZhbGlkaXR5RHVyYXRpb25JblNlY3M7XG4gIH1cblxuICAvLyBrZXlfcmVmcmVzaF9pbnRlcnZhbF9pbl9kYXlzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2tleVJlZnJlc2hJbnRlcnZhbEluRGF5cz86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQga2V5UmVmcmVzaEludGVydmFsSW5EYXlzKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgna2V5X3JlZnJlc2hfaW50ZXJ2YWxfaW5fZGF5cycpO1xuICB9XG4gIHB1YmxpYyBzZXQga2V5UmVmcmVzaEludGVydmFsSW5EYXlzKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9rZXlSZWZyZXNoSW50ZXJ2YWxJbkRheXMgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQga2V5UmVmcmVzaEludGVydmFsSW5EYXlzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2tleVJlZnJlc2hJbnRlcnZhbEluRGF5cztcbiAgfVxuXG4gIC8vIHBhc3Njb2RlX2xlbmd0aCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9wYXNzY29kZUxlbmd0aD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgcGFzc2NvZGVMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdwYXNzY29kZV9sZW5ndGgnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhc3Njb2RlTGVuZ3RoKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wYXNzY29kZUxlbmd0aCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBwYXNzY29kZUxlbmd0aElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9wYXNzY29kZUxlbmd0aDtcbiAgfVxuXG4gIC8vIHNtc19vdHBfdmFsaWRpdHlfZHVyYXRpb25faW5fbWlucyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9zbXNPdHBWYWxpZGl0eUR1cmF0aW9uSW5NaW5zPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBzbXNPdHBWYWxpZGl0eUR1cmF0aW9uSW5NaW5zKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnc21zX290cF92YWxpZGl0eV9kdXJhdGlvbl9pbl9taW5zJyk7XG4gIH1cbiAgcHVibGljIHNldCBzbXNPdHBWYWxpZGl0eUR1cmF0aW9uSW5NaW5zKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zbXNPdHBWYWxpZGl0eUR1cmF0aW9uSW5NaW5zID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNtc090cFZhbGlkaXR5RHVyYXRpb25Jbk1pbnNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc21zT3RwVmFsaWRpdHlEdXJhdGlvbkluTWlucztcbiAgfVxuXG4gIC8vIHNtc19wYXNzY29kZV9sZW5ndGggLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfc21zUGFzc2NvZGVMZW5ndGg/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IHNtc1Bhc3Njb2RlTGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnc21zX3Bhc3Njb2RlX2xlbmd0aCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgc21zUGFzc2NvZGVMZW5ndGgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3Ntc1Bhc3Njb2RlTGVuZ3RoID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNtc1Bhc3Njb2RlTGVuZ3RoSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Ntc1Bhc3Njb2RlTGVuZ3RoO1xuICB9XG5cbiAgLy8gdGltZV9zdGVwX2luX3NlY3MgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfdGltZVN0ZXBJblNlY3M/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IHRpbWVTdGVwSW5TZWNzKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgndGltZV9zdGVwX2luX3NlY3MnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpbWVTdGVwSW5TZWNzKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl90aW1lU3RlcEluU2VjcyA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0aW1lU3RlcEluU2Vjc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lU3RlcEluU2VjcztcbiAgfVxuXG4gIC8vIHRpbWVfc3RlcF90b2xlcmFuY2UgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfdGltZVN0ZXBUb2xlcmFuY2U/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IHRpbWVTdGVwVG9sZXJhbmNlKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgndGltZV9zdGVwX3RvbGVyYW5jZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGltZVN0ZXBUb2xlcmFuY2UodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3RpbWVTdGVwVG9sZXJhbmNlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHRpbWVTdGVwVG9sZXJhbmNlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RpbWVTdGVwVG9sZXJhbmNlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb25maWRvQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5ncyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjYXR0ZXN0YXRpb24gSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI2F0dGVzdGF0aW9ufVxuICAqL1xuICByZWFkb25seSBhdHRlc3RhdGlvbjogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI2F1dGhlbnRpY2F0b3Jfc2VsZWN0aW9uX2F0dGFjaG1lbnQgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI2F1dGhlbnRpY2F0b3Jfc2VsZWN0aW9uX2F0dGFjaG1lbnR9XG4gICovXG4gIHJlYWRvbmx5IGF1dGhlbnRpY2F0b3JTZWxlY3Rpb25BdHRhY2htZW50OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjYXV0aGVudGljYXRvcl9zZWxlY3Rpb25fcmVxdWlyZV9yZXNpZGVudF9rZXkgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI2F1dGhlbnRpY2F0b3Jfc2VsZWN0aW9uX3JlcXVpcmVfcmVzaWRlbnRfa2V5fVxuICAqL1xuICByZWFkb25seSBhdXRoZW50aWNhdG9yU2VsZWN0aW9uUmVxdWlyZVJlc2lkZW50S2V5OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjYXV0aGVudGljYXRvcl9zZWxlY3Rpb25fcmVzaWRlbnRfa2V5IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNhdXRoZW50aWNhdG9yX3NlbGVjdGlvbl9yZXNpZGVudF9rZXl9XG4gICovXG4gIHJlYWRvbmx5IGF1dGhlbnRpY2F0b3JTZWxlY3Rpb25SZXNpZGVudEtleTogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI2F1dGhlbnRpY2F0b3Jfc2VsZWN0aW9uX3VzZXJfdmVyaWZpY2F0aW9uIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNhdXRoZW50aWNhdG9yX3NlbGVjdGlvbl91c2VyX3ZlcmlmaWNhdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgYXV0aGVudGljYXRvclNlbGVjdGlvblVzZXJWZXJpZmljYXRpb246IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNkb21haW5fdmFsaWRhdGlvbl9sZXZlbCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjZG9tYWluX3ZhbGlkYXRpb25fbGV2ZWx9XG4gICovXG4gIHJlYWRvbmx5IGRvbWFpblZhbGlkYXRpb25MZXZlbD86IG51bWJlcjtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNleGNsdWRlX2NyZWRlbnRpYWxzIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNleGNsdWRlX2NyZWRlbnRpYWxzfVxuICAqL1xuICByZWFkb25seSBleGNsdWRlQ3JlZGVudGlhbHM6IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNwdWJsaWNfa2V5X3R5cGVzIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNwdWJsaWNfa2V5X3R5cGVzfVxuICAqL1xuICByZWFkb25seSBwdWJsaWNLZXlUeXBlczogc3RyaW5nW107XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjdGltZW91dCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjdGltZW91dH1cbiAgKi9cbiAgcmVhZG9ubHkgdGltZW91dDogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbmZpZG9BdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzVG9UZXJyYWZvcm0oc3RydWN0PzogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbmZpZG9BdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzT3V0cHV0UmVmZXJlbmNlIHwgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbmZpZG9BdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGF0dGVzdGF0aW9uOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmF0dGVzdGF0aW9uKSxcbiAgICBhdXRoZW50aWNhdG9yX3NlbGVjdGlvbl9hdHRhY2htZW50OiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmF1dGhlbnRpY2F0b3JTZWxlY3Rpb25BdHRhY2htZW50KSxcbiAgICBhdXRoZW50aWNhdG9yX3NlbGVjdGlvbl9yZXF1aXJlX3Jlc2lkZW50X2tleTogY2RrdGYuYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuYXV0aGVudGljYXRvclNlbGVjdGlvblJlcXVpcmVSZXNpZGVudEtleSksXG4gICAgYXV0aGVudGljYXRvcl9zZWxlY3Rpb25fcmVzaWRlbnRfa2V5OiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmF1dGhlbnRpY2F0b3JTZWxlY3Rpb25SZXNpZGVudEtleSksXG4gICAgYXV0aGVudGljYXRvcl9zZWxlY3Rpb25fdXNlcl92ZXJpZmljYXRpb246IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuYXV0aGVudGljYXRvclNlbGVjdGlvblVzZXJWZXJpZmljYXRpb24pLFxuICAgIGRvbWFpbl92YWxpZGF0aW9uX2xldmVsOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLmRvbWFpblZhbGlkYXRpb25MZXZlbCksXG4gICAgZXhjbHVkZV9jcmVkZW50aWFsczogY2RrdGYuYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuZXhjbHVkZUNyZWRlbnRpYWxzKSxcbiAgICBwdWJsaWNfa2V5X3R5cGVzOiBjZGt0Zi5saXN0TWFwcGVyKGNka3RmLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5wdWJsaWNLZXlUeXBlcyksXG4gICAgdGltZW91dDogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS50aW1lb3V0KSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdVcm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9uZmlkb0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3NUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdVcm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9uZmlkb0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3NPdXRwdXRSZWZlcmVuY2UgfCBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdVcm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9uZmlkb0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3MpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGF0dGVzdGF0aW9uOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5hdHRlc3RhdGlvbiksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgYXV0aGVudGljYXRvcl9zZWxlY3Rpb25fYXR0YWNobWVudDoge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuYXV0aGVudGljYXRvclNlbGVjdGlvbkF0dGFjaG1lbnQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGF1dGhlbnRpY2F0b3Jfc2VsZWN0aW9uX3JlcXVpcmVfcmVzaWRlbnRfa2V5OiB7XG4gICAgICB2YWx1ZTogY2RrdGYuYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuYXV0aGVudGljYXRvclNlbGVjdGlvblJlcXVpcmVSZXNpZGVudEtleSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIGF1dGhlbnRpY2F0b3Jfc2VsZWN0aW9uX3Jlc2lkZW50X2tleToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuYXV0aGVudGljYXRvclNlbGVjdGlvblJlc2lkZW50S2V5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBhdXRoZW50aWNhdG9yX3NlbGVjdGlvbl91c2VyX3ZlcmlmaWNhdGlvbjoge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuYXV0aGVudGljYXRvclNlbGVjdGlvblVzZXJWZXJpZmljYXRpb24pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGRvbWFpbl92YWxpZGF0aW9uX2xldmVsOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5kb21haW5WYWxpZGF0aW9uTGV2ZWwpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIGV4Y2x1ZGVfY3JlZGVudGlhbHM6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5leGNsdWRlQ3JlZGVudGlhbHMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBwdWJsaWNfa2V5X3R5cGVzOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubGlzdE1hcHBlckhjbChjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEucHVibGljS2V5VHlwZXMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgdGltZW91dDoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEudGltZW91dCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdVcm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9uZmlkb0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3NPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb25maWRvQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5ncyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fYXR0ZXN0YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuYXR0ZXN0YXRpb24gPSB0aGlzLl9hdHRlc3RhdGlvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2F1dGhlbnRpY2F0b3JTZWxlY3Rpb25BdHRhY2htZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmF1dGhlbnRpY2F0b3JTZWxlY3Rpb25BdHRhY2htZW50ID0gdGhpcy5fYXV0aGVudGljYXRvclNlbGVjdGlvbkF0dGFjaG1lbnQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9hdXRoZW50aWNhdG9yU2VsZWN0aW9uUmVxdWlyZVJlc2lkZW50S2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmF1dGhlbnRpY2F0b3JTZWxlY3Rpb25SZXF1aXJlUmVzaWRlbnRLZXkgPSB0aGlzLl9hdXRoZW50aWNhdG9yU2VsZWN0aW9uUmVxdWlyZVJlc2lkZW50S2V5O1xuICAgIH1cbiAgICBpZiAodGhpcy5fYXV0aGVudGljYXRvclNlbGVjdGlvblJlc2lkZW50S2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmF1dGhlbnRpY2F0b3JTZWxlY3Rpb25SZXNpZGVudEtleSA9IHRoaXMuX2F1dGhlbnRpY2F0b3JTZWxlY3Rpb25SZXNpZGVudEtleTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2F1dGhlbnRpY2F0b3JTZWxlY3Rpb25Vc2VyVmVyaWZpY2F0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmF1dGhlbnRpY2F0b3JTZWxlY3Rpb25Vc2VyVmVyaWZpY2F0aW9uID0gdGhpcy5fYXV0aGVudGljYXRvclNlbGVjdGlvblVzZXJWZXJpZmljYXRpb247XG4gICAgfVxuICAgIGlmICh0aGlzLl9kb21haW5WYWxpZGF0aW9uTGV2ZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZG9tYWluVmFsaWRhdGlvbkxldmVsID0gdGhpcy5fZG9tYWluVmFsaWRhdGlvbkxldmVsO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZXhjbHVkZUNyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmV4Y2x1ZGVDcmVkZW50aWFscyA9IHRoaXMuX2V4Y2x1ZGVDcmVkZW50aWFscztcbiAgICB9XG4gICAgaWYgKHRoaXMuX3B1YmxpY0tleVR5cGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnB1YmxpY0tleVR5cGVzID0gdGhpcy5fcHVibGljS2V5VHlwZXM7XG4gICAgfVxuICAgIGlmICh0aGlzLl90aW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnRpbWVvdXQgPSB0aGlzLl90aW1lb3V0O1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbmZpZG9BdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fYXR0ZXN0YXRpb24gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9hdXRoZW50aWNhdG9yU2VsZWN0aW9uQXR0YWNobWVudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2F1dGhlbnRpY2F0b3JTZWxlY3Rpb25SZXF1aXJlUmVzaWRlbnRLZXkgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9hdXRoZW50aWNhdG9yU2VsZWN0aW9uUmVzaWRlbnRLZXkgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9hdXRoZW50aWNhdG9yU2VsZWN0aW9uVXNlclZlcmlmaWNhdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2RvbWFpblZhbGlkYXRpb25MZXZlbCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2V4Y2x1ZGVDcmVkZW50aWFscyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3B1YmxpY0tleVR5cGVzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fYXR0ZXN0YXRpb24gPSB2YWx1ZS5hdHRlc3RhdGlvbjtcbiAgICAgIHRoaXMuX2F1dGhlbnRpY2F0b3JTZWxlY3Rpb25BdHRhY2htZW50ID0gdmFsdWUuYXV0aGVudGljYXRvclNlbGVjdGlvbkF0dGFjaG1lbnQ7XG4gICAgICB0aGlzLl9hdXRoZW50aWNhdG9yU2VsZWN0aW9uUmVxdWlyZVJlc2lkZW50S2V5ID0gdmFsdWUuYXV0aGVudGljYXRvclNlbGVjdGlvblJlcXVpcmVSZXNpZGVudEtleTtcbiAgICAgIHRoaXMuX2F1dGhlbnRpY2F0b3JTZWxlY3Rpb25SZXNpZGVudEtleSA9IHZhbHVlLmF1dGhlbnRpY2F0b3JTZWxlY3Rpb25SZXNpZGVudEtleTtcbiAgICAgIHRoaXMuX2F1dGhlbnRpY2F0b3JTZWxlY3Rpb25Vc2VyVmVyaWZpY2F0aW9uID0gdmFsdWUuYXV0aGVudGljYXRvclNlbGVjdGlvblVzZXJWZXJpZmljYXRpb247XG4gICAgICB0aGlzLl9kb21haW5WYWxpZGF0aW9uTGV2ZWwgPSB2YWx1ZS5kb21haW5WYWxpZGF0aW9uTGV2ZWw7XG4gICAgICB0aGlzLl9leGNsdWRlQ3JlZGVudGlhbHMgPSB2YWx1ZS5leGNsdWRlQ3JlZGVudGlhbHM7XG4gICAgICB0aGlzLl9wdWJsaWNLZXlUeXBlcyA9IHZhbHVlLnB1YmxpY0tleVR5cGVzO1xuICAgICAgdGhpcy5fdGltZW91dCA9IHZhbHVlLnRpbWVvdXQ7XG4gICAgfVxuICB9XG5cbiAgLy8gYXR0ZXN0YXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfYXR0ZXN0YXRpb24/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGF0dGVzdGF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnYXR0ZXN0YXRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IGF0dGVzdGF0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9hdHRlc3RhdGlvbiA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhdHRlc3RhdGlvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hdHRlc3RhdGlvbjtcbiAgfVxuXG4gIC8vIGF1dGhlbnRpY2F0b3Jfc2VsZWN0aW9uX2F0dGFjaG1lbnQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfYXV0aGVudGljYXRvclNlbGVjdGlvbkF0dGFjaG1lbnQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGF1dGhlbnRpY2F0b3JTZWxlY3Rpb25BdHRhY2htZW50KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnYXV0aGVudGljYXRvcl9zZWxlY3Rpb25fYXR0YWNobWVudCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXV0aGVudGljYXRvclNlbGVjdGlvbkF0dGFjaG1lbnQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2F1dGhlbnRpY2F0b3JTZWxlY3Rpb25BdHRhY2htZW50ID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGF1dGhlbnRpY2F0b3JTZWxlY3Rpb25BdHRhY2htZW50SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0b3JTZWxlY3Rpb25BdHRhY2htZW50O1xuICB9XG5cbiAgLy8gYXV0aGVudGljYXRvcl9zZWxlY3Rpb25fcmVxdWlyZV9yZXNpZGVudF9rZXkgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfYXV0aGVudGljYXRvclNlbGVjdGlvblJlcXVpcmVSZXNpZGVudEtleT86IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgYXV0aGVudGljYXRvclNlbGVjdGlvblJlcXVpcmVSZXNpZGVudEtleSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdhdXRoZW50aWNhdG9yX3NlbGVjdGlvbl9yZXF1aXJlX3Jlc2lkZW50X2tleScpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXV0aGVudGljYXRvclNlbGVjdGlvblJlcXVpcmVSZXNpZGVudEtleSh2YWx1ZTogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fYXV0aGVudGljYXRvclNlbGVjdGlvblJlcXVpcmVSZXNpZGVudEtleSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhdXRoZW50aWNhdG9yU2VsZWN0aW9uUmVxdWlyZVJlc2lkZW50S2V5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0b3JTZWxlY3Rpb25SZXF1aXJlUmVzaWRlbnRLZXk7XG4gIH1cblxuICAvLyBhdXRoZW50aWNhdG9yX3NlbGVjdGlvbl9yZXNpZGVudF9rZXkgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfYXV0aGVudGljYXRvclNlbGVjdGlvblJlc2lkZW50S2V5Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBhdXRoZW50aWNhdG9yU2VsZWN0aW9uUmVzaWRlbnRLZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdhdXRoZW50aWNhdG9yX3NlbGVjdGlvbl9yZXNpZGVudF9rZXknKTtcbiAgfVxuICBwdWJsaWMgc2V0IGF1dGhlbnRpY2F0b3JTZWxlY3Rpb25SZXNpZGVudEtleSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYXV0aGVudGljYXRvclNlbGVjdGlvblJlc2lkZW50S2V5ID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGF1dGhlbnRpY2F0b3JTZWxlY3Rpb25SZXNpZGVudEtleUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hdXRoZW50aWNhdG9yU2VsZWN0aW9uUmVzaWRlbnRLZXk7XG4gIH1cblxuICAvLyBhdXRoZW50aWNhdG9yX3NlbGVjdGlvbl91c2VyX3ZlcmlmaWNhdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9hdXRoZW50aWNhdG9yU2VsZWN0aW9uVXNlclZlcmlmaWNhdGlvbj86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgYXV0aGVudGljYXRvclNlbGVjdGlvblVzZXJWZXJpZmljYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdhdXRoZW50aWNhdG9yX3NlbGVjdGlvbl91c2VyX3ZlcmlmaWNhdGlvbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXV0aGVudGljYXRvclNlbGVjdGlvblVzZXJWZXJpZmljYXRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2F1dGhlbnRpY2F0b3JTZWxlY3Rpb25Vc2VyVmVyaWZpY2F0aW9uID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGF1dGhlbnRpY2F0b3JTZWxlY3Rpb25Vc2VyVmVyaWZpY2F0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0b3JTZWxlY3Rpb25Vc2VyVmVyaWZpY2F0aW9uO1xuICB9XG5cbiAgLy8gZG9tYWluX3ZhbGlkYXRpb25fbGV2ZWwgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9kb21haW5WYWxpZGF0aW9uTGV2ZWw/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGRvbWFpblZhbGlkYXRpb25MZXZlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ2RvbWFpbl92YWxpZGF0aW9uX2xldmVsJyk7XG4gIH1cbiAgcHVibGljIHNldCBkb21haW5WYWxpZGF0aW9uTGV2ZWwodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2RvbWFpblZhbGlkYXRpb25MZXZlbCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldERvbWFpblZhbGlkYXRpb25MZXZlbCgpIHtcbiAgICB0aGlzLl9kb21haW5WYWxpZGF0aW9uTGV2ZWwgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGRvbWFpblZhbGlkYXRpb25MZXZlbElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kb21haW5WYWxpZGF0aW9uTGV2ZWw7XG4gIH1cblxuICAvLyBleGNsdWRlX2NyZWRlbnRpYWxzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2V4Y2x1ZGVDcmVkZW50aWFscz86IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgZXhjbHVkZUNyZWRlbnRpYWxzKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2V4Y2x1ZGVfY3JlZGVudGlhbHMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGV4Y2x1ZGVDcmVkZW50aWFscyh2YWx1ZTogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZXhjbHVkZUNyZWRlbnRpYWxzID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGV4Y2x1ZGVDcmVkZW50aWFsc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9leGNsdWRlQ3JlZGVudGlhbHM7XG4gIH1cblxuICAvLyBwdWJsaWNfa2V5X3R5cGVzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3B1YmxpY0tleVR5cGVzPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IHB1YmxpY0tleVR5cGVzKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ3B1YmxpY19rZXlfdHlwZXMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHB1YmxpY0tleVR5cGVzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX3B1YmxpY0tleVR5cGVzID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHB1YmxpY0tleVR5cGVzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3B1YmxpY0tleVR5cGVzO1xuICB9XG5cbiAgLy8gdGltZW91dCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF90aW1lb3V0PzogbnVtYmVyOyBcbiAgcHVibGljIGdldCB0aW1lb3V0KCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgndGltZW91dCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGltZW91dCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdGltZW91dCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0aW1lb3V0SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RpbWVvdXQ7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbnRoaXJkUGFydHlBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzRHVvU2VjdXJpdHlTZXR0aW5ncyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjYXBpX2hvc3RuYW1lIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNhcGlfaG9zdG5hbWV9XG4gICovXG4gIHJlYWRvbmx5IGFwaUhvc3RuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcjYXR0ZXN0YXRpb25fa2V5IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyNhdHRlc3RhdGlvbl9rZXl9XG4gICovXG4gIHJlYWRvbmx5IGF0dGVzdGF0aW9uS2V5Pzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI2ludGVncmF0aW9uX2tleSBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjaW50ZWdyYXRpb25fa2V5fVxuICAqL1xuICByZWFkb25seSBpbnRlZ3JhdGlvbktleTogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI3NlY3JldF9rZXkgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI3NlY3JldF9rZXl9XG4gICovXG4gIHJlYWRvbmx5IHNlY3JldEtleTogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI3VzZXJfbWFwcGluZ19hdHRyaWJ1dGUgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nI3VzZXJfbWFwcGluZ19hdHRyaWJ1dGV9XG4gICovXG4gIHJlYWRvbmx5IHVzZXJNYXBwaW5nQXR0cmlidXRlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdVcm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9udGhpcmRQYXJ0eUF1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3NEdW9TZWN1cml0eVNldHRpbmdzVG9UZXJyYWZvcm0oc3RydWN0PzogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbnRoaXJkUGFydHlBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzRHVvU2VjdXJpdHlTZXR0aW5nc091dHB1dFJlZmVyZW5jZSB8IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZFBhcnR5QXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nc0R1b1NlY3VyaXR5U2V0dGluZ3MpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgYXBpX2hvc3RuYW1lOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmFwaUhvc3RuYW1lKSxcbiAgICBhdHRlc3RhdGlvbl9rZXk6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuYXR0ZXN0YXRpb25LZXkpLFxuICAgIGludGVncmF0aW9uX2tleTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5pbnRlZ3JhdGlvbktleSksXG4gICAgc2VjcmV0X2tleTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5zZWNyZXRLZXkpLFxuICAgIHVzZXJfbWFwcGluZ19hdHRyaWJ1dGU6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEudXNlck1hcHBpbmdBdHRyaWJ1dGUpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZFBhcnR5QXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nc0R1b1NlY3VyaXR5U2V0dGluZ3NUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdVcm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9udGhpcmRQYXJ0eUF1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3NEdW9TZWN1cml0eVNldHRpbmdzT3V0cHV0UmVmZXJlbmNlIHwgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbnRoaXJkUGFydHlBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzRHVvU2VjdXJpdHlTZXR0aW5ncyk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgYXBpX2hvc3RuYW1lOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5hcGlIb3N0bmFtZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgYXR0ZXN0YXRpb25fa2V5OiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5hdHRlc3RhdGlvbktleSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgaW50ZWdyYXRpb25fa2V5OiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5pbnRlZ3JhdGlvbktleSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgc2VjcmV0X2tleToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuc2VjcmV0S2V5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB1c2VyX21hcHBpbmdfYXR0cmlidXRlOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS51c2VyTWFwcGluZ0F0dHJpYnV0ZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdVcm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9udGhpcmRQYXJ0eUF1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3NEdW9TZWN1cml0eVNldHRpbmdzT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdGYuQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdVcm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9udGhpcmRQYXJ0eUF1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3NEdW9TZWN1cml0eVNldHRpbmdzIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9hcGlIb3N0bmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5hcGlIb3N0bmFtZSA9IHRoaXMuX2FwaUhvc3RuYW1lO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYXR0ZXN0YXRpb25LZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuYXR0ZXN0YXRpb25LZXkgPSB0aGlzLl9hdHRlc3RhdGlvbktleTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ludGVncmF0aW9uS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmludGVncmF0aW9uS2V5ID0gdGhpcy5faW50ZWdyYXRpb25LZXk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zZWNyZXRLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuc2VjcmV0S2V5ID0gdGhpcy5fc2VjcmV0S2V5O1xuICAgIH1cbiAgICBpZiAodGhpcy5fdXNlck1hcHBpbmdBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudXNlck1hcHBpbmdBdHRyaWJ1dGUgPSB0aGlzLl91c2VyTWFwcGluZ0F0dHJpYnV0ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZFBhcnR5QXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nc0R1b1NlY3VyaXR5U2V0dGluZ3MgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9hcGlIb3N0bmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2F0dGVzdGF0aW9uS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5faW50ZWdyYXRpb25LZXkgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zZWNyZXRLZXkgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl91c2VyTWFwcGluZ0F0dHJpYnV0ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fYXBpSG9zdG5hbWUgPSB2YWx1ZS5hcGlIb3N0bmFtZTtcbiAgICAgIHRoaXMuX2F0dGVzdGF0aW9uS2V5ID0gdmFsdWUuYXR0ZXN0YXRpb25LZXk7XG4gICAgICB0aGlzLl9pbnRlZ3JhdGlvbktleSA9IHZhbHVlLmludGVncmF0aW9uS2V5O1xuICAgICAgdGhpcy5fc2VjcmV0S2V5ID0gdmFsdWUuc2VjcmV0S2V5O1xuICAgICAgdGhpcy5fdXNlck1hcHBpbmdBdHRyaWJ1dGUgPSB2YWx1ZS51c2VyTWFwcGluZ0F0dHJpYnV0ZTtcbiAgICB9XG4gIH1cblxuICAvLyBhcGlfaG9zdG5hbWUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfYXBpSG9zdG5hbWU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGFwaUhvc3RuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnYXBpX2hvc3RuYW1lJyk7XG4gIH1cbiAgcHVibGljIHNldCBhcGlIb3N0bmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYXBpSG9zdG5hbWUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYXBpSG9zdG5hbWVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXBpSG9zdG5hbWU7XG4gIH1cblxuICAvLyBhdHRlc3RhdGlvbl9rZXkgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hdHRlc3RhdGlvbktleT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgYXR0ZXN0YXRpb25LZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdhdHRlc3RhdGlvbl9rZXknKTtcbiAgfVxuICBwdWJsaWMgc2V0IGF0dGVzdGF0aW9uS2V5KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9hdHRlc3RhdGlvbktleSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEF0dGVzdGF0aW9uS2V5KCkge1xuICAgIHRoaXMuX2F0dGVzdGF0aW9uS2V5ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhdHRlc3RhdGlvbktleUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hdHRlc3RhdGlvbktleTtcbiAgfVxuXG4gIC8vIGludGVncmF0aW9uX2tleSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9pbnRlZ3JhdGlvbktleT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgaW50ZWdyYXRpb25LZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdpbnRlZ3JhdGlvbl9rZXknKTtcbiAgfVxuICBwdWJsaWMgc2V0IGludGVncmF0aW9uS2V5KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pbnRlZ3JhdGlvbktleSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpbnRlZ3JhdGlvbktleUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pbnRlZ3JhdGlvbktleTtcbiAgfVxuXG4gIC8vIHNlY3JldF9rZXkgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfc2VjcmV0S2V5Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBzZWNyZXRLZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdzZWNyZXRfa2V5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBzZWNyZXRLZXkodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3NlY3JldEtleSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzZWNyZXRLZXlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VjcmV0S2V5O1xuICB9XG5cbiAgLy8gdXNlcl9tYXBwaW5nX2F0dHJpYnV0ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF91c2VyTWFwcGluZ0F0dHJpYnV0ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdXNlck1hcHBpbmdBdHRyaWJ1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd1c2VyX21hcHBpbmdfYXR0cmlidXRlJyk7XG4gIH1cbiAgcHVibGljIHNldCB1c2VyTWFwcGluZ0F0dHJpYnV0ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdXNlck1hcHBpbmdBdHRyaWJ1dGUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdXNlck1hcHBpbmdBdHRyaWJ1dGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlck1hcHBpbmdBdHRyaWJ1dGU7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbnRoaXJkUGFydHlBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzIHtcbiAgLyoqXG4gICogZHVvX3NlY3VyaXR5X3NldHRpbmdzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nI2R1b19zZWN1cml0eV9zZXR0aW5ncyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcjZHVvX3NlY3VyaXR5X3NldHRpbmdzfVxuICAqL1xuICByZWFkb25seSBkdW9TZWN1cml0eVNldHRpbmdzPzogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbnRoaXJkUGFydHlBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzRHVvU2VjdXJpdHlTZXR0aW5ncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZFBhcnR5QXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nc1RvVGVycmFmb3JtKHN0cnVjdD86IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZFBhcnR5QXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nc091dHB1dFJlZmVyZW5jZSB8IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZFBhcnR5QXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5ncyk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBkdW9fc2VjdXJpdHlfc2V0dGluZ3M6IGlkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZFBhcnR5QXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nc0R1b1NlY3VyaXR5U2V0dGluZ3NUb1RlcnJhZm9ybShzdHJ1Y3QhLmR1b1NlY3VyaXR5U2V0dGluZ3MpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZFBhcnR5QXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZFBhcnR5QXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nc091dHB1dFJlZmVyZW5jZSB8IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZFBhcnR5QXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5ncyk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgZHVvX3NlY3VyaXR5X3NldHRpbmdzOiB7XG4gICAgICB2YWx1ZTogaWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbnRoaXJkUGFydHlBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzRHVvU2VjdXJpdHlTZXR0aW5nc1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuZHVvU2VjdXJpdHlTZXR0aW5ncyksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIklkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZFBhcnR5QXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nc0R1b1NlY3VyaXR5U2V0dGluZ3NMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZFBhcnR5QXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbnRoaXJkUGFydHlBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9kdW9TZWN1cml0eVNldHRpbmdzPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmR1b1NlY3VyaXR5U2V0dGluZ3MgPSB0aGlzLl9kdW9TZWN1cml0eVNldHRpbmdzPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbnRoaXJkUGFydHlBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fZHVvU2VjdXJpdHlTZXR0aW5ncy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9kdW9TZWN1cml0eVNldHRpbmdzLmludGVybmFsVmFsdWUgPSB2YWx1ZS5kdW9TZWN1cml0eVNldHRpbmdzO1xuICAgIH1cbiAgfVxuXG4gIC8vIGR1b19zZWN1cml0eV9zZXR0aW5ncyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9kdW9TZWN1cml0eVNldHRpbmdzID0gbmV3IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZFBhcnR5QXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nc0R1b1NlY3VyaXR5U2V0dGluZ3NPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJkdW9fc2VjdXJpdHlfc2V0dGluZ3NcIik7XG4gIHB1YmxpYyBnZXQgZHVvU2VjdXJpdHlTZXR0aW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy5fZHVvU2VjdXJpdHlTZXR0aW5ncztcbiAgfVxuICBwdWJsaWMgcHV0RHVvU2VjdXJpdHlTZXR0aW5ncyh2YWx1ZTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbnRoaXJkUGFydHlBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzRHVvU2VjdXJpdHlTZXR0aW5ncykge1xuICAgIHRoaXMuX2R1b1NlY3VyaXR5U2V0dGluZ3MuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldER1b1NlY3VyaXR5U2V0dGluZ3MoKSB7XG4gICAgdGhpcy5fZHVvU2VjdXJpdHlTZXR0aW5ncy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkdW9TZWN1cml0eVNldHRpbmdzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2R1b1NlY3VyaXR5U2V0dGluZ3MuaW50ZXJuYWxWYWx1ZTtcbiAgfVxufVxuXG4vKipcbiogUmVwcmVzZW50cyBhIHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyBvY2lfaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZ31cbiovXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nIGV4dGVuZHMgY2RrdGYuVGVycmFmb3JtUmVzb3VyY2Uge1xuXG4gIC8vID09PT09PT09PT09PT09PT09XG4gIC8vIFNUQVRJQyBQUk9QRVJUSUVTXG4gIC8vID09PT09PT09PT09PT09PT09XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGZSZXNvdXJjZVR5cGUgPSBcIm9jaV9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nXCI7XG5cbiAgLy8gPT09PT09PT09PT09PT1cbiAgLy8gU1RBVElDIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT1cbiAgLyoqXG4gICogR2VuZXJhdGVzIENES1RGIGNvZGUgZm9yIGltcG9ydGluZyBhIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyByZXNvdXJjZSB1cG9uIHJ1bm5pbmcgXCJjZGt0ZiBwbGFuIDxzdGFjay1uYW1lPlwiXG4gICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBjb25zdHJ1Y3RcbiAgKiBAcGFyYW0gaW1wb3J0VG9JZCBUaGUgY29uc3RydWN0IGlkIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCBjb25maWcgZm9yIHRoZSBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmcgdG8gaW1wb3J0XG4gICogQHBhcmFtIGltcG9ydEZyb21JZCBUaGUgaWQgb2YgdGhlIGV4aXN0aW5nIElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZyB0aGF0IHNob3VsZCBiZSBpbXBvcnRlZC4gUmVmZXIgdG8gdGhlIHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyNpbXBvcnQgaW1wb3J0IHNlY3Rpb259IGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoaXMgcmVzb3VyY2UgZm9yIHRoZSBpZCB0byB1c2VcbiAgKiBAcGFyYW0gcHJvdmlkZXI/IE9wdGlvbmFsIGluc3RhbmNlIG9mIHRoZSBwcm92aWRlciB3aGVyZSB0aGUgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nIHRvIGltcG9ydCBpcyBmb3VuZFxuICAqL1xuICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlQ29uZmlnRm9ySW1wb3J0KHNjb3BlOiBDb25zdHJ1Y3QsIGltcG9ydFRvSWQ6IHN0cmluZywgaW1wb3J0RnJvbUlkOiBzdHJpbmcsIHByb3ZpZGVyPzogY2RrdGYuVGVycmFmb3JtUHJvdmlkZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBjZGt0Zi5JbXBvcnRhYmxlUmVzb3VyY2Uoc2NvcGUsIGltcG9ydFRvSWQsIHsgdGVycmFmb3JtUmVzb3VyY2VUeXBlOiBcIm9jaV9pZGVudGl0eV9kb21haW5zX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nXCIsIGltcG9ydElkOiBpbXBvcnRGcm9tSWQsIHByb3ZpZGVyIH0pO1xuICAgICAgfVxuXG4gIC8vID09PT09PT09PT09XG4gIC8vIElOSVRJQUxJWkVSXG4gIC8vID09PT09PT09PT09XG5cbiAgLyoqXG4gICogQ3JlYXRlIGEgbmV3IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZyBvY2lfaWRlbnRpdHlfZG9tYWluc19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZ30gUmVzb3VyY2VcbiAgKlxuICAqIEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0XG4gICogQHBhcmFtIGlkIFRoZSBzY29wZWQgY29uc3RydWN0IElELiBNdXN0IGJlIHVuaXF1ZSBhbW9uZ3N0IHNpYmxpbmdzIGluIHRoZSBzYW1lIHNjb3BlXG4gICogQHBhcmFtIG9wdGlvbnMgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQ29uZmlnXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBjb25maWc6IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0NvbmZpZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgdGVycmFmb3JtUmVzb3VyY2VUeXBlOiAnb2NpX2lkZW50aXR5X2RvbWFpbnNfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmcnLFxuICAgICAgdGVycmFmb3JtR2VuZXJhdG9yTWV0YWRhdGE6IHtcbiAgICAgICAgcHJvdmlkZXJOYW1lOiAnb2NpJyxcbiAgICAgICAgcHJvdmlkZXJWZXJzaW9uOiAnNi4xOC4wJyxcbiAgICAgICAgcHJvdmlkZXJWZXJzaW9uQ29uc3RyYWludDogJ34+IDYuMTguMCdcbiAgICAgIH0sXG4gICAgICBwcm92aWRlcjogY29uZmlnLnByb3ZpZGVyLFxuICAgICAgZGVwZW5kc09uOiBjb25maWcuZGVwZW5kc09uLFxuICAgICAgY291bnQ6IGNvbmZpZy5jb3VudCxcbiAgICAgIGxpZmVjeWNsZTogY29uZmlnLmxpZmVjeWNsZSxcbiAgICAgIHByb3Zpc2lvbmVyczogY29uZmlnLnByb3Zpc2lvbmVycyxcbiAgICAgIGNvbm5lY3Rpb246IGNvbmZpZy5jb25uZWN0aW9uLFxuICAgICAgZm9yRWFjaDogY29uZmlnLmZvckVhY2hcbiAgICB9KTtcbiAgICB0aGlzLl9hdHRyaWJ1dGVTZXRzID0gY29uZmlnLmF0dHJpYnV0ZVNldHM7XG4gICAgdGhpcy5fYXR0cmlidXRlcyA9IGNvbmZpZy5hdHRyaWJ1dGVzO1xuICAgIHRoaXMuX2F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0lkID0gY29uZmlnLmF1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0lkO1xuICAgIHRoaXMuX2F1dGhvcml6YXRpb24gPSBjb25maWcuYXV0aG9yaXphdGlvbjtcbiAgICB0aGlzLl9hdXRvRW5yb2xsRW1haWxGYWN0b3JEaXNhYmxlZCA9IGNvbmZpZy5hdXRvRW5yb2xsRW1haWxGYWN0b3JEaXNhYmxlZDtcbiAgICB0aGlzLl9ieXBhc3NDb2RlRW5hYmxlZCA9IGNvbmZpZy5ieXBhc3NDb2RlRW5hYmxlZDtcbiAgICB0aGlzLl9lbWFpbEVuYWJsZWQgPSBjb25maWcuZW1haWxFbmFibGVkO1xuICAgIHRoaXMuX2ZpZG9BdXRoZW50aWNhdG9yRW5hYmxlZCA9IGNvbmZpZy5maWRvQXV0aGVudGljYXRvckVuYWJsZWQ7XG4gICAgdGhpcy5faGlkZUJhY2t1cEZhY3RvckVuYWJsZWQgPSBjb25maWcuaGlkZUJhY2t1cEZhY3RvckVuYWJsZWQ7XG4gICAgdGhpcy5faWRjc0VuZHBvaW50ID0gY29uZmlnLmlkY3NFbmRwb2ludDtcbiAgICB0aGlzLl9tZmFFbnJvbGxtZW50VHlwZSA9IGNvbmZpZy5tZmFFbnJvbGxtZW50VHlwZTtcbiAgICB0aGlzLl9vY2lkID0gY29uZmlnLm9jaWQ7XG4gICAgdGhpcy5fcGhvbmVDYWxsRW5hYmxlZCA9IGNvbmZpZy5waG9uZUNhbGxFbmFibGVkO1xuICAgIHRoaXMuX3B1c2hFbmFibGVkID0gY29uZmlnLnB1c2hFbmFibGVkO1xuICAgIHRoaXMuX3Jlc291cmNlVHlwZVNjaGVtYVZlcnNpb24gPSBjb25maWcucmVzb3VyY2VUeXBlU2NoZW1hVmVyc2lvbjtcbiAgICB0aGlzLl9zY2hlbWFzID0gY29uZmlnLnNjaGVtYXM7XG4gICAgdGhpcy5fc2VjdXJpdHlRdWVzdGlvbnNFbmFibGVkID0gY29uZmlnLnNlY3VyaXR5UXVlc3Rpb25zRW5hYmxlZDtcbiAgICB0aGlzLl9zbXNFbmFibGVkID0gY29uZmlnLnNtc0VuYWJsZWQ7XG4gICAgdGhpcy5fdG90cEVuYWJsZWQgPSBjb25maWcudG90cEVuYWJsZWQ7XG4gICAgdGhpcy5fdXNlckVucm9sbG1lbnREaXNhYmxlZEZhY3RvcnMgPSBjb25maWcudXNlckVucm9sbG1lbnREaXNhYmxlZEZhY3RvcnM7XG4gICAgdGhpcy5feXViaWNvT3RwRW5hYmxlZCA9IGNvbmZpZy55dWJpY29PdHBFbmFibGVkO1xuICAgIHRoaXMuX2J5cGFzc0NvZGVTZXR0aW5ncy5pbnRlcm5hbFZhbHVlID0gY29uZmlnLmJ5cGFzc0NvZGVTZXR0aW5ncztcbiAgICB0aGlzLl9jbGllbnRBcHBTZXR0aW5ncy5pbnRlcm5hbFZhbHVlID0gY29uZmlnLmNsaWVudEFwcFNldHRpbmdzO1xuICAgIHRoaXMuX2NvbXBsaWFuY2VQb2xpY3kuaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy5jb21wbGlhbmNlUG9saWN5O1xuICAgIHRoaXMuX2VtYWlsU2V0dGluZ3MuaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy5lbWFpbFNldHRpbmdzO1xuICAgIHRoaXMuX2VuZHBvaW50UmVzdHJpY3Rpb25zLmludGVybmFsVmFsdWUgPSBjb25maWcuZW5kcG9pbnRSZXN0cmljdGlvbnM7XG4gICAgdGhpcy5faWRlbnRpdHlTdG9yZVNldHRpbmdzLmludGVybmFsVmFsdWUgPSBjb25maWcuaWRlbnRpdHlTdG9yZVNldHRpbmdzO1xuICAgIHRoaXMuX25vdGlmaWNhdGlvblNldHRpbmdzLmludGVybmFsVmFsdWUgPSBjb25maWcubm90aWZpY2F0aW9uU2V0dGluZ3M7XG4gICAgdGhpcy5fdGFncy5pbnRlcm5hbFZhbHVlID0gY29uZmlnLnRhZ3M7XG4gICAgdGhpcy5fdGhpcmRQYXJ0eUZhY3Rvci5pbnRlcm5hbFZhbHVlID0gY29uZmlnLnRoaXJkUGFydHlGYWN0b3I7XG4gICAgdGhpcy5fdGltZW91dHMuaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy50aW1lb3V0cztcbiAgICB0aGlzLl90b3RwU2V0dGluZ3MuaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy50b3RwU2V0dGluZ3M7XG4gICAgdGhpcy5fdXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbmZpZG9BdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzLmludGVybmFsVmFsdWUgPSBjb25maWcudXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbmZpZG9BdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzO1xuICAgIHRoaXMuX3VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZFBhcnR5QXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5ncy5pbnRlcm5hbFZhbHVlID0gY29uZmlnLnVybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZFBhcnR5QXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5ncztcbiAgfVxuXG4gIC8vID09PT09PT09PT1cbiAgLy8gQVRUUklCVVRFU1xuICAvLyA9PT09PT09PT09XG5cbiAgLy8gYXR0cmlidXRlX3NldHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYXR0cmlidXRlU2V0cz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBhdHRyaWJ1dGVTZXRzKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2F0dHJpYnV0ZV9zZXRzJyk7XG4gIH1cbiAgcHVibGljIHNldCBhdHRyaWJ1dGVTZXRzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2F0dHJpYnV0ZVNldHMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRBdHRyaWJ1dGVTZXRzKCkge1xuICAgIHRoaXMuX2F0dHJpYnV0ZVNldHMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGF0dHJpYnV0ZVNldHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXR0cmlidXRlU2V0cztcbiAgfVxuXG4gIC8vIGF0dHJpYnV0ZXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYXR0cmlidXRlcz86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgYXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2F0dHJpYnV0ZXMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGF0dHJpYnV0ZXModmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2F0dHJpYnV0ZXMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRBdHRyaWJ1dGVzKCkge1xuICAgIHRoaXMuX2F0dHJpYnV0ZXMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGF0dHJpYnV0ZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXR0cmlidXRlcztcbiAgfVxuXG4gIC8vIGF1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nX2lkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0lkPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBhdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nX2lkJyk7XG4gIH1cbiAgcHVibGljIHNldCBhdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdJZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWQgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWQ7XG4gIH1cblxuICAvLyBhdXRob3JpemF0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2F1dGhvcml6YXRpb24/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGF1dGhvcml6YXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdhdXRob3JpemF0aW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCBhdXRob3JpemF0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9hdXRob3JpemF0aW9uID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0QXV0aG9yaXphdGlvbigpIHtcbiAgICB0aGlzLl9hdXRob3JpemF0aW9uID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhdXRob3JpemF0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F1dGhvcml6YXRpb247XG4gIH1cblxuICAvLyBhdXRvX2Vucm9sbF9lbWFpbF9mYWN0b3JfZGlzYWJsZWQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hdXRvRW5yb2xsRW1haWxGYWN0b3JEaXNhYmxlZD86IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgYXV0b0Vucm9sbEVtYWlsRmFjdG9yRGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnYXV0b19lbnJvbGxfZW1haWxfZmFjdG9yX2Rpc2FibGVkJyk7XG4gIH1cbiAgcHVibGljIHNldCBhdXRvRW5yb2xsRW1haWxGYWN0b3JEaXNhYmxlZCh2YWx1ZTogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fYXV0b0Vucm9sbEVtYWlsRmFjdG9yRGlzYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRBdXRvRW5yb2xsRW1haWxGYWN0b3JEaXNhYmxlZCgpIHtcbiAgICB0aGlzLl9hdXRvRW5yb2xsRW1haWxGYWN0b3JEaXNhYmxlZCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYXV0b0Vucm9sbEVtYWlsRmFjdG9yRGlzYWJsZWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0b0Vucm9sbEVtYWlsRmFjdG9yRGlzYWJsZWQ7XG4gIH1cblxuICAvLyBieXBhc3NfY29kZV9lbmFibGVkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2J5cGFzc0NvZGVFbmFibGVkPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBieXBhc3NDb2RlRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdieXBhc3NfY29kZV9lbmFibGVkJyk7XG4gIH1cbiAgcHVibGljIHNldCBieXBhc3NDb2RlRW5hYmxlZCh2YWx1ZTogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fYnlwYXNzQ29kZUVuYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYnlwYXNzQ29kZUVuYWJsZWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYnlwYXNzQ29kZUVuYWJsZWQ7XG4gIH1cblxuICAvLyBjb21wYXJ0bWVudF9vY2lkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgY29tcGFydG1lbnRPY2lkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnY29tcGFydG1lbnRfb2NpZCcpO1xuICB9XG5cbiAgLy8gZGVsZXRlX2luX3Byb2dyZXNzIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgZGVsZXRlSW5Qcm9ncmVzcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdkZWxldGVfaW5fcHJvZ3Jlc3MnKTtcbiAgfVxuXG4gIC8vIGRvbWFpbl9vY2lkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgZG9tYWluT2NpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2RvbWFpbl9vY2lkJyk7XG4gIH1cblxuICAvLyBlbWFpbF9lbmFibGVkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZW1haWxFbmFibGVkPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBlbWFpbEVuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnZW1haWxfZW5hYmxlZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgZW1haWxFbmFibGVkKHZhbHVlOiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9lbWFpbEVuYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRFbWFpbEVuYWJsZWQoKSB7XG4gICAgdGhpcy5fZW1haWxFbmFibGVkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBlbWFpbEVuYWJsZWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZW1haWxFbmFibGVkO1xuICB9XG5cbiAgLy8gZmlkb19hdXRoZW50aWNhdG9yX2VuYWJsZWQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9maWRvQXV0aGVudGljYXRvckVuYWJsZWQ/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGZpZG9BdXRoZW50aWNhdG9yRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdmaWRvX2F1dGhlbnRpY2F0b3JfZW5hYmxlZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgZmlkb0F1dGhlbnRpY2F0b3JFbmFibGVkKHZhbHVlOiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9maWRvQXV0aGVudGljYXRvckVuYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRGaWRvQXV0aGVudGljYXRvckVuYWJsZWQoKSB7XG4gICAgdGhpcy5fZmlkb0F1dGhlbnRpY2F0b3JFbmFibGVkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBmaWRvQXV0aGVudGljYXRvckVuYWJsZWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlkb0F1dGhlbnRpY2F0b3JFbmFibGVkO1xuICB9XG5cbiAgLy8gaGlkZV9iYWNrdXBfZmFjdG9yX2VuYWJsZWQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9oaWRlQmFja3VwRmFjdG9yRW5hYmxlZD86IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgaGlkZUJhY2t1cEZhY3RvckVuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnaGlkZV9iYWNrdXBfZmFjdG9yX2VuYWJsZWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhpZGVCYWNrdXBGYWN0b3JFbmFibGVkKHZhbHVlOiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9oaWRlQmFja3VwRmFjdG9yRW5hYmxlZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEhpZGVCYWNrdXBGYWN0b3JFbmFibGVkKCkge1xuICAgIHRoaXMuX2hpZGVCYWNrdXBGYWN0b3JFbmFibGVkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBoaWRlQmFja3VwRmFjdG9yRW5hYmxlZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9oaWRlQmFja3VwRmFjdG9yRW5hYmxlZDtcbiAgfVxuXG4gIC8vIGlkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdpZCcpO1xuICB9XG5cbiAgLy8gaWRjc19jcmVhdGVkX2J5IC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2lkY3NDcmVhdGVkQnkgPSBuZXcgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWRjc0NyZWF0ZWRCeUxpc3QodGhpcywgXCJpZGNzX2NyZWF0ZWRfYnlcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IGlkY3NDcmVhdGVkQnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lkY3NDcmVhdGVkQnk7XG4gIH1cblxuICAvLyBpZGNzX2VuZHBvaW50IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2lkY3NFbmRwb2ludD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgaWRjc0VuZHBvaW50KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnaWRjc19lbmRwb2ludCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgaWRjc0VuZHBvaW50KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pZGNzRW5kcG9pbnQgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaWRjc0VuZHBvaW50SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lkY3NFbmRwb2ludDtcbiAgfVxuXG4gIC8vIGlkY3NfbGFzdF9tb2RpZmllZF9ieSAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9pZGNzTGFzdE1vZGlmaWVkQnkgPSBuZXcgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWRjc0xhc3RNb2RpZmllZEJ5TGlzdCh0aGlzLCBcImlkY3NfbGFzdF9tb2RpZmllZF9ieVwiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgaWRjc0xhc3RNb2RpZmllZEJ5KCkge1xuICAgIHJldHVybiB0aGlzLl9pZGNzTGFzdE1vZGlmaWVkQnk7XG4gIH1cblxuICAvLyBpZGNzX2xhc3RfdXBncmFkZWRfaW5fcmVsZWFzZSAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IGlkY3NMYXN0VXBncmFkZWRJblJlbGVhc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdpZGNzX2xhc3RfdXBncmFkZWRfaW5fcmVsZWFzZScpO1xuICB9XG5cbiAgLy8gaWRjc19wcmV2ZW50ZWRfb3BlcmF0aW9ucyAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IGlkY3NQcmV2ZW50ZWRPcGVyYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2lkY3NfcHJldmVudGVkX29wZXJhdGlvbnMnKTtcbiAgfVxuXG4gIC8vIG1ldGEgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWV0YSA9IG5ldyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdNZXRhTGlzdCh0aGlzLCBcIm1ldGFcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IG1ldGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGE7XG4gIH1cblxuICAvLyBtZmFfZW5hYmxlZF9jYXRlZ29yeSAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IG1mYUVuYWJsZWRDYXRlZ29yeSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ21mYV9lbmFibGVkX2NhdGVnb3J5Jyk7XG4gIH1cblxuICAvLyBtZmFfZW5yb2xsbWVudF90eXBlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX21mYUVucm9sbG1lbnRUeXBlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBtZmFFbnJvbGxtZW50VHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ21mYV9lbnJvbGxtZW50X3R5cGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1mYUVucm9sbG1lbnRUeXBlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9tZmFFbnJvbGxtZW50VHlwZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtZmFFbnJvbGxtZW50VHlwZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tZmFFbnJvbGxtZW50VHlwZTtcbiAgfVxuXG4gIC8vIG9jaWQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9vY2lkPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBvY2lkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnb2NpZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgb2NpZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fb2NpZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE9jaWQoKSB7XG4gICAgdGhpcy5fb2NpZCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgb2NpZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9vY2lkO1xuICB9XG5cbiAgLy8gcGhvbmVfY2FsbF9lbmFibGVkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcGhvbmVDYWxsRW5hYmxlZD86IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgcGhvbmVDYWxsRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdwaG9uZV9jYWxsX2VuYWJsZWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBob25lQ2FsbEVuYWJsZWQodmFsdWU6IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX3Bob25lQ2FsbEVuYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRQaG9uZUNhbGxFbmFibGVkKCkge1xuICAgIHRoaXMuX3Bob25lQ2FsbEVuYWJsZWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHBob25lQ2FsbEVuYWJsZWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGhvbmVDYWxsRW5hYmxlZDtcbiAgfVxuXG4gIC8vIHB1c2hfZW5hYmxlZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9wdXNoRW5hYmxlZD86IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgcHVzaEVuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgncHVzaF9lbmFibGVkJyk7XG4gIH1cbiAgcHVibGljIHNldCBwdXNoRW5hYmxlZCh2YWx1ZTogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fcHVzaEVuYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcHVzaEVuYWJsZWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHVzaEVuYWJsZWQ7XG4gIH1cblxuICAvLyByZXNvdXJjZV90eXBlX3NjaGVtYV92ZXJzaW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3Jlc291cmNlVHlwZVNjaGVtYVZlcnNpb24/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHJlc291cmNlVHlwZVNjaGVtYVZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdyZXNvdXJjZV90eXBlX3NjaGVtYV92ZXJzaW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCByZXNvdXJjZVR5cGVTY2hlbWFWZXJzaW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9yZXNvdXJjZVR5cGVTY2hlbWFWZXJzaW9uID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0UmVzb3VyY2VUeXBlU2NoZW1hVmVyc2lvbigpIHtcbiAgICB0aGlzLl9yZXNvdXJjZVR5cGVTY2hlbWFWZXJzaW9uID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCByZXNvdXJjZVR5cGVTY2hlbWFWZXJzaW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlVHlwZVNjaGVtYVZlcnNpb247XG4gIH1cblxuICAvLyBzY2hlbWFzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3NjaGVtYXM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgc2NoZW1hcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdzY2hlbWFzJyk7XG4gIH1cbiAgcHVibGljIHNldCBzY2hlbWFzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX3NjaGVtYXMgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc2NoZW1hc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zY2hlbWFzO1xuICB9XG5cbiAgLy8gc2VjdXJpdHlfcXVlc3Rpb25zX2VuYWJsZWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfc2VjdXJpdHlRdWVzdGlvbnNFbmFibGVkPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBzZWN1cml0eVF1ZXN0aW9uc0VuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnc2VjdXJpdHlfcXVlc3Rpb25zX2VuYWJsZWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNlY3VyaXR5UXVlc3Rpb25zRW5hYmxlZCh2YWx1ZTogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fc2VjdXJpdHlRdWVzdGlvbnNFbmFibGVkID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNlY3VyaXR5UXVlc3Rpb25zRW5hYmxlZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zZWN1cml0eVF1ZXN0aW9uc0VuYWJsZWQ7XG4gIH1cblxuICAvLyBzbXNfZW5hYmxlZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9zbXNFbmFibGVkPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBzbXNFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ3Ntc19lbmFibGVkJyk7XG4gIH1cbiAgcHVibGljIHNldCBzbXNFbmFibGVkKHZhbHVlOiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9zbXNFbmFibGVkID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNtc0VuYWJsZWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc21zRW5hYmxlZDtcbiAgfVxuXG4gIC8vIHRlbmFuY3lfb2NpZCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IHRlbmFuY3lPY2lkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndGVuYW5jeV9vY2lkJyk7XG4gIH1cblxuICAvLyB0b3RwX2VuYWJsZWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfdG90cEVuYWJsZWQ/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IHRvdHBFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ3RvdHBfZW5hYmxlZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgdG90cEVuYWJsZWQodmFsdWU6IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX3RvdHBFbmFibGVkID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHRvdHBFbmFibGVkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RvdHBFbmFibGVkO1xuICB9XG5cbiAgLy8gdXNlcl9lbnJvbGxtZW50X2Rpc2FibGVkX2ZhY3RvcnMgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF91c2VyRW5yb2xsbWVudERpc2FibGVkRmFjdG9ycz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCB1c2VyRW5yb2xsbWVudERpc2FibGVkRmFjdG9ycygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCd1c2VyX2Vucm9sbG1lbnRfZGlzYWJsZWRfZmFjdG9ycycpO1xuICB9XG4gIHB1YmxpYyBzZXQgdXNlckVucm9sbG1lbnREaXNhYmxlZEZhY3RvcnModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fdXNlckVucm9sbG1lbnREaXNhYmxlZEZhY3RvcnMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRVc2VyRW5yb2xsbWVudERpc2FibGVkRmFjdG9ycygpIHtcbiAgICB0aGlzLl91c2VyRW5yb2xsbWVudERpc2FibGVkRmFjdG9ycyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdXNlckVucm9sbG1lbnREaXNhYmxlZEZhY3RvcnNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlckVucm9sbG1lbnREaXNhYmxlZEZhY3RvcnM7XG4gIH1cblxuICAvLyB5dWJpY29fb3RwX2VuYWJsZWQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF95dWJpY29PdHBFbmFibGVkPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCB5dWJpY29PdHBFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ3l1Ymljb19vdHBfZW5hYmxlZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgeXViaWNvT3RwRW5hYmxlZCh2YWx1ZTogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5feXViaWNvT3RwRW5hYmxlZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFl1Ymljb090cEVuYWJsZWQoKSB7XG4gICAgdGhpcy5feXViaWNvT3RwRW5hYmxlZCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgeXViaWNvT3RwRW5hYmxlZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl95dWJpY29PdHBFbmFibGVkO1xuICB9XG5cbiAgLy8gYnlwYXNzX2NvZGVfc2V0dGluZ3MgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfYnlwYXNzQ29kZVNldHRpbmdzID0gbmV3IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0J5cGFzc0NvZGVTZXR0aW5nc091dHB1dFJlZmVyZW5jZSh0aGlzLCBcImJ5cGFzc19jb2RlX3NldHRpbmdzXCIpO1xuICBwdWJsaWMgZ2V0IGJ5cGFzc0NvZGVTZXR0aW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy5fYnlwYXNzQ29kZVNldHRpbmdzO1xuICB9XG4gIHB1YmxpYyBwdXRCeXBhc3NDb2RlU2V0dGluZ3ModmFsdWU6IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0J5cGFzc0NvZGVTZXR0aW5ncykge1xuICAgIHRoaXMuX2J5cGFzc0NvZGVTZXR0aW5ncy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGJ5cGFzc0NvZGVTZXR0aW5nc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9ieXBhc3NDb2RlU2V0dGluZ3MuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIGNsaWVudF9hcHBfc2V0dGluZ3MgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfY2xpZW50QXBwU2V0dGluZ3MgPSBuZXcgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQ2xpZW50QXBwU2V0dGluZ3NPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJjbGllbnRfYXBwX3NldHRpbmdzXCIpO1xuICBwdWJsaWMgZ2V0IGNsaWVudEFwcFNldHRpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnRBcHBTZXR0aW5ncztcbiAgfVxuICBwdWJsaWMgcHV0Q2xpZW50QXBwU2V0dGluZ3ModmFsdWU6IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0NsaWVudEFwcFNldHRpbmdzKSB7XG4gICAgdGhpcy5fY2xpZW50QXBwU2V0dGluZ3MuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBjbGllbnRBcHBTZXR0aW5nc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnRBcHBTZXR0aW5ncy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gY29tcGxpYW5jZV9wb2xpY3kgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfY29tcGxpYW5jZVBvbGljeSA9IG5ldyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdDb21wbGlhbmNlUG9saWN5TGlzdCh0aGlzLCBcImNvbXBsaWFuY2VfcG9saWN5XCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCBjb21wbGlhbmNlUG9saWN5KCkge1xuICAgIHJldHVybiB0aGlzLl9jb21wbGlhbmNlUG9saWN5O1xuICB9XG4gIHB1YmxpYyBwdXRDb21wbGlhbmNlUG9saWN5KHZhbHVlOiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdDb21wbGlhbmNlUG9saWN5W10gfCBjZGt0Zi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2NvbXBsaWFuY2VQb2xpY3kuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBjb21wbGlhbmNlUG9saWN5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBsaWFuY2VQb2xpY3kuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIGVtYWlsX3NldHRpbmdzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2VtYWlsU2V0dGluZ3MgPSBuZXcgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nRW1haWxTZXR0aW5nc091dHB1dFJlZmVyZW5jZSh0aGlzLCBcImVtYWlsX3NldHRpbmdzXCIpO1xuICBwdWJsaWMgZ2V0IGVtYWlsU2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VtYWlsU2V0dGluZ3M7XG4gIH1cbiAgcHVibGljIHB1dEVtYWlsU2V0dGluZ3ModmFsdWU6IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0VtYWlsU2V0dGluZ3MpIHtcbiAgICB0aGlzLl9lbWFpbFNldHRpbmdzLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRFbWFpbFNldHRpbmdzKCkge1xuICAgIHRoaXMuX2VtYWlsU2V0dGluZ3MuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZW1haWxTZXR0aW5nc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9lbWFpbFNldHRpbmdzLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBlbmRwb2ludF9yZXN0cmljdGlvbnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfZW5kcG9pbnRSZXN0cmljdGlvbnMgPSBuZXcgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nRW5kcG9pbnRSZXN0cmljdGlvbnNPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJlbmRwb2ludF9yZXN0cmljdGlvbnNcIik7XG4gIHB1YmxpYyBnZXQgZW5kcG9pbnRSZXN0cmljdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VuZHBvaW50UmVzdHJpY3Rpb25zO1xuICB9XG4gIHB1YmxpYyBwdXRFbmRwb2ludFJlc3RyaWN0aW9ucyh2YWx1ZTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nRW5kcG9pbnRSZXN0cmljdGlvbnMpIHtcbiAgICB0aGlzLl9lbmRwb2ludFJlc3RyaWN0aW9ucy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGVuZHBvaW50UmVzdHJpY3Rpb25zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VuZHBvaW50UmVzdHJpY3Rpb25zLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBpZGVudGl0eV9zdG9yZV9zZXR0aW5ncyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9pZGVudGl0eVN0b3JlU2V0dGluZ3MgPSBuZXcgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWRlbnRpdHlTdG9yZVNldHRpbmdzT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwiaWRlbnRpdHlfc3RvcmVfc2V0dGluZ3NcIik7XG4gIHB1YmxpYyBnZXQgaWRlbnRpdHlTdG9yZVNldHRpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLl9pZGVudGl0eVN0b3JlU2V0dGluZ3M7XG4gIH1cbiAgcHVibGljIHB1dElkZW50aXR5U3RvcmVTZXR0aW5ncyh2YWx1ZTogSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWRlbnRpdHlTdG9yZVNldHRpbmdzKSB7XG4gICAgdGhpcy5faWRlbnRpdHlTdG9yZVNldHRpbmdzLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRJZGVudGl0eVN0b3JlU2V0dGluZ3MoKSB7XG4gICAgdGhpcy5faWRlbnRpdHlTdG9yZVNldHRpbmdzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGlkZW50aXR5U3RvcmVTZXR0aW5nc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pZGVudGl0eVN0b3JlU2V0dGluZ3MuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIG5vdGlmaWNhdGlvbl9zZXR0aW5ncyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9ub3RpZmljYXRpb25TZXR0aW5ncyA9IG5ldyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdOb3RpZmljYXRpb25TZXR0aW5nc091dHB1dFJlZmVyZW5jZSh0aGlzLCBcIm5vdGlmaWNhdGlvbl9zZXR0aW5nc1wiKTtcbiAgcHVibGljIGdldCBub3RpZmljYXRpb25TZXR0aW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy5fbm90aWZpY2F0aW9uU2V0dGluZ3M7XG4gIH1cbiAgcHVibGljIHB1dE5vdGlmaWNhdGlvblNldHRpbmdzKHZhbHVlOiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdOb3RpZmljYXRpb25TZXR0aW5ncykge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvblNldHRpbmdzLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbm90aWZpY2F0aW9uU2V0dGluZ3NJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbm90aWZpY2F0aW9uU2V0dGluZ3MuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIHRhZ3MgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGFncyA9IG5ldyBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUYWdzTGlzdCh0aGlzLCBcInRhZ3NcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IHRhZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhZ3M7XG4gIH1cbiAgcHVibGljIHB1dFRhZ3ModmFsdWU6IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1RhZ3NbXSB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fdGFncy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGFncygpIHtcbiAgICB0aGlzLl90YWdzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHRhZ3NJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGFncy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gdGhpcmRfcGFydHlfZmFjdG9yIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RoaXJkUGFydHlGYWN0b3IgPSBuZXcgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVGhpcmRQYXJ0eUZhY3Rvck91dHB1dFJlZmVyZW5jZSh0aGlzLCBcInRoaXJkX3BhcnR5X2ZhY3RvclwiKTtcbiAgcHVibGljIGdldCB0aGlyZFBhcnR5RmFjdG9yKCkge1xuICAgIHJldHVybiB0aGlzLl90aGlyZFBhcnR5RmFjdG9yO1xuICB9XG4gIHB1YmxpYyBwdXRUaGlyZFBhcnR5RmFjdG9yKHZhbHVlOiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUaGlyZFBhcnR5RmFjdG9yKSB7XG4gICAgdGhpcy5fdGhpcmRQYXJ0eUZhY3Rvci5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGhpcmRQYXJ0eUZhY3RvcigpIHtcbiAgICB0aGlzLl90aGlyZFBhcnR5RmFjdG9yLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHRoaXJkUGFydHlGYWN0b3JJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGhpcmRQYXJ0eUZhY3Rvci5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gdGltZW91dHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGltZW91dHMgPSBuZXcgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVGltZW91dHNPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJ0aW1lb3V0c1wiKTtcbiAgcHVibGljIGdldCB0aW1lb3V0cygpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZW91dHM7XG4gIH1cbiAgcHVibGljIHB1dFRpbWVvdXRzKHZhbHVlOiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUaW1lb3V0cykge1xuICAgIHRoaXMuX3RpbWVvdXRzLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaW1lb3V0cygpIHtcbiAgICB0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0aW1lb3V0c0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gdG90cF9zZXR0aW5ncyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF90b3RwU2V0dGluZ3MgPSBuZXcgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVG90cFNldHRpbmdzT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwidG90cF9zZXR0aW5nc1wiKTtcbiAgcHVibGljIGdldCB0b3RwU2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RvdHBTZXR0aW5ncztcbiAgfVxuICBwdWJsaWMgcHV0VG90cFNldHRpbmdzKHZhbHVlOiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUb3RwU2V0dGluZ3MpIHtcbiAgICB0aGlzLl90b3RwU2V0dGluZ3MuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0b3RwU2V0dGluZ3NJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdG90cFNldHRpbmdzLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyB1cm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9uZmlkb19hdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZ3MgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbmZpZG9BdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzID0gbmV3IElkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb25maWRvQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nc091dHB1dFJlZmVyZW5jZSh0aGlzLCBcInVybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb25maWRvX2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nc1wiKTtcbiAgcHVibGljIGdldCB1cm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9uZmlkb0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb25maWRvQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5ncztcbiAgfVxuICBwdWJsaWMgcHV0VXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbmZpZG9BdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzKHZhbHVlOiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdVcm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9uZmlkb0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3MpIHtcbiAgICB0aGlzLl91cm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9uZmlkb0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3MuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFVybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb25maWRvQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5ncygpIHtcbiAgICB0aGlzLl91cm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9uZmlkb0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3MuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbmZpZG9BdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb25maWRvQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5ncy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gdXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbnRoaXJkX3BhcnR5X2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5ncyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF91cm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9udGhpcmRQYXJ0eUF1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3MgPSBuZXcgSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbnRoaXJkUGFydHlBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwidXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbnRoaXJkX3BhcnR5X2F1dGhlbnRpY2F0aW9uX2ZhY3Rvcl9zZXR0aW5nc1wiKTtcbiAgcHVibGljIGdldCB1cm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9udGhpcmRQYXJ0eUF1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZFBhcnR5QXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5ncztcbiAgfVxuICBwdWJsaWMgcHV0VXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbnRoaXJkUGFydHlBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzKHZhbHVlOiBJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdVcm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9udGhpcmRQYXJ0eUF1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3MpIHtcbiAgICB0aGlzLl91cm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9udGhpcmRQYXJ0eUF1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3MuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFVybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZFBhcnR5QXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5ncygpIHtcbiAgICB0aGlzLl91cm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9udGhpcmRQYXJ0eUF1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3MuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbnRoaXJkUGFydHlBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZFBhcnR5QXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5ncy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gPT09PT09PT09XG4gIC8vIFNZTlRIRVNJU1xuICAvLyA9PT09PT09PT1cblxuICBwcm90ZWN0ZWQgc3ludGhlc2l6ZUF0dHJpYnV0ZXMoKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGVfc2V0czogY2RrdGYubGlzdE1hcHBlcihjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHRoaXMuX2F0dHJpYnV0ZVNldHMpLFxuICAgICAgYXR0cmlidXRlczogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fYXR0cmlidXRlcyksXG4gICAgICBhdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZ19pZDogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fYXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWQpLFxuICAgICAgYXV0aG9yaXphdGlvbjogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fYXV0aG9yaXphdGlvbiksXG4gICAgICBhdXRvX2Vucm9sbF9lbWFpbF9mYWN0b3JfZGlzYWJsZWQ6IGNka3RmLmJvb2xlYW5Ub1RlcnJhZm9ybSh0aGlzLl9hdXRvRW5yb2xsRW1haWxGYWN0b3JEaXNhYmxlZCksXG4gICAgICBieXBhc3NfY29kZV9lbmFibGVkOiBjZGt0Zi5ib29sZWFuVG9UZXJyYWZvcm0odGhpcy5fYnlwYXNzQ29kZUVuYWJsZWQpLFxuICAgICAgZW1haWxfZW5hYmxlZDogY2RrdGYuYm9vbGVhblRvVGVycmFmb3JtKHRoaXMuX2VtYWlsRW5hYmxlZCksXG4gICAgICBmaWRvX2F1dGhlbnRpY2F0b3JfZW5hYmxlZDogY2RrdGYuYm9vbGVhblRvVGVycmFmb3JtKHRoaXMuX2ZpZG9BdXRoZW50aWNhdG9yRW5hYmxlZCksXG4gICAgICBoaWRlX2JhY2t1cF9mYWN0b3JfZW5hYmxlZDogY2RrdGYuYm9vbGVhblRvVGVycmFmb3JtKHRoaXMuX2hpZGVCYWNrdXBGYWN0b3JFbmFibGVkKSxcbiAgICAgIGlkY3NfZW5kcG9pbnQ6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX2lkY3NFbmRwb2ludCksXG4gICAgICBtZmFfZW5yb2xsbWVudF90eXBlOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9tZmFFbnJvbGxtZW50VHlwZSksXG4gICAgICBvY2lkOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9vY2lkKSxcbiAgICAgIHBob25lX2NhbGxfZW5hYmxlZDogY2RrdGYuYm9vbGVhblRvVGVycmFmb3JtKHRoaXMuX3Bob25lQ2FsbEVuYWJsZWQpLFxuICAgICAgcHVzaF9lbmFibGVkOiBjZGt0Zi5ib29sZWFuVG9UZXJyYWZvcm0odGhpcy5fcHVzaEVuYWJsZWQpLFxuICAgICAgcmVzb3VyY2VfdHlwZV9zY2hlbWFfdmVyc2lvbjogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fcmVzb3VyY2VUeXBlU2NoZW1hVmVyc2lvbiksXG4gICAgICBzY2hlbWFzOiBjZGt0Zi5saXN0TWFwcGVyKGNka3RmLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkodGhpcy5fc2NoZW1hcyksXG4gICAgICBzZWN1cml0eV9xdWVzdGlvbnNfZW5hYmxlZDogY2RrdGYuYm9vbGVhblRvVGVycmFmb3JtKHRoaXMuX3NlY3VyaXR5UXVlc3Rpb25zRW5hYmxlZCksXG4gICAgICBzbXNfZW5hYmxlZDogY2RrdGYuYm9vbGVhblRvVGVycmFmb3JtKHRoaXMuX3Ntc0VuYWJsZWQpLFxuICAgICAgdG90cF9lbmFibGVkOiBjZGt0Zi5ib29sZWFuVG9UZXJyYWZvcm0odGhpcy5fdG90cEVuYWJsZWQpLFxuICAgICAgdXNlcl9lbnJvbGxtZW50X2Rpc2FibGVkX2ZhY3RvcnM6IGNka3RmLmxpc3RNYXBwZXIoY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKSh0aGlzLl91c2VyRW5yb2xsbWVudERpc2FibGVkRmFjdG9ycyksXG4gICAgICB5dWJpY29fb3RwX2VuYWJsZWQ6IGNka3RmLmJvb2xlYW5Ub1RlcnJhZm9ybSh0aGlzLl95dWJpY29PdHBFbmFibGVkKSxcbiAgICAgIGJ5cGFzc19jb2RlX3NldHRpbmdzOiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdCeXBhc3NDb2RlU2V0dGluZ3NUb1RlcnJhZm9ybSh0aGlzLl9ieXBhc3NDb2RlU2V0dGluZ3MuaW50ZXJuYWxWYWx1ZSksXG4gICAgICBjbGllbnRfYXBwX3NldHRpbmdzOiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdDbGllbnRBcHBTZXR0aW5nc1RvVGVycmFmb3JtKHRoaXMuX2NsaWVudEFwcFNldHRpbmdzLmludGVybmFsVmFsdWUpLFxuICAgICAgY29tcGxpYW5jZV9wb2xpY3k6IGNka3RmLmxpc3RNYXBwZXIoaWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQ29tcGxpYW5jZVBvbGljeVRvVGVycmFmb3JtLCB0cnVlKSh0aGlzLl9jb21wbGlhbmNlUG9saWN5LmludGVybmFsVmFsdWUpLFxuICAgICAgZW1haWxfc2V0dGluZ3M6IGlkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0VtYWlsU2V0dGluZ3NUb1RlcnJhZm9ybSh0aGlzLl9lbWFpbFNldHRpbmdzLmludGVybmFsVmFsdWUpLFxuICAgICAgZW5kcG9pbnRfcmVzdHJpY3Rpb25zOiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdFbmRwb2ludFJlc3RyaWN0aW9uc1RvVGVycmFmb3JtKHRoaXMuX2VuZHBvaW50UmVzdHJpY3Rpb25zLmludGVybmFsVmFsdWUpLFxuICAgICAgaWRlbnRpdHlfc3RvcmVfc2V0dGluZ3M6IGlkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0lkZW50aXR5U3RvcmVTZXR0aW5nc1RvVGVycmFmb3JtKHRoaXMuX2lkZW50aXR5U3RvcmVTZXR0aW5ncy5pbnRlcm5hbFZhbHVlKSxcbiAgICAgIG5vdGlmaWNhdGlvbl9zZXR0aW5nczogaWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nTm90aWZpY2F0aW9uU2V0dGluZ3NUb1RlcnJhZm9ybSh0aGlzLl9ub3RpZmljYXRpb25TZXR0aW5ncy5pbnRlcm5hbFZhbHVlKSxcbiAgICAgIHRhZ3M6IGNka3RmLmxpc3RNYXBwZXIoaWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVGFnc1RvVGVycmFmb3JtLCB0cnVlKSh0aGlzLl90YWdzLmludGVybmFsVmFsdWUpLFxuICAgICAgdGhpcmRfcGFydHlfZmFjdG9yOiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUaGlyZFBhcnR5RmFjdG9yVG9UZXJyYWZvcm0odGhpcy5fdGhpcmRQYXJ0eUZhY3Rvci5pbnRlcm5hbFZhbHVlKSxcbiAgICAgIHRpbWVvdXRzOiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUaW1lb3V0c1RvVGVycmFmb3JtKHRoaXMuX3RpbWVvdXRzLmludGVybmFsVmFsdWUpLFxuICAgICAgdG90cF9zZXR0aW5nczogaWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVG90cFNldHRpbmdzVG9UZXJyYWZvcm0odGhpcy5fdG90cFNldHRpbmdzLmludGVybmFsVmFsdWUpLFxuICAgICAgdXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbmZpZG9fYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmdzOiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdVcm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9uZmlkb0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3NUb1RlcnJhZm9ybSh0aGlzLl91cm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9uZmlkb0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3MuaW50ZXJuYWxWYWx1ZSksXG4gICAgICB1cm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9udGhpcmRfcGFydHlfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmdzOiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdVcm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9udGhpcmRQYXJ0eUF1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3NUb1RlcnJhZm9ybSh0aGlzLl91cm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9udGhpcmRQYXJ0eUF1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3MuaW50ZXJuYWxWYWx1ZSksXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzeW50aGVzaXplSGNsQXR0cmlidXRlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICBhdHRyaWJ1dGVfc2V0czoge1xuICAgICAgICB2YWx1ZTogY2RrdGYubGlzdE1hcHBlckhjbChjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHRoaXMuX2F0dHJpYnV0ZVNldHMpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX2F0dHJpYnV0ZXMpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBhdXRoZW50aWNhdGlvbl9mYWN0b3Jfc2V0dGluZ19pZDoge1xuICAgICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fYXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBhdXRob3JpemF0aW9uOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9hdXRob3JpemF0aW9uKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgYXV0b19lbnJvbGxfZW1haWxfZmFjdG9yX2Rpc2FibGVkOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5ib29sZWFuVG9IY2xUZXJyYWZvcm0odGhpcy5fYXV0b0Vucm9sbEVtYWlsRmFjdG9yRGlzYWJsZWQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgICB9LFxuICAgICAgYnlwYXNzX2NvZGVfZW5hYmxlZDoge1xuICAgICAgICB2YWx1ZTogY2RrdGYuYm9vbGVhblRvSGNsVGVycmFmb3JtKHRoaXMuX2J5cGFzc0NvZGVFbmFibGVkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgfSxcbiAgICAgIGVtYWlsX2VuYWJsZWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybSh0aGlzLl9lbWFpbEVuYWJsZWQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgICB9LFxuICAgICAgZmlkb19hdXRoZW50aWNhdG9yX2VuYWJsZWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybSh0aGlzLl9maWRvQXV0aGVudGljYXRvckVuYWJsZWQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgICB9LFxuICAgICAgaGlkZV9iYWNrdXBfZmFjdG9yX2VuYWJsZWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybSh0aGlzLl9oaWRlQmFja3VwRmFjdG9yRW5hYmxlZCksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICAgIH0sXG4gICAgICBpZGNzX2VuZHBvaW50OiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9pZGNzRW5kcG9pbnQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBtZmFfZW5yb2xsbWVudF90eXBlOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9tZmFFbnJvbGxtZW50VHlwZSksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIG9jaWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX29jaWQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBwaG9uZV9jYWxsX2VuYWJsZWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybSh0aGlzLl9waG9uZUNhbGxFbmFibGVkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgfSxcbiAgICAgIHB1c2hfZW5hYmxlZDoge1xuICAgICAgICB2YWx1ZTogY2RrdGYuYm9vbGVhblRvSGNsVGVycmFmb3JtKHRoaXMuX3B1c2hFbmFibGVkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgfSxcbiAgICAgIHJlc291cmNlX3R5cGVfc2NoZW1hX3ZlcnNpb246IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX3Jlc291cmNlVHlwZVNjaGVtYVZlcnNpb24pLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBzY2hlbWFzOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5saXN0TWFwcGVySGNsKGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkodGhpcy5fc2NoZW1hcyksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgICB9LFxuICAgICAgc2VjdXJpdHlfcXVlc3Rpb25zX2VuYWJsZWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybSh0aGlzLl9zZWN1cml0eVF1ZXN0aW9uc0VuYWJsZWQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgICB9LFxuICAgICAgc21zX2VuYWJsZWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybSh0aGlzLl9zbXNFbmFibGVkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgfSxcbiAgICAgIHRvdHBfZW5hYmxlZDoge1xuICAgICAgICB2YWx1ZTogY2RrdGYuYm9vbGVhblRvSGNsVGVycmFmb3JtKHRoaXMuX3RvdHBFbmFibGVkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgfSxcbiAgICAgIHVzZXJfZW5yb2xsbWVudF9kaXNhYmxlZF9mYWN0b3JzOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5saXN0TWFwcGVySGNsKGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkodGhpcy5fdXNlckVucm9sbG1lbnREaXNhYmxlZEZhY3RvcnMpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIHl1Ymljb19vdHBfZW5hYmxlZDoge1xuICAgICAgICB2YWx1ZTogY2RrdGYuYm9vbGVhblRvSGNsVGVycmFmb3JtKHRoaXMuX3l1Ymljb090cEVuYWJsZWQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgICB9LFxuICAgICAgYnlwYXNzX2NvZGVfc2V0dGluZ3M6IHtcbiAgICAgICAgdmFsdWU6IGlkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0J5cGFzc0NvZGVTZXR0aW5nc1RvSGNsVGVycmFmb3JtKHRoaXMuX2J5cGFzc0NvZGVTZXR0aW5ncy5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQnlwYXNzQ29kZVNldHRpbmdzTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIGNsaWVudF9hcHBfc2V0dGluZ3M6IHtcbiAgICAgICAgdmFsdWU6IGlkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0NsaWVudEFwcFNldHRpbmdzVG9IY2xUZXJyYWZvcm0odGhpcy5fY2xpZW50QXBwU2V0dGluZ3MuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIklkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0NsaWVudEFwcFNldHRpbmdzTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIGNvbXBsaWFuY2VfcG9saWN5OiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5saXN0TWFwcGVySGNsKGlkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0NvbXBsaWFuY2VQb2xpY3lUb0hjbFRlcnJhZm9ybSwgdHJ1ZSkodGhpcy5fY29tcGxpYW5jZVBvbGljeS5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nQ29tcGxpYW5jZVBvbGljeUxpc3RcIixcbiAgICAgIH0sXG4gICAgICBlbWFpbF9zZXR0aW5nczoge1xuICAgICAgICB2YWx1ZTogaWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nRW1haWxTZXR0aW5nc1RvSGNsVGVycmFmb3JtKHRoaXMuX2VtYWlsU2V0dGluZ3MuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIklkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ0VtYWlsU2V0dGluZ3NMaXN0XCIsXG4gICAgICB9LFxuICAgICAgZW5kcG9pbnRfcmVzdHJpY3Rpb25zOiB7XG4gICAgICAgIHZhbHVlOiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdFbmRwb2ludFJlc3RyaWN0aW9uc1RvSGNsVGVycmFmb3JtKHRoaXMuX2VuZHBvaW50UmVzdHJpY3Rpb25zLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdFbmRwb2ludFJlc3RyaWN0aW9uc0xpc3RcIixcbiAgICAgIH0sXG4gICAgICBpZGVudGl0eV9zdG9yZV9zZXR0aW5nczoge1xuICAgICAgICB2YWx1ZTogaWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nSWRlbnRpdHlTdG9yZVNldHRpbmdzVG9IY2xUZXJyYWZvcm0odGhpcy5faWRlbnRpdHlTdG9yZVNldHRpbmdzLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdJZGVudGl0eVN0b3JlU2V0dGluZ3NMaXN0XCIsXG4gICAgICB9LFxuICAgICAgbm90aWZpY2F0aW9uX3NldHRpbmdzOiB7XG4gICAgICAgIHZhbHVlOiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdOb3RpZmljYXRpb25TZXR0aW5nc1RvSGNsVGVycmFmb3JtKHRoaXMuX25vdGlmaWNhdGlvblNldHRpbmdzLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdOb3RpZmljYXRpb25TZXR0aW5nc0xpc3RcIixcbiAgICAgIH0sXG4gICAgICB0YWdzOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5saXN0TWFwcGVySGNsKGlkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1RhZ3NUb0hjbFRlcnJhZm9ybSwgdHJ1ZSkodGhpcy5fdGFncy5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiSWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVGFnc0xpc3RcIixcbiAgICAgIH0sXG4gICAgICB0aGlyZF9wYXJ0eV9mYWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGlkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1RoaXJkUGFydHlGYWN0b3JUb0hjbFRlcnJhZm9ybSh0aGlzLl90aGlyZFBhcnR5RmFjdG9yLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUaGlyZFBhcnR5RmFjdG9yTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIHRpbWVvdXRzOiB7XG4gICAgICAgIHZhbHVlOiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUaW1lb3V0c1RvSGNsVGVycmFmb3JtKHRoaXMuX3RpbWVvdXRzLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcInN0cnVjdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIklkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1RpbWVvdXRzXCIsXG4gICAgICB9LFxuICAgICAgdG90cF9zZXR0aW5nczoge1xuICAgICAgICB2YWx1ZTogaWRlbnRpdHlEb21haW5zQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nVG90cFNldHRpbmdzVG9IY2xUZXJyYWZvcm0odGhpcy5fdG90cFNldHRpbmdzLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJJZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdUb3RwU2V0dGluZ3NMaXN0XCIsXG4gICAgICB9LFxuICAgICAgdXJuaWV0ZnBhcmFtc3NjaW1zY2hlbWFzb3JhY2xlaWRjc2V4dGVuc2lvbmZpZG9fYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmdzOiB7XG4gICAgICAgIHZhbHVlOiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdVcm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9uZmlkb0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3NUb0hjbFRlcnJhZm9ybSh0aGlzLl91cm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9uZmlkb0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3MuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIklkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb25maWRvQXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nc0xpc3RcIixcbiAgICAgIH0sXG4gICAgICB1cm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9udGhpcmRfcGFydHlfYXV0aGVudGljYXRpb25fZmFjdG9yX3NldHRpbmdzOiB7XG4gICAgICAgIHZhbHVlOiBpZGVudGl0eURvbWFpbnNBdXRoZW50aWNhdGlvbkZhY3RvclNldHRpbmdVcm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9udGhpcmRQYXJ0eUF1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3NUb0hjbFRlcnJhZm9ybSh0aGlzLl91cm5pZXRmcGFyYW1zc2NpbXNjaGVtYXNvcmFjbGVpZGNzZXh0ZW5zaW9udGhpcmRQYXJ0eUF1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ3MuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIklkZW50aXR5RG9tYWluc0F1dGhlbnRpY2F0aW9uRmFjdG9yU2V0dGluZ1VybmlldGZwYXJhbXNzY2ltc2NoZW1hc29yYWNsZWlkY3NleHRlbnNpb250aGlyZFBhcnR5QXV0aGVudGljYXRpb25GYWN0b3JTZXR0aW5nc0xpc3RcIixcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkICkpXG4gIH1cbn1cbiJdfQ==