/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
(function (factory) {
    if (typeof module === "object" && typeof module.exports === "object") {
        var v = factory(null, exports);
        if (v !== undefined) module.exports = v;
    }
    else if (typeof define === "function" && define.amd) {
        define("@angular/common/locales/extra/sq-XK", ["require", "exports"], factory);
    }
})(function (require, exports) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    // THIS CODE IS GENERATED - DO NOT MODIFY
    // See angular/tools/gulp-tasks/cldr/extract.js
    var u = undefined;
    exports.default = [
        [
            [
                'e mesnatës', 'e mesditës', 'e mëngjesit', 'e paradites', 'e pasdites', 'e mbrëmjes',
                'e natës'
            ],
            u, u
        ],
        [['mesnatë', 'mesditë', 'mëngjes', 'paradite', 'pasdite', 'mbrëmje', 'natë'], u, u],
        [
            '00:00', '12:00', ['04:00', '09:00'], ['09:00', '12:00'], ['12:00', '18:00'],
            ['18:00', '24:00'], ['00:00', '04:00']
        ]
    ];
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3EtWEsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9leHRyYS9zcS1YSy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLGtCQUFlO1FBQ2I7WUFDRTtnQkFDRSxZQUFZLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFlBQVk7Z0JBQ3BGLFNBQVM7YUFDVjtZQUNELENBQUMsRUFBRSxDQUFDO1NBQ0w7UUFDRCxDQUFDLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuRjtZQUNFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDO1lBQzVFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztTQUN2QztLQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gVEhJUyBDT0RFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBNT0RJRllcbi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzXG5cbmNvbnN0IHUgPSB1bmRlZmluZWQ7XG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgW1xuICAgIFtcbiAgICAgICdlIG1lc25hdMOrcycsICdlIG1lc2RpdMOrcycsICdlIG3Dq25namVzaXQnLCAnZSBwYXJhZGl0ZXMnLCAnZSBwYXNkaXRlcycsICdlIG1icsOrbWplcycsXG4gICAgICAnZSBuYXTDq3MnXG4gICAgXSxcbiAgICB1LCB1XG4gIF0sXG4gIFtbJ21lc25hdMOrJywgJ21lc2RpdMOrJywgJ23Dq25namVzJywgJ3BhcmFkaXRlJywgJ3Bhc2RpdGUnLCAnbWJyw6ttamUnLCAnbmF0w6snXSwgdSwgdV0sXG4gIFtcbiAgICAnMDA6MDAnLCAnMTI6MDAnLCBbJzA0OjAwJywgJzA5OjAwJ10sIFsnMDk6MDAnLCAnMTI6MDAnXSwgWycxMjowMCcsICcxODowMCddLFxuICAgIFsnMTg6MDAnLCAnMjQ6MDAnXSwgWycwMDowMCcsICcwNDowMCddXG4gIF1cbl07XG4iXX0=