{"version":3,"sources":["src/material/material-slider-testing.umd.js"],"names":["global","factory","exports","module","require","define","amd","self","ng","material","slider","testing","cdk","coercion","this","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","adopt","then","apply","__generator","body","f","y","t","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","n","v","op","TypeError","pop","length","push","__read","o","m","r","i","ar","error","__spread","arguments","concat","MatSliderHarness","_super","_this","_textLabel","locatorFor","_wrapper","__extends","String","__","constructor","create","with","options","HarnessPredicate","getId","id","_a","host","getAttribute","getDisplayValue","textLabel","_b","parallel","hasClass","text","getPercentage","_calculatePercentage","getValue","coerceNumberProperty","getMaxValue","getMinValue","isDisabled","disabled","coerceBooleanProperty","getOrientation","setValue","sliderEl","wrapperEl","orientation","percentage","height","width","isVertical","relativeX","relativeY","_c","getDimensions","Math","round","click","focus","blur","isFocused","min","ComponentHarness","hostSelector","defineProperty"],"mappings":"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","sourcesContent":["(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/cdk/testing'), require('@angular/cdk/coercion')) :\n    typeof define === 'function' && define.amd ? define('@angular/material/slider/testing', ['exports', '@angular/cdk/testing', '@angular/cdk/coercion'], factory) :\n    (global = global || self, factory((global.ng = global.ng || {}, global.ng.material = global.ng.material || {}, global.ng.material.slider = global.ng.material.slider || {}, global.ng.material.slider.testing = {}), global.ng.cdk.testing, global.ng.cdk.coercion));\n}(this, (function (exports, testing, coercion) { 'use strict';\n\n    /*! *****************************************************************************\n    Copyright (c) Microsoft Corporation.\n\n    Permission to use, copy, modify, and/or distribute this software for any\n    purpose with or without fee is hereby granted.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n    PERFORMANCE OF THIS SOFTWARE.\n    ***************************************************************************** */\n    /* global Reflect, Promise */\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b)\n                if (Object.prototype.hasOwnProperty.call(b, p))\n                    d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    function __extends(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n            throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    }\n    var __assign = function () {\n        __assign = Object.assign || function __assign(t) {\n            for (var s, i = 1, n = arguments.length; i < n; i++) {\n                s = arguments[i];\n                for (var p in s)\n                    if (Object.prototype.hasOwnProperty.call(s, p))\n                        t[p] = s[p];\n            }\n            return t;\n        };\n        return __assign.apply(this, arguments);\n    };\n    function __rest(s, e) {\n        var t = {};\n        for (var p in s)\n            if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n                t[p] = s[p];\n        if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n            for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n                if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n                    t[p[i]] = s[p[i]];\n            }\n        return t;\n    }\n    function __decorate(decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\")\n            r = Reflect.decorate(decorators, target, key, desc);\n        else\n            for (var i = decorators.length - 1; i >= 0; i--)\n                if (d = decorators[i])\n                    r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    }\n    function __param(paramIndex, decorator) {\n        return function (target, key) { decorator(target, key, paramIndex); };\n    }\n    function __metadata(metadataKey, metadataValue) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\")\n            return Reflect.metadata(metadataKey, metadataValue);\n    }\n    function __awaiter(thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try {\n                step(generator.next(value));\n            }\n            catch (e) {\n                reject(e);\n            } }\n            function rejected(value) { try {\n                step(generator[\"throw\"](value));\n            }\n            catch (e) {\n                reject(e);\n            } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    }\n    function __generator(thisArg, body) {\n        var _ = { label: 0, sent: function () { if (t[0] & 1)\n                throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n        return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function () { return this; }), g;\n        function verb(n) { return function (v) { return step([n, v]); }; }\n        function step(op) {\n            if (f)\n                throw new TypeError(\"Generator is already executing.\");\n            while (_)\n                try {\n                    if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)\n                        return t;\n                    if (y = 0, t)\n                        op = [op[0] & 2, t.value];\n                    switch (op[0]) {\n                        case 0:\n                        case 1:\n                            t = op;\n                            break;\n                        case 4:\n                            _.label++;\n                            return { value: op[1], done: false };\n                        case 5:\n                            _.label++;\n                            y = op[1];\n                            op = [0];\n                            continue;\n                        case 7:\n                            op = _.ops.pop();\n                            _.trys.pop();\n                            continue;\n                        default:\n                            if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                                _ = 0;\n                                continue;\n                            }\n                            if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {\n                                _.label = op[1];\n                                break;\n                            }\n                            if (op[0] === 6 && _.label < t[1]) {\n                                _.label = t[1];\n                                t = op;\n                                break;\n                            }\n                            if (t && _.label < t[2]) {\n                                _.label = t[2];\n                                _.ops.push(op);\n                                break;\n                            }\n                            if (t[2])\n                                _.ops.pop();\n                            _.trys.pop();\n                            continue;\n                    }\n                    op = body.call(thisArg, _);\n                }\n                catch (e) {\n                    op = [6, e];\n                    y = 0;\n                }\n                finally {\n                    f = t = 0;\n                }\n            if (op[0] & 5)\n                throw op[1];\n            return { value: op[0] ? op[1] : void 0, done: true };\n        }\n    }\n    var __createBinding = Object.create ? (function (o, m, k, k2) {\n        if (k2 === undefined)\n            k2 = k;\n        Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } });\n    }) : (function (o, m, k, k2) {\n        if (k2 === undefined)\n            k2 = k;\n        o[k2] = m[k];\n    });\n    function __exportStar(m, o) {\n        for (var p in m)\n            if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p))\n                __createBinding(o, m, p);\n    }\n    function __values(o) {\n        var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n        if (m)\n            return m.call(o);\n        if (o && typeof o.length === \"number\")\n            return {\n                next: function () {\n                    if (o && i >= o.length)\n                        o = void 0;\n                    return { value: o && o[i++], done: !o };\n                }\n            };\n        throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n    }\n    function __read(o, n) {\n        var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n        if (!m)\n            return o;\n        var i = m.call(o), r, ar = [], e;\n        try {\n            while ((n === void 0 || n-- > 0) && !(r = i.next()).done)\n                ar.push(r.value);\n        }\n        catch (error) {\n            e = { error: error };\n        }\n        finally {\n            try {\n                if (r && !r.done && (m = i[\"return\"]))\n                    m.call(i);\n            }\n            finally {\n                if (e)\n                    throw e.error;\n            }\n        }\n        return ar;\n    }\n    /** @deprecated */\n    function __spread() {\n        for (var ar = [], i = 0; i < arguments.length; i++)\n            ar = ar.concat(__read(arguments[i]));\n        return ar;\n    }\n    /** @deprecated */\n    function __spreadArrays() {\n        for (var s = 0, i = 0, il = arguments.length; i < il; i++)\n            s += arguments[i].length;\n        for (var r = Array(s), k = 0, i = 0; i < il; i++)\n            for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n                r[k] = a[j];\n        return r;\n    }\n    function __spreadArray(to, from) {\n        for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\n            to[j] = from[i];\n        return to;\n    }\n    function __await(v) {\n        return this instanceof __await ? (this.v = v, this) : new __await(v);\n    }\n    function __asyncGenerator(thisArg, _arguments, generator) {\n        if (!Symbol.asyncIterator)\n            throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n        var g = generator.apply(thisArg, _arguments || []), i, q = [];\n        return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\n        function verb(n) { if (g[n])\n            i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n        function resume(n, v) { try {\n            step(g[n](v));\n        }\n        catch (e) {\n            settle(q[0][3], e);\n        } }\n        function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n        function fulfill(value) { resume(\"next\", value); }\n        function reject(value) { resume(\"throw\", value); }\n        function settle(f, v) { if (f(v), q.shift(), q.length)\n            resume(q[0][0], q[0][1]); }\n    }\n    function __asyncDelegator(o) {\n        var i, p;\n        return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n        function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\n    }\n    function __asyncValues(o) {\n        if (!Symbol.asyncIterator)\n            throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n        var m = o[Symbol.asyncIterator], i;\n        return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n        function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n        function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); }\n    }\n    function __makeTemplateObject(cooked, raw) {\n        if (Object.defineProperty) {\n            Object.defineProperty(cooked, \"raw\", { value: raw });\n        }\n        else {\n            cooked.raw = raw;\n        }\n        return cooked;\n    }\n    ;\n    var __setModuleDefault = Object.create ? (function (o, v) {\n        Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    }) : function (o, v) {\n        o[\"default\"] = v;\n    };\n    function __importStar(mod) {\n        if (mod && mod.__esModule)\n            return mod;\n        var result = {};\n        if (mod != null)\n            for (var k in mod)\n                if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k))\n                    __createBinding(result, mod, k);\n        __setModuleDefault(result, mod);\n        return result;\n    }\n    function __importDefault(mod) {\n        return (mod && mod.__esModule) ? mod : { default: mod };\n    }\n    function __classPrivateFieldGet(receiver, privateMap) {\n        if (!privateMap.has(receiver)) {\n            throw new TypeError(\"attempted to get private field on non-instance\");\n        }\n        return privateMap.get(receiver);\n    }\n    function __classPrivateFieldSet(receiver, privateMap, value) {\n        if (!privateMap.has(receiver)) {\n            throw new TypeError(\"attempted to set private field on non-instance\");\n        }\n        privateMap.set(receiver, value);\n        return value;\n    }\n\n    /** Harness for interacting with a standard mat-slider in tests. */\n    var MatSliderHarness = /** @class */ (function (_super) {\n        __extends(MatSliderHarness, _super);\n        function MatSliderHarness() {\n            var _this = _super.apply(this, __spread(arguments)) || this;\n            _this._textLabel = _this.locatorFor('.mat-slider-thumb-label-text');\n            _this._wrapper = _this.locatorFor('.mat-slider-wrapper');\n            return _this;\n        }\n        /**\n         * Gets a `HarnessPredicate` that can be used to search for a `MatSliderHarness` that meets\n         * certain criteria.\n         * @param options Options for filtering which slider instances are considered a match.\n         * @return a `HarnessPredicate` configured with the given options.\n         */\n        MatSliderHarness.with = function (options) {\n            if (options === void 0) { options = {}; }\n            return new testing.HarnessPredicate(MatSliderHarness, options);\n        };\n        /** Gets the slider's id. */\n        MatSliderHarness.prototype.getId = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var id;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [4 /*yield*/, (_a.sent()).getAttribute('id')];\n                        case 2:\n                            id = _a.sent();\n                            // In case no id has been specified, the \"id\" property always returns\n                            // an empty string. To make this method more explicit, we return null.\n                            return [2 /*return*/, id !== '' ? id : null];\n                    }\n                });\n            });\n        };\n        /**\n         * Gets the current display value of the slider. Returns a null promise if the thumb label is\n         * disabled.\n         */\n        MatSliderHarness.prototype.getDisplayValue = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var _a, host, textLabel;\n                var _this = this;\n                return __generator(this, function (_b) {\n                    switch (_b.label) {\n                        case 0: return [4 /*yield*/, testing.parallel(function () { return [_this.host(), _this._textLabel()]; })];\n                        case 1:\n                            _a = __read.apply(void 0, [_b.sent(), 2]), host = _a[0], textLabel = _a[1];\n                            return [4 /*yield*/, host.hasClass('mat-slider-thumb-label-showing')];\n                        case 2:\n                            if (_b.sent()) {\n                                return [2 /*return*/, textLabel.text()];\n                            }\n                            return [2 /*return*/, null];\n                    }\n                });\n            });\n        };\n        /** Gets the current percentage value of the slider. */\n        MatSliderHarness.prototype.getPercentage = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var _a;\n                return __generator(this, function (_b) {\n                    switch (_b.label) {\n                        case 0:\n                            _a = this._calculatePercentage;\n                            return [4 /*yield*/, this.getValue()];\n                        case 1: return [2 /*return*/, _a.apply(this, [_b.sent()])];\n                    }\n                });\n            });\n        };\n        /** Gets the current value of the slider. */\n        MatSliderHarness.prototype.getValue = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var _a;\n                return __generator(this, function (_b) {\n                    switch (_b.label) {\n                        case 0:\n                            _a = coercion.coerceNumberProperty;\n                            return [4 /*yield*/, this.host()];\n                        case 1: return [4 /*yield*/, (_b.sent()).getAttribute('aria-valuenow')];\n                        case 2: return [2 /*return*/, _a.apply(void 0, [_b.sent()])];\n                    }\n                });\n            });\n        };\n        /** Gets the maximum value of the slider. */\n        MatSliderHarness.prototype.getMaxValue = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var _a;\n                return __generator(this, function (_b) {\n                    switch (_b.label) {\n                        case 0:\n                            _a = coercion.coerceNumberProperty;\n                            return [4 /*yield*/, this.host()];\n                        case 1: return [4 /*yield*/, (_b.sent()).getAttribute('aria-valuemax')];\n                        case 2: return [2 /*return*/, _a.apply(void 0, [_b.sent()])];\n                    }\n                });\n            });\n        };\n        /** Gets the minimum value of the slider. */\n        MatSliderHarness.prototype.getMinValue = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var _a;\n                return __generator(this, function (_b) {\n                    switch (_b.label) {\n                        case 0:\n                            _a = coercion.coerceNumberProperty;\n                            return [4 /*yield*/, this.host()];\n                        case 1: return [4 /*yield*/, (_b.sent()).getAttribute('aria-valuemin')];\n                        case 2: return [2 /*return*/, _a.apply(void 0, [_b.sent()])];\n                    }\n                });\n            });\n        };\n        /** Whether the slider is disabled. */\n        MatSliderHarness.prototype.isDisabled = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var disabled, _a;\n                return __generator(this, function (_b) {\n                    switch (_b.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1:\n                            disabled = (_b.sent()).getAttribute('aria-disabled');\n                            _a = coercion.coerceBooleanProperty;\n                            return [4 /*yield*/, disabled];\n                        case 2: return [2 /*return*/, _a.apply(void 0, [_b.sent()])];\n                    }\n                });\n            });\n        };\n        /** Gets the orientation of the slider. */\n        MatSliderHarness.prototype.getOrientation = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: \n                        // \"aria-orientation\" will always be set to either \"horizontal\" or \"vertical\".\n                        return [2 /*return*/, (_a.sent()).getAttribute('aria-orientation')];\n                    }\n                });\n            });\n        };\n        /**\n         * Sets the value of the slider by clicking on the slider track.\n         *\n         * Note that in rare cases the value cannot be set to the exact specified value. This\n         * can happen if not every value of the slider maps to a single pixel that could be\n         * clicked using mouse interaction. In such cases consider using the keyboard to\n         * select the given value or expand the slider's size for a better user experience.\n         */\n        MatSliderHarness.prototype.setValue = function (value) {\n            return __awaiter(this, void 0, void 0, function () {\n                var _a, sliderEl, wrapperEl, orientation, percentage, _b, height, width, isVertical, relativeX, relativeY;\n                var _this = this;\n                return __generator(this, function (_c) {\n                    switch (_c.label) {\n                        case 0: return [4 /*yield*/, testing.parallel(function () { return [_this.host(), _this._wrapper(), _this.getOrientation()]; })];\n                        case 1:\n                            _a = __read.apply(void 0, [_c.sent(), 3]), sliderEl = _a[0], wrapperEl = _a[1], orientation = _a[2];\n                            return [4 /*yield*/, this._calculatePercentage(value)];\n                        case 2:\n                            percentage = _c.sent();\n                            return [4 /*yield*/, wrapperEl.getDimensions()];\n                        case 3:\n                            _b = _c.sent(), height = _b.height, width = _b.width;\n                            isVertical = orientation === 'vertical';\n                            return [4 /*yield*/, sliderEl.hasClass('mat-slider-invert-mouse-coords')];\n                        case 4:\n                            // In case the slider is inverted in LTR mode or not inverted in RTL mode,\n                            // we need to invert the percentage so that the proper value is set.\n                            if (_c.sent()) {\n                                percentage = 1 - percentage;\n                            }\n                            relativeX = isVertical ? 0 : Math.round(width * percentage);\n                            relativeY = isVertical ? Math.round(height * percentage) : 0;\n                            return [4 /*yield*/, wrapperEl.click(relativeX, relativeY)];\n                        case 5:\n                            _c.sent();\n                            return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        /** Focuses the slider. */\n        MatSliderHarness.prototype.focus = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [2 /*return*/, (_a.sent()).focus()];\n                    }\n                });\n            });\n        };\n        /** Blurs the slider. */\n        MatSliderHarness.prototype.blur = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [2 /*return*/, (_a.sent()).blur()];\n                    }\n                });\n            });\n        };\n        /** Whether the slider is focused. */\n        MatSliderHarness.prototype.isFocused = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [2 /*return*/, (_a.sent()).isFocused()];\n                    }\n                });\n            });\n        };\n        /** Calculates the percentage of the given value. */\n        MatSliderHarness.prototype._calculatePercentage = function (value) {\n            return __awaiter(this, void 0, void 0, function () {\n                var _a, min, max;\n                var _this = this;\n                return __generator(this, function (_b) {\n                    switch (_b.label) {\n                        case 0: return [4 /*yield*/, testing.parallel(function () { return [_this.getMinValue(), _this.getMaxValue()]; })];\n                        case 1:\n                            _a = __read.apply(void 0, [_b.sent(), 2]), min = _a[0], max = _a[1];\n                            return [2 /*return*/, (value - min) / (max - min)];\n                    }\n                });\n            });\n        };\n        return MatSliderHarness;\n    }(testing.ComponentHarness));\n    /** The selector for the host element of a `MatSlider` instance. */\n    MatSliderHarness.hostSelector = '.mat-slider';\n\n    /**\n     * @license\n     * Copyright Google LLC All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n\n    /**\n     * @license\n     * Copyright Google LLC All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n\n    exports.MatSliderHarness = MatSliderHarness;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=material-slider-testing.umd.js.map\n"]}