summaryrefslogtreecommitdiffstats
path: root/web/static/js/react-intl-2.0.0-beta-2/react-intl.js
diff options
context:
space:
mode:
Diffstat (limited to 'web/static/js/react-intl-2.0.0-beta-2/react-intl.js')
-rw-r--r--web/static/js/react-intl-2.0.0-beta-2/react-intl.js3842
1 files changed, 3842 insertions, 0 deletions
diff --git a/web/static/js/react-intl-2.0.0-beta-2/react-intl.js b/web/static/js/react-intl-2.0.0-beta-2/react-intl.js
new file mode 100644
index 000000000..1f6d611fe
--- /dev/null
+++ b/web/static/js/react-intl-2.0.0-beta-2/react-intl.js
@@ -0,0 +1,3842 @@
+/*
+ * Copyright 2015, Yahoo Inc.
+ * Copyrights licensed under the New BSD License.
+ * See the accompanying LICENSE file for terms.
+ */
+
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) :
+ typeof define === 'function' && define.amd ? define(['exports', 'react'], factory) :
+ factory((global.ReactIntl = {}),global.React);
+}(this, function (exports,React) { 'use strict';
+
+ var React__default = 'default' in React ? React['default'] : React;
+
+ var babelHelpers = {};
+
+ babelHelpers.typeof = function (obj) {
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
+ };
+
+ babelHelpers.classCallCheck = function (instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ };
+
+ babelHelpers.createClass = (function () {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+
+ return function (Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) defineProperties(Constructor, staticProps);
+ return Constructor;
+ };
+ })();
+
+ babelHelpers.defineProperty = function (obj, key, value) {
+ if (key in obj) {
+ Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ } else {
+ obj[key] = value;
+ }
+
+ return obj;
+ };
+
+ babelHelpers.extends = Object.assign || function (target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+
+ for (var key in source) {
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+ }
+
+ return target;
+ };
+
+ babelHelpers.inherits = function (subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ }
+
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
+ };
+
+ babelHelpers.possibleConstructorReturn = function (self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }
+
+ return call && (typeof call === "object" || typeof call === "function") ? call : self;
+ };
+
+ babelHelpers.toConsumableArray = function (arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+
+ return arr2;
+ } else {
+ return Array.from(arr);
+ }
+ };
+
+ babelHelpers;
+ // GENERATED FILE
+ var defaultLocaleData = { "locale": "en", "pluralRuleFunction": function pluralRuleFunction(n, ord) {
+ var s = String(n).split("."),
+ v0 = !s[1],
+ t0 = Number(s[0]) == n,
+ n10 = t0 && s[0].slice(-1),
+ n100 = t0 && s[0].slice(-2);if (ord) return n10 == 1 && n100 != 11 ? "one" : n10 == 2 && n100 != 12 ? "two" : n10 == 3 && n100 != 13 ? "few" : "other";return n == 1 && v0 ? "one" : "other";
+ }, "fields": { "year": { "displayName": "Year", "relative": { "0": "this year", "1": "next year", "-1": "last year" }, "relativeTime": { "future": { "one": "in {0} year", "other": "in {0} years" }, "past": { "one": "{0} year ago", "other": "{0} years ago" } } }, "month": { "displayName": "Month", "relative": { "0": "this month", "1": "next month", "-1": "last month" }, "relativeTime": { "future": { "one": "in {0} month", "other": "in {0} months" }, "past": { "one": "{0} month ago", "other": "{0} months ago" } } }, "day": { "displayName": "Day", "relative": { "0": "today", "1": "tomorrow", "-1": "yesterday" }, "relativeTime": { "future": { "one": "in {0} day", "other": "in {0} days" }, "past": { "one": "{0} day ago", "other": "{0} days ago" } } }, "hour": { "displayName": "Hour", "relativeTime": { "future": { "one": "in {0} hour", "other": "in {0} hours" }, "past": { "one": "{0} hour ago", "other": "{0} hours ago" } } }, "minute": { "displayName": "Minute", "relativeTime": { "future": { "one": "in {0} minute", "other": "in {0} minutes" }, "past": { "one": "{0} minute ago", "other": "{0} minutes ago" } } }, "second": { "displayName": "Second", "relative": { "0": "now" }, "relativeTime": { "future": { "one": "in {0} second", "other": "in {0} seconds" }, "past": { "one": "{0} second ago", "other": "{0} seconds ago" } } } } };
+
+ // GENERATED FILE
+ var defaultLocale$1 = { "locale": "en", "pluralRuleFunction": function pluralRuleFunction(n, ord) {
+ var s = String(n).split("."),
+ v0 = !s[1],
+ t0 = Number(s[0]) == n,
+ n10 = t0 && s[0].slice(-1),
+ n100 = t0 && s[0].slice(-2);if (ord) return n10 == 1 && n100 != 11 ? "one" : n10 == 2 && n100 != 12 ? "two" : n10 == 3 && n100 != 13 ? "few" : "other";return n == 1 && v0 ? "one" : "other";
+ } };
+
+ /*
+ Copyright (c) 2014, Yahoo! Inc. All rights reserved.
+ Copyrights licensed under the New BSD License.
+ See the accompanying LICENSE file for terms.
+ */
+
+ /* jslint esnext: true */
+
+ var hop$1 = Object.prototype.hasOwnProperty;
+
+ function extend(obj) {
+ var sources = Array.prototype.slice.call(arguments, 1),
+ i,
+ len,
+ source,
+ key;
+
+ for (i = 0, len = sources.length; i < len; i += 1) {
+ source = sources[i];
+ if (!source) {
+ continue;
+ }
+
+ for (key in source) {
+ if (hop$1.call(source, key)) {
+ obj[key] = source[key];
+ }
+ }
+ }
+
+ return obj;
+ }
+
+ // Purposely using the same implementation as the Intl.js `Intl` polyfill.
+ // Copyright 2013 Andy Earnshaw, MIT License
+
+ var realDefineProp$1 = (function () {
+ try {
+ return !!Object.defineProperty({}, 'a', {});
+ } catch (e) {
+ return false;
+ }
+ })();
+
+ var es3$1 = !realDefineProp$1 && !Object.prototype.__defineGetter__;
+
+ var defineProperty$1 = realDefineProp$1 ? Object.defineProperty : function (obj, name, desc) {
+
+ if ('get' in desc && obj.__defineGetter__) {
+ obj.__defineGetter__(name, desc.get);
+ } else if (!hop$1.call(obj, name) || 'value' in desc) {
+ obj[name] = desc.value;
+ }
+ };
+
+ var objCreate$1 = Object.create || function (proto, props) {
+ var obj, k;
+
+ function F() {}
+ F.prototype = proto;
+ obj = new F();
+
+ for (k in props) {
+ if (hop$1.call(props, k)) {
+ defineProperty$1(obj, k, props[k]);
+ }
+ }
+
+ return obj;
+ };
+
+ var parser = (function () {
+ /*
+ * Generated by PEG.js 0.8.0.
+ *
+ * http://pegjs.majda.cz/
+ */
+
+ function peg$subclass(child, parent) {
+ function ctor() {
+ this.constructor = child;
+ }
+ ctor.prototype = parent.prototype;
+ child.prototype = new ctor();
+ }
+
+ function SyntaxError(message, expected, found, offset, line, column) {
+ this.message = message;
+ this.expected = expected;
+ this.found = found;
+ this.offset = offset;
+ this.line = line;
+ this.column = column;
+
+ this.name = "SyntaxError";
+ }
+
+ peg$subclass(SyntaxError, Error);
+
+ function parse(input) {
+ var options = arguments.length > 1 ? arguments[1] : {},
+ peg$FAILED = {},
+ peg$startRuleFunctions = { start: peg$parsestart },
+ peg$startRuleFunction = peg$parsestart,
+ peg$c0 = [],
+ peg$c1 = function peg$c1(elements) {
+ return {
+ type: 'messageFormatPattern',
+ elements: elements
+ };
+ },
+ peg$c2 = peg$FAILED,
+ peg$c3 = function peg$c3(text) {
+ var string = '',
+ i,
+ j,
+ outerLen,
+ inner,
+ innerLen;
+
+ for (i = 0, outerLen = text.length; i < outerLen; i += 1) {
+ inner = text[i];
+
+ for (j = 0, innerLen = inner.length; j < innerLen; j += 1) {
+ string += inner[j];
+ }
+ }
+
+ return string;
+ },
+ peg$c4 = function peg$c4(messageText) {
+ return {
+ type: 'messageTextElement',
+ value: messageText
+ };
+ },
+ peg$c5 = /^[^ \t\n\r,.+={}#]/,
+ peg$c6 = { type: "class", value: "[^ \\t\\n\\r,.+={}#]", description: "[^ \\t\\n\\r,.+={}#]" },
+ peg$c7 = "{",
+ peg$c8 = { type: "literal", value: "{", description: "\"{\"" },
+ peg$c9 = null,
+ peg$c10 = ",",
+ peg$c11 = { type: "literal", value: ",", description: "\",\"" },
+ peg$c12 = "}",
+ peg$c13 = { type: "literal", value: "}", description: "\"}\"" },
+ peg$c14 = function peg$c14(id, format) {
+ return {
+ type: 'argumentElement',
+ id: id,
+ format: format && format[2]
+ };
+ },
+ peg$c15 = "number",
+ peg$c16 = { type: "literal", value: "number", description: "\"number\"" },
+ peg$c17 = "date",
+ peg$c18 = { type: "literal", value: "date", description: "\"date\"" },
+ peg$c19 = "time",
+ peg$c20 = { type: "literal", value: "time", description: "\"time\"" },
+ peg$c21 = function peg$c21(type, style) {
+ return {
+ type: type + 'Format',
+ style: style && style[2]
+ };
+ },
+ peg$c22 = "plural",
+ peg$c23 = { type: "literal", value: "plural", description: "\"plural\"" },
+ peg$c24 = function peg$c24(pluralStyle) {
+ return {
+ type: pluralStyle.type,
+ ordinal: false,
+ offset: pluralStyle.offset || 0,
+ options: pluralStyle.options
+ };
+ },
+ peg$c25 = "selectordinal",
+ peg$c26 = { type: "literal", value: "selectordinal", description: "\"selectordinal\"" },
+ peg$c27 = function peg$c27(pluralStyle) {
+ return {
+ type: pluralStyle.type,
+ ordinal: true,
+ offset: pluralStyle.offset || 0,
+ options: pluralStyle.options
+ };
+ },
+ peg$c28 = "select",
+ peg$c29 = { type: "literal", value: "select", description: "\"select\"" },
+ peg$c30 = function peg$c30(options) {
+ return {
+ type: 'selectFormat',
+ options: options
+ };
+ },
+ peg$c31 = "=",
+ peg$c32 = { type: "literal", value: "=", description: "\"=\"" },
+ peg$c33 = function peg$c33(selector, pattern) {
+ return {
+ type: 'optionalFormatPattern',
+ selector: selector,
+ value: pattern
+ };
+ },
+ peg$c34 = "offset:",
+ peg$c35 = { type: "literal", value: "offset:", description: "\"offset:\"" },
+ peg$c36 = function peg$c36(number) {
+ return number;
+ },
+ peg$c37 = function peg$c37(offset, options) {
+ return {
+ type: 'pluralFormat',
+ offset: offset,
+ options: options
+ };
+ },
+ peg$c38 = { type: "other", description: "whitespace" },
+ peg$c39 = /^[ \t\n\r]/,
+ peg$c40 = { type: "class", value: "[ \\t\\n\\r]", description: "[ \\t\\n\\r]" },
+ peg$c41 = { type: "other", description: "optionalWhitespace" },
+ peg$c42 = /^[0-9]/,
+ peg$c43 = { type: "class", value: "[0-9]", description: "[0-9]" },
+ peg$c44 = /^[0-9a-f]/i,
+ peg$c45 = { type: "class", value: "[0-9a-f]i", description: "[0-9a-f]i" },
+ peg$c46 = "0",
+ peg$c47 = { type: "literal", value: "0", description: "\"0\"" },
+ peg$c48 = /^[1-9]/,
+ peg$c49 = { type: "class", value: "[1-9]", description: "[1-9]" },
+ peg$c50 = function peg$c50(digits) {
+ return parseInt(digits, 10);
+ },
+ peg$c51 = /^[^{}\\\0-\x1F \t\n\r]/,
+ peg$c52 = { type: "class", value: "[^{}\\\\\\0-\\x1F \\t\\n\\r]", description: "[^{}\\\\\\0-\\x1F \\t\\n\\r]" },
+ peg$c53 = "\\\\",
+ peg$c54 = { type: "literal", value: "\\\\", description: "\"\\\\\\\\\"" },
+ peg$c55 = function peg$c55() {
+ return '\\';
+ },
+ peg$c56 = "\\#",
+ peg$c57 = { type: "literal", value: "\\#", description: "\"\\\\#\"" },
+ peg$c58 = function peg$c58() {
+ return '\\#';
+ },
+ peg$c59 = "\\{",
+ peg$c60 = { type: "literal", value: "\\{", description: "\"\\\\{\"" },
+ peg$c61 = function peg$c61() {
+ return '{';
+ },
+ peg$c62 = "\\}",
+ peg$c63 = { type: "literal", value: "\\}", description: "\"\\\\}\"" },
+ peg$c64 = function peg$c64() {
+ return '}';
+ },
+ peg$c65 = '\\u',
+ peg$c66 = { type: "literal", value: '\\u', description: '"\\\\u"' },
+ peg$c67 = function peg$c67(digits) {
+ return String.fromCharCode(parseInt(digits, 16));
+ },
+ peg$c68 = function peg$c68(chars) {
+ return chars.join('');
+ },
+ peg$currPos = 0,
+ peg$reportedPos = 0,
+ peg$cachedPos = 0,
+ peg$cachedPosDetails = { line: 1, column: 1, seenCR: false },
+ peg$maxFailPos = 0,
+ peg$maxFailExpected = [],
+ peg$silentFails = 0,
+ peg$result;
+
+ if ("startRule" in options) {
+ if (!(options.startRule in peg$startRuleFunctions)) {
+ throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
+ }
+
+ peg$startRuleFunction = peg$startRuleFunctions[options.startRule];
+ }
+
+ function text() {
+ return input.substring(peg$reportedPos, peg$currPos);
+ }
+
+ function offset() {
+ return peg$reportedPos;
+ }
+
+ function line() {
+ return peg$computePosDetails(peg$reportedPos).line;
+ }
+
+ function column() {
+ return peg$computePosDetails(peg$reportedPos).column;
+ }
+
+ function expected(description) {
+ throw peg$buildException(null, [{ type: "other", description: description }], peg$reportedPos);
+ }
+
+ function error(message) {
+ throw peg$buildException(message, null, peg$reportedPos);
+ }
+
+ function peg$computePosDetails(pos) {
+ function advance(details, startPos, endPos) {
+ var p, ch;
+
+ for (p = startPos; p < endPos; p++) {
+ ch = input.charAt(p);
+ if (ch === "\n") {
+ if (!details.seenCR) {
+ details.line++;
+ }
+ details.column = 1;
+ details.seenCR = false;
+ } else if (ch === "\r" || ch === '\u2028' || ch === '\u2029') {
+ details.line++;
+ details.column = 1;
+ details.seenCR = true;
+ } else {
+ details.column++;
+ details.seenCR = false;
+ }
+ }
+ }
+
+ if (peg$cachedPos !== pos) {
+ if (peg$cachedPos > pos) {
+ peg$cachedPos = 0;
+ peg$cachedPosDetails = { line: 1, column: 1, seenCR: false };
+ }
+ advance(peg$cachedPosDetails, peg$cachedPos, pos);
+ peg$cachedPos = pos;
+ }
+
+ return peg$cachedPosDetails;
+ }
+
+ function peg$fail(expected) {
+ if (peg$currPos < peg$maxFailPos) {
+ return;
+ }
+
+ if (peg$currPos > peg$maxFailPos) {
+ peg$maxFailPos = peg$currPos;
+ peg$maxFailExpected = [];
+ }
+
+ peg$maxFailExpected.push(expected);
+ }
+
+ function peg$buildException(message, expected, pos) {
+ function cleanupExpected(expected) {
+ var i = 1;
+
+ expected.sort(function (a, b) {
+ if (a.description < b.description) {
+ return -1;
+ } else if (a.description > b.description) {
+ return 1;
+ } else {
+ return 0;
+ }
+ });
+
+ while (i < expected.length) {
+ if (expected[i - 1] === expected[i]) {
+ expected.splice(i, 1);
+ } else {
+ i++;
+ }
+ }
+ }
+
+ function buildMessage(expected, found) {
+ function stringEscape(s) {
+ function hex(ch) {
+ return ch.charCodeAt(0).toString(16).toUpperCase();
+ }
+
+ return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\x08/g, '\\b').replace(/\t/g, '\\t').replace(/\n/g, '\\n').replace(/\f/g, '\\f').replace(/\r/g, '\\r').replace(/[\x00-\x07\x0B\x0E\x0F]/g, function (ch) {
+ return '\\x0' + hex(ch);
+ }).replace(/[\x10-\x1F\x80-\xFF]/g, function (ch) {
+ return '\\x' + hex(ch);
+ }).replace(/[\u0180-\u0FFF]/g, function (ch) {
+ return '\\u0' + hex(ch);
+ }).replace(/[\u1080-\uFFFF]/g, function (ch) {
+ return '\\u' + hex(ch);
+ });
+ }
+
+ var expectedDescs = new Array(expected.length),
+ expectedDesc,
+ foundDesc,
+ i;
+
+ for (i = 0; i < expected.length; i++) {
+ expectedDescs[i] = expected[i].description;
+ }
+
+ expectedDesc = expected.length > 1 ? expectedDescs.slice(0, -1).join(", ") + " or " + expectedDescs[expected.length - 1] : expectedDescs[0];
+
+ foundDesc = found ? "\"" + stringEscape(found) + "\"" : "end of input";
+
+ return "Expected " + expectedDesc + " but " + foundDesc + " found.";
+ }
+
+ var posDetails = peg$computePosDetails(pos),
+ found = pos < input.length ? input.charAt(pos) : null;
+
+ if (expected !== null) {
+ cleanupExpected(expected);
+ }
+
+ return new SyntaxError(message !== null ? message : buildMessage(expected, found), expected, found, pos, posDetails.line, posDetails.column);
+ }
+
+ function peg$parsestart() {
+ var s0;
+
+ s0 = peg$parsemessageFormatPattern();
+
+ return s0;
+ }
+
+ function peg$parsemessageFormatPattern() {
+ var s0, s1, s2;
+
+ s0 = peg$currPos;
+ s1 = [];
+ s2 = peg$parsemessageFormatElement();
+ while (s2 !== peg$FAILED) {
+ s1.push(s2);
+ s2 = peg$parsemessageFormatElement();
+ }
+ if (s1 !== peg$FAILED) {
+ peg$reportedPos = s0;
+ s1 = peg$c1(s1);
+ }
+ s0 = s1;
+
+ return s0;
+ }
+
+ function peg$parsemessageFormatElement() {
+ var s0;
+
+ s0 = peg$parsemessageTextElement();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseargumentElement();
+ }
+
+ return s0;
+ }
+
+ function peg$parsemessageText() {
+ var s0, s1, s2, s3, s4, s5;
+
+ s0 = peg$currPos;
+ s1 = [];
+ s2 = peg$currPos;
+ s3 = peg$parse_();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parsechars();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parse_();
+ if (s5 !== peg$FAILED) {
+ s3 = [s3, s4, s5];
+ s2 = s3;
+ } else {
+ peg$currPos = s2;
+ s2 = peg$c2;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$c2;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$c2;
+ }
+ if (s2 !== peg$FAILED) {
+ while (s2 !== peg$FAILED) {
+ s1.push(s2);
+ s2 = peg$currPos;
+ s3 = peg$parse_();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parsechars();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parse_();
+ if (s5 !== peg$FAILED) {
+ s3 = [s3, s4, s5];
+ s2 = s3;
+ } else {
+ peg$currPos = s2;
+ s2 = peg$c2;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$c2;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$c2;
+ }
+ }
+ } else {
+ s1 = peg$c2;
+ }
+ if (s1 !== peg$FAILED) {
+ peg$reportedPos = s0;
+ s1 = peg$c3(s1);
+ }
+ s0 = s1;
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parsews();
+ if (s1 !== peg$FAILED) {
+ s1 = input.substring(s0, peg$currPos);
+ }
+ s0 = s1;
+ }
+
+ return s0;
+ }
+
+ function peg$parsemessageTextElement() {
+ var s0, s1;
+
+ s0 = peg$currPos;
+ s1 = peg$parsemessageText();
+ if (s1 !== peg$FAILED) {
+ peg$reportedPos = s0;
+ s1 = peg$c4(s1);
+ }
+ s0 = s1;
+
+ return s0;
+ }
+
+ function peg$parseargument() {
+ var s0, s1, s2;
+
+ s0 = peg$parsenumber();
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = [];
+ if (peg$c5.test(input.charAt(peg$currPos))) {
+ s2 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c6);
+ }
+ }
+ if (s2 !== peg$FAILED) {
+ while (s2 !== peg$FAILED) {
+ s1.push(s2);
+ if (peg$c5.test(input.charAt(peg$currPos))) {
+ s2 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c6);
+ }
+ }
+ }
+ } else {
+ s1 = peg$c2;
+ }
+ if (s1 !== peg$FAILED) {
+ s1 = input.substring(s0, peg$currPos);
+ }
+ s0 = s1;
+ }
+
+ return s0;
+ }
+
+ function peg$parseargumentElement() {
+ var s0, s1, s2, s3, s4, s5, s6, s7, s8;
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 123) {
+ s1 = peg$c7;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c8);
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseargument();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parse_();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 44) {
+ s6 = peg$c10;
+ peg$currPos++;
+ } else {
+ s6 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c11);
+ }
+ }
+ if (s6 !== peg$FAILED) {
+ s7 = peg$parse_();
+ if (s7 !== peg$FAILED) {
+ s8 = peg$parseelementFormat();
+ if (s8 !== peg$FAILED) {
+ s6 = [s6, s7, s8];
+ s5 = s6;
+ } else {
+ peg$currPos = s5;
+ s5 = peg$c2;
+ }
+ } else {
+ peg$currPos = s5;
+ s5 = peg$c2;
+ }
+ } else {
+ peg$currPos = s5;
+ s5 = peg$c2;
+ }
+ if (s5 === peg$FAILED) {
+ s5 = peg$c9;
+ }
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parse_();
+ if (s6 !== peg$FAILED) {
+ if (input.charCodeAt(peg$currPos) === 125) {
+ s7 = peg$c12;
+ peg$currPos++;
+ } else {
+ s7 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c13);
+ }
+ }
+ if (s7 !== peg$FAILED) {
+ peg$reportedPos = s0;
+ s1 = peg$c14(s3, s5);
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+
+ return s0;
+ }
+
+ function peg$parseelementFormat() {
+ var s0;
+
+ s0 = peg$parsesimpleFormat();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsepluralFormat();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseselectOrdinalFormat();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseselectFormat();
+ }
+ }
+ }
+
+ return s0;
+ }
+
+ function peg$parsesimpleFormat() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c15) {
+ s1 = peg$c15;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c16);
+ }
+ }
+ if (s1 === peg$FAILED) {
+ if (input.substr(peg$currPos, 4) === peg$c17) {
+ s1 = peg$c17;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c18);
+ }
+ }
+ if (s1 === peg$FAILED) {
+ if (input.substr(peg$currPos, 4) === peg$c19) {
+ s1 = peg$c19;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c20);
+ }
+ }
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 44) {
+ s4 = peg$c10;
+ peg$currPos++;
+ } else {
+ s4 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c11);
+ }
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parse_();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parsechars();
+ if (s6 !== peg$FAILED) {
+ s4 = [s4, s5, s6];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$c2;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$c2;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$c2;
+ }
+ if (s3 === peg$FAILED) {
+ s3 = peg$c9;
+ }
+ if (s3 !== peg$FAILED) {
+ peg$reportedPos = s0;
+ s1 = peg$c21(s1, s3);
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+
+ return s0;
+ }
+
+ function peg$parsepluralFormat() {
+ var s0, s1, s2, s3, s4, s5;
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c22) {
+ s1 = peg$c22;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c23);
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ if (s2 !== peg$FAILED) {
+ if (input.charCodeAt(peg$currPos) === 44) {
+ s3 = peg$c10;
+ peg$currPos++;
+ } else {
+ s3 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c11);
+ }
+ }
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parse_();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsepluralStyle();
+ if (s5 !== peg$FAILED) {
+ peg$reportedPos = s0;
+ s1 = peg$c24(s5);
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+
+ return s0;
+ }
+
+ function peg$parseselectOrdinalFormat() {
+ var s0, s1, s2, s3, s4, s5;
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c25) {
+ s1 = peg$c25;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c26);
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ if (s2 !== peg$FAILED) {
+ if (input.charCodeAt(peg$currPos) === 44) {
+ s3 = peg$c10;
+ peg$currPos++;
+ } else {
+ s3 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c11);
+ }
+ }
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parse_();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsepluralStyle();
+ if (s5 !== peg$FAILED) {
+ peg$reportedPos = s0;
+ s1 = peg$c27(s5);
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+
+ return s0;
+ }
+
+ function peg$parseselectFormat() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c28) {
+ s1 = peg$c28;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c29);
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ if (s2 !== peg$FAILED) {
+ if (input.charCodeAt(peg$currPos) === 44) {
+ s3 = peg$c10;
+ peg$currPos++;
+ } else {
+ s3 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c11);
+ }
+ }
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parse_();
+ if (s4 !== peg$FAILED) {
+ s5 = [];
+ s6 = peg$parseoptionalFormatPattern();
+ if (s6 !== peg$FAILED) {
+ while (s6 !== peg$FAILED) {
+ s5.push(s6);
+ s6 = peg$parseoptionalFormatPattern();
+ }
+ } else {
+ s5 = peg$c2;
+ }
+ if (s5 !== peg$FAILED) {
+ peg$reportedPos = s0;
+ s1 = peg$c30(s5);
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+
+ return s0;
+ }
+
+ function peg$parseselector() {
+ var s0, s1, s2, s3;
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 61) {
+ s2 = peg$c31;
+ peg$currPos++;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c32);
+ }
+ }
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parsenumber();
+ if (s3 !== peg$FAILED) {
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$c2;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$c2;
+ }
+ if (s1 !== peg$FAILED) {
+ s1 = input.substring(s0, peg$currPos);
+ }
+ s0 = s1;
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsechars();
+ }
+
+ return s0;
+ }
+
+ function peg$parseoptionalFormatPattern() {
+ var s0, s1, s2, s3, s4, s5, s6, s7, s8;
+
+ s0 = peg$currPos;
+ s1 = peg$parse_();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseselector();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parse_();
+ if (s3 !== peg$FAILED) {
+ if (input.charCodeAt(peg$currPos) === 123) {
+ s4 = peg$c7;
+ peg$currPos++;
+ } else {
+ s4 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c8);
+ }
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parse_();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parsemessageFormatPattern();
+ if (s6 !== peg$FAILED) {
+ s7 = peg$parse_();
+ if (s7 !== peg$FAILED) {
+ if (input.charCodeAt(peg$currPos) === 125) {
+ s8 = peg$c12;
+ peg$currPos++;
+ } else {
+ s8 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c13);
+ }
+ }
+ if (s8 !== peg$FAILED) {
+ peg$reportedPos = s0;
+ s1 = peg$c33(s2, s6);
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+
+ return s0;
+ }
+
+ function peg$parseoffset() {
+ var s0, s1, s2, s3;
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c34) {
+ s1 = peg$c34;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c35);
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parsenumber();
+ if (s3 !== peg$FAILED) {
+ peg$reportedPos = s0;
+ s1 = peg$c36(s3);
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+
+ return s0;
+ }
+
+ function peg$parsepluralStyle() {
+ var s0, s1, s2, s3, s4;
+
+ s0 = peg$currPos;
+ s1 = peg$parseoffset();
+ if (s1 === peg$FAILED) {
+ s1 = peg$c9;
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ s4 = peg$parseoptionalFormatPattern();
+ if (s4 !== peg$FAILED) {
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$parseoptionalFormatPattern();
+ }
+ } else {
+ s3 = peg$c2;
+ }
+ if (s3 !== peg$FAILED) {
+ peg$reportedPos = s0;
+ s1 = peg$c37(s1, s3);
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+
+ return s0;
+ }
+
+ function peg$parsews() {
+ var s0, s1;
+
+ peg$silentFails++;
+ s0 = [];
+ if (peg$c39.test(input.charAt(peg$currPos))) {
+ s1 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c40);
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ while (s1 !== peg$FAILED) {
+ s0.push(s1);
+ if (peg$c39.test(input.charAt(peg$currPos))) {
+ s1 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c40);
+ }
+ }
+ }
+ } else {
+ s0 = peg$c2;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c38);
+ }
+ }
+
+ return s0;
+ }
+
+ function peg$parse_() {
+ var s0, s1, s2;
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = [];
+ s2 = peg$parsews();
+ while (s2 !== peg$FAILED) {
+ s1.push(s2);
+ s2 = peg$parsews();
+ }
+ if (s1 !== peg$FAILED) {
+ s1 = input.substring(s0, peg$currPos);
+ }
+ s0 = s1;
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c41);
+ }
+ }
+
+ return s0;
+ }
+
+ function peg$parsedigit() {
+ var s0;
+
+ if (peg$c42.test(input.charAt(peg$currPos))) {
+ s0 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s0 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c43);
+ }
+ }
+
+ return s0;
+ }
+
+ function peg$parsehexDigit() {
+ var s0;
+
+ if (peg$c44.test(input.charAt(peg$currPos))) {
+ s0 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s0 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c45);
+ }
+ }
+
+ return s0;
+ }
+
+ function peg$parsenumber() {
+ var s0, s1, s2, s3, s4, s5;
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 48) {
+ s1 = peg$c46;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c47);
+ }
+ }
+ if (s1 === peg$FAILED) {
+ s1 = peg$currPos;
+ s2 = peg$currPos;
+ if (peg$c48.test(input.charAt(peg$currPos))) {
+ s3 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s3 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c49);
+ }
+ }
+ if (s3 !== peg$FAILED) {
+ s4 = [];
+ s5 = peg$parsedigit();
+ while (s5 !== peg$FAILED) {
+ s4.push(s5);
+ s5 = peg$parsedigit();
+ }
+ if (s4 !== peg$FAILED) {
+ s3 = [s3, s4];
+ s2 = s3;
+ } else {
+ peg$currPos = s2;
+ s2 = peg$c2;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$c2;
+ }
+ if (s2 !== peg$FAILED) {
+ s2 = input.substring(s1, peg$currPos);
+ }
+ s1 = s2;
+ }
+ if (s1 !== peg$FAILED) {
+ peg$reportedPos = s0;
+ s1 = peg$c50(s1);
+ }
+ s0 = s1;
+
+ return s0;
+ }
+
+ function peg$parsechar() {
+ var s0, s1, s2, s3, s4, s5, s6, s7;
+
+ if (peg$c51.test(input.charAt(peg$currPos))) {
+ s0 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s0 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c52);
+ }
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c53) {
+ s1 = peg$c53;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c54);
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ peg$reportedPos = s0;
+ s1 = peg$c55();
+ }
+ s0 = s1;
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c56) {
+ s1 = peg$c56;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c57);
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ peg$reportedPos = s0;
+ s1 = peg$c58();
+ }
+ s0 = s1;
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c59) {
+ s1 = peg$c59;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c60);
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ peg$reportedPos = s0;
+ s1 = peg$c61();
+ }
+ s0 = s1;
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c62) {
+ s1 = peg$c62;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c63);
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ peg$reportedPos = s0;
+ s1 = peg$c64();
+ }
+ s0 = s1;
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c65) {
+ s1 = peg$c65;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) {
+ peg$fail(peg$c66);
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$currPos;
+ s3 = peg$currPos;
+ s4 = peg$parsehexDigit();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsehexDigit();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parsehexDigit();
+ if (s6 !== peg$FAILED) {
+ s7 = peg$parsehexDigit();
+ if (s7 !== peg$FAILED) {
+ s4 = [s4, s5, s6, s7];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$c2;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$c2;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$c2;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$c2;
+ }
+ if (s3 !== peg$FAILED) {
+ s3 = input.substring(s2, peg$currPos);
+ }
+ s2 = s3;
+ if (s2 !== peg$FAILED) {
+ peg$reportedPos = s0;
+ s1 = peg$c67(s2);
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$c2;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return s0;
+ }
+
+ function peg$parsechars() {
+ var s0, s1, s2;
+
+ s0 = peg$currPos;
+ s1 = [];
+ s2 = peg$parsechar();
+ if (s2 !== peg$FAILED) {
+ while (s2 !== peg$FAILED) {
+ s1.push(s2);
+ s2 = peg$parsechar();
+ }
+ } else {
+ s1 = peg$c2;
+ }
+ if (s1 !== peg$FAILED) {
+ peg$reportedPos = s0;
+ s1 = peg$c68(s1);
+ }
+ s0 = s1;
+
+ return s0;
+ }
+
+ peg$result = peg$startRuleFunction();
+
+ if (peg$result !== peg$FAILED && peg$currPos === input.length) {
+ return peg$result;
+ } else {
+ if (peg$result !== peg$FAILED && peg$currPos < input.length) {
+ peg$fail({ type: "end", description: "end of input" });
+ }
+
+ throw peg$buildException(null, peg$maxFailExpected, peg$maxFailPos);
+ }
+ }
+
+ return {
+ SyntaxError: SyntaxError,
+ parse: parse
+ };
+ })();
+
+ function Compiler(locales, formats, pluralFn) {
+ this.locales = locales;
+ this.formats = formats;
+ this.pluralFn = pluralFn;
+ }
+
+ Compiler.prototype.compile = function (ast) {
+ this.pluralStack = [];
+ this.currentPlural = null;
+ this.pluralNumberFormat = null;
+
+ return this.compileMessage(ast);
+ };
+
+ Compiler.prototype.compileMessage = function (ast) {
+ if (!(ast && ast.type === 'messageFormatPattern')) {
+ throw new Error('Message AST is not of type: "messageFormatPattern"');
+ }
+
+ var elements = ast.elements,
+ pattern = [];
+
+ var i, len, element;
+
+ for (i = 0, len = elements.length; i < len; i += 1) {
+ element = elements[i];
+
+ switch (element.type) {
+ case 'messageTextElement':
+ pattern.push(this.compileMessageText(element));
+ break;
+
+ case 'argumentElement':
+ pattern.push(this.compileArgument(element));
+ break;
+
+ default:
+ throw new Error('Message element does not have a valid type');
+ }
+ }
+
+ return pattern;
+ };
+
+ Compiler.prototype.compileMessageText = function (element) {
+ // When this `element` is part of plural sub-pattern and its value contains
+ // an unescaped '#', use a `PluralOffsetString` helper to properly output
+ // the number with the correct offset in the string.
+ if (this.currentPlural && /(^|[^\\])#/g.test(element.value)) {
+ // Create a cache a NumberFormat instance that can be reused for any
+ // PluralOffsetString instance in this message.
+ if (!this.pluralNumberFormat) {
+ this.pluralNumberFormat = new Intl.NumberFormat(this.locales);
+ }
+
+ return new PluralOffsetString(this.currentPlural.id, this.currentPlural.format.offset, this.pluralNumberFormat, element.value);
+ }
+
+ // Unescape the escaped '#'s in the message text.
+ return element.value.replace(/\\#/g, '#');
+ };
+
+ Compiler.prototype.compileArgument = function (element) {
+ var format = element.format;
+
+ if (!format) {
+ return new StringFormat(element.id);
+ }
+
+ var formats = this.formats,
+ locales = this.locales,
+ pluralFn = this.pluralFn,
+ options;
+
+ switch (format.type) {
+ case 'numberFormat':
+ options = formats.number[format.style];
+ return {
+ id: element.id,
+ format: new Intl.NumberFormat(locales, options).format
+ };
+
+ case 'dateFormat':
+ options = formats.date[format.style];
+ return {
+ id: element.id,
+ format: new Intl.DateTimeFormat(locales, options).format
+ };
+
+ case 'timeFormat':
+ options = formats.time[format.style];
+ return {
+ id: element.id,
+ format: new Intl.DateTimeFormat(locales, options).format
+ };
+
+ case 'pluralFormat':
+ options = this.compileOptions(element);
+ return new PluralFormat(element.id, format.ordinal, format.offset, options, pluralFn);
+
+ case 'selectFormat':
+ options = this.compileOptions(element);
+ return new SelectFormat(element.id, options);
+
+ default:
+ throw new Error('Message element does not have a valid format type');
+ }
+ };
+
+ Compiler.prototype.compileOptions = function (element) {
+ var format = element.format,
+ options = format.options,
+ optionsHash = {};
+
+ // Save the current plural element, if any, then set it to a new value when
+ // compiling the options sub-patterns. This conforms the spec's algorithm
+ // for handling `"#"` syntax in message text.
+ this.pluralStack.push(this.currentPlural);
+ this.currentPlural = format.type === 'pluralFormat' ? element : null;
+
+ var i, len, option;
+
+ for (i = 0, len = options.length; i < len; i += 1) {
+ option = options[i];
+
+ // Compile the sub-pattern and save it under the options's selector.
+ optionsHash[option.selector] = this.compileMessage(option.value);
+ }
+
+ // Pop the plural stack to put back the original current plural value.
+ this.currentPlural = this.pluralStack.pop();
+
+ return optionsHash;
+ };
+
+ // -- Compiler Helper Classes --------------------------------------------------
+
+ function StringFormat(id) {
+ this.id = id;
+ }
+
+ StringFormat.prototype.format = function (value) {
+ if (!value) {
+ return '';
+ }
+
+ return typeof value === 'string' ? value : String(value);
+ };
+
+ function PluralFormat(id, useOrdinal, offset, options, pluralFn) {
+ this.id = id;
+ this.useOrdinal = useOrdinal;
+ this.offset = offset;
+ this.options = options;
+ this.pluralFn = pluralFn;
+ }
+
+ PluralFormat.prototype.getOption = function (value) {
+ var options = this.options;
+
+ var option = options['=' + value] || options[this.pluralFn(value - this.offset, this.useOrdinal)];
+
+ return option || options.other;
+ };
+
+ function PluralOffsetString(id, offset, numberFormat, string) {
+ this.id = id;
+ this.offset = offset;
+ this.numberFormat = numberFormat;
+ this.string = string;
+ }
+
+ PluralOffsetString.prototype.format = function (value) {
+ var number = this.numberFormat.format(value - this.offset);
+
+ return this.string.replace(/(^|[^\\])#/g, '$1' + number).replace(/\\#/g, '#');
+ };
+
+ function SelectFormat(id, options) {
+ this.id = id;
+ this.options = options;
+ }
+
+ SelectFormat.prototype.getOption = function (value) {
+ var options = this.options;
+ return options[value] || options.other;
+ };
+
+ // -- MessageFormat --------------------------------------------------------
+
+ function MessageFormat(message, locales, formats) {
+ // Parse string messages into an AST.
+ var ast = typeof message === 'string' ? MessageFormat.__parse(message) : message;
+
+ if (!(ast && ast.type === 'messageFormatPattern')) {
+ throw new TypeError('A message must be provided as a String or AST.');
+ }
+
+ // Creates a new object with the specified `formats` merged with the default
+ // formats.
+ formats = this._mergeFormats(MessageFormat.formats, formats);
+
+ // Defined first because it's used to build the format pattern.
+ defineProperty$1(this, '_locale', { value: this._resolveLocale(locales) });
+
+ // Compile the `ast` to a pattern that is highly optimized for repeated
+ // `format()` invocations. **Note:** This passes the `locales` set provided
+ // to the constructor instead of just the resolved locale.
+ var pluralFn = this._findPluralRuleFunction(this._locale);
+ var pattern = this._compilePattern(ast, locales, formats, pluralFn);
+
+ // "Bind" `format()` method to `this` so it can be passed by reference like
+ // the other `Intl` APIs.
+ var messageFormat = this;
+ this.format = function (values) {
+ return messageFormat._format(pattern, values);
+ };
+ }
+
+ // Default format options used as the prototype of the `formats` provided to the
+ // constructor. These are used when constructing the internal Intl.NumberFormat
+ // and Intl.DateTimeFormat instances.
+ defineProperty$1(MessageFormat, 'formats', {
+ enumerable: true,
+
+ value: {
+ number: {
+ 'currency': {
+ style: 'currency'
+ },
+
+ 'percent': {
+ style: 'percent'
+ }
+ },
+
+ date: {
+ 'short': {
+ month: 'numeric',
+ day: 'numeric',
+ year: '2-digit'
+ },
+
+ 'medium': {
+ month: 'short',
+ day: 'numeric',
+ year: 'numeric'
+ },
+
+ 'long': {
+ month: 'long',
+ day: 'numeric',
+ year: 'numeric'
+ },
+
+ 'full': {
+ weekday: 'long',
+ month: 'long',
+ day: 'numeric',
+ year: 'numeric'
+ }
+ },
+
+ time: {
+ 'short': {
+ hour: 'numeric',
+ minute: 'numeric'
+ },
+
+ 'medium': {
+ hour: 'numeric',
+ minute: 'numeric',
+ second: 'numeric'
+ },
+
+ 'long': {
+ hour: 'numeric',
+ minute: 'numeric',
+ second: 'numeric',
+ timeZoneName: 'short'
+ },
+
+ 'full': {
+ hour: 'numeric',
+ minute: 'numeric',
+ second: 'numeric',
+ timeZoneName: 'short'
+ }
+ }
+ }
+ });
+
+ // Define internal private properties for dealing with locale data.
+ defineProperty$1(MessageFormat, '__localeData__', { value: objCreate$1(null) });
+ defineProperty$1(MessageFormat, '__addLocaleData', { value: function value(data) {
+ if (!(data && data.locale)) {
+ throw new Error('Locale data provided to IntlMessageFormat is missing a ' + '`locale` property');
+ }
+
+ MessageFormat.__localeData__[data.locale.toLowerCase()] = data;
+ } });
+
+ // Defines `__parse()` static method as an exposed private.
+ defineProperty$1(MessageFormat, '__parse', { value: parser.parse });
+
+ // Define public `defaultLocale` property which defaults to English, but can be
+ // set by the developer.
+ defineProperty$1(MessageFormat, 'defaultLocale', {
+ enumerable: true,
+ writable: true,
+ value: undefined
+ });
+
+ MessageFormat.prototype.resolvedOptions = function () {
+ // TODO: Provide anything else?
+ return {
+ locale: this._locale
+ };
+ };
+
+ MessageFormat.prototype._compilePattern = function (ast, locales, formats, pluralFn) {
+ var compiler = new Compiler(locales, formats, pluralFn);
+ return compiler.compile(ast);
+ };
+
+ MessageFormat.prototype._findPluralRuleFunction = function (locale) {
+ var localeData = MessageFormat.__localeData__;
+ var data = localeData[locale.toLowerCase()];
+
+ // The locale data is de-duplicated, so we have to traverse the locale's
+ // hierarchy until we find a `pluralRuleFunction` to return.
+ while (data) {
+ if (data.pluralRuleFunction) {
+ return data.pluralRuleFunction;
+ }
+
+ data = data.parentLocale && localeData[data.parentLocale.toLowerCase()];
+ }
+
+ throw new Error('Locale data added to IntlMessageFormat is missing a ' + '`pluralRuleFunction` for :' + locale);
+ };
+
+ MessageFormat.prototype._format = function (pattern, values) {
+ var result = '',
+ i,
+ len,
+ part,
+ id,
+ value;
+
+ for (i = 0, len = pattern.length; i < len; i += 1) {
+ part = pattern[i];
+
+ // Exist early for string parts.
+ if (typeof part === 'string') {
+ result += part;
+ continue;
+ }
+
+ id = part.id;
+
+ // Enforce that all required values are provided by the caller.
+ if (!(values && hop$1.call(values, id))) {
+ throw new Error('A value must be provided for: ' + id);
+ }
+
+ value = values[id];
+
+ // Recursively format plural and select parts' option — which can be a
+ // nested pattern structure. The choosing of the option to use is
+ // abstracted-by and delegated-to the part helper object.
+ if (part.options) {
+ result += this._format(part.getOption(value), values);
+ } else {
+ result += part.format(value);
+ }
+ }
+
+ return result;
+ };
+
+ MessageFormat.prototype._mergeFormats = function (defaults, formats) {
+ var mergedFormats = {},
+ type,
+ mergedType;
+
+ for (type in defaults) {
+ if (!hop$1.call(defaults, type)) {
+ continue;
+ }
+
+ mergedFormats[type] = mergedType = objCreate$1(defaults[type]);
+
+ if (formats && hop$1.call(formats, type)) {
+ extend(mergedType, formats[type]);
+ }
+ }
+
+ return mergedFormats;
+ };
+
+ MessageFormat.prototype._resolveLocale = function (locales) {
+ if (typeof locales === 'string') {
+ locales = [locales];
+ }
+
+ // Create a copy of the array so we can push on the default locale.
+ locales = (locales || []).concat(MessageFormat.defaultLocale);
+
+ var localeData = MessageFormat.__localeData__;
+ var i, len, localeParts, data;
+
+ // Using the set of locales + the default locale, we look for the first one
+ // which that has been registered. When data does not exist for a locale, we
+ // traverse its ancestors to find something that's been registered within
+ // its hierarchy of locales. Since we lack the proper `parentLocale` data
+ // here, we must take a naive approach to traversal.
+ for (i = 0, len = locales.length; i < len; i += 1) {
+ localeParts = locales[i].toLowerCase().split('-');
+
+ while (localeParts.length) {
+ data = localeData[localeParts.join('-')];
+ if (data) {
+ // Return the normalized locale string; e.g., we return "en-US",
+ // instead of "en-us".
+ return data.locale;
+ }
+
+ localeParts.pop();
+ }
+ }
+
+ var defaultLocale = locales.pop();
+ throw new Error('No locale data has been added to IntlMessageFormat for: ' + locales.join(', ') + ', or the default locale: ' + defaultLocale);
+ };
+
+ MessageFormat.__addLocaleData(defaultLocale$1);
+ MessageFormat.defaultLocale = 'en';
+
+ // GENERATED FILE
+ var defaultLocale = { "locale": "en", "pluralRuleFunction": function pluralRuleFunction(n, ord) {
+ var s = String(n).split("."),
+ v0 = !s[1],
+ t0 = Number(s[0]) == n,
+ n10 = t0 && s[0].slice(-1),
+ n100 = t0 && s[0].slice(-2);if (ord) return n10 == 1 && n100 != 11 ? "one" : n10 == 2 && n100 != 12 ? "two" : n10 == 3 && n100 != 13 ? "few" : "other";return n == 1 && v0 ? "one" : "other";
+ }, "fields": { "year": { "displayName": "Year", "relative": { "0": "this year", "1": "next year", "-1": "last year" }, "relativeTime": { "future": { "one": "in {0} year", "other": "in {0} years" }, "past": { "one": "{0} year ago", "other": "{0} years ago" } } }, "month": { "displayName": "Month", "relative": { "0": "this month", "1": "next month", "-1": "last month" }, "relativeTime": { "future": { "one": "in {0} month", "other": "in {0} months" }, "past": { "one": "{0} month ago", "other": "{0} months ago" } } }, "day": { "displayName": "Day", "relative": { "0": "today", "1": "tomorrow", "-1": "yesterday" }, "relativeTime": { "future": { "one": "in {0} day", "other": "in {0} days" }, "past": { "one": "{0} day ago", "other": "{0} days ago" } } }, "hour": { "displayName": "Hour", "relativeTime": { "future": { "one": "in {0} hour", "other": "in {0} hours" }, "past": { "one": "{0} hour ago", "other": "{0} hours ago" } } }, "minute": { "displayName": "Minute", "relativeTime": { "future": { "one": "in {0} minute", "other": "in {0} minutes" }, "past": { "one": "{0} minute ago", "other": "{0} minutes ago" } } }, "second": { "displayName": "Second", "relative": { "0": "now" }, "relativeTime": { "future": { "one": "in {0} second", "other": "in {0} seconds" }, "past": { "one": "{0} second ago", "other": "{0} seconds ago" } } } } };
+
+ // Purposely using the same implementation as the Intl.js `Intl` polyfill.
+ // Copyright 2013 Andy Earnshaw, MIT License
+
+ var hop$2 = Object.prototype.hasOwnProperty;
+ var toString = Object.prototype.toString;
+
+ var realDefineProp$2 = (function () {
+ try {
+ return !!Object.defineProperty({}, 'a', {});
+ } catch (e) {
+ return false;
+ }
+ })();
+
+ var es3$2 = !realDefineProp$2 && !Object.prototype.__defineGetter__;
+
+ var defineProperty$2 = realDefineProp$2 ? Object.defineProperty : function (obj, name, desc) {
+
+ if ('get' in desc && obj.__defineGetter__) {
+ obj.__defineGetter__(name, desc.get);
+ } else if (!hop$2.call(obj, name) || 'value' in desc) {
+ obj[name] = desc.value;
+ }
+ };
+
+ var objCreate$2 = Object.create || function (proto, props) {
+ var obj, k;
+
+ function F() {}
+ F.prototype = proto;
+ obj = new F();
+
+ for (k in props) {
+ if (hop$2.call(props, k)) {
+ defineProperty$2(obj, k, props[k]);
+ }
+ }
+
+ return obj;
+ };
+
+ var arrIndexOf = Array.prototype.indexOf || function (search, fromIndex) {
+ /*jshint validthis:true */
+ var arr = this;
+ if (!arr.length) {
+ return -1;
+ }
+
+ for (var i = fromIndex || 0, max = arr.length; i < max; i++) {
+ if (arr[i] === search) {
+ return i;
+ }
+ }
+
+ return -1;
+ };
+
+ var isArray = Array.isArray || function (obj) {
+ return toString.call(obj) === '[object Array]';
+ };
+
+ var dateNow = Date.now || function () {
+ return new Date().getTime();
+ };
+
+ /*
+ Copyright (c) 2014, Yahoo! Inc. All rights reserved.
+ Copyrights licensed under the New BSD License.
+ See the accompanying LICENSE file for terms.
+ */
+
+ /* jslint esnext: true */
+
+ var round = Math.round;
+
+ function daysToYears(days) {
+ // 400 years have 146097 days (taking into account leap year rules)
+ return days * 400 / 146097;
+ }
+
+ function diff (from, to) {
+ // Convert to ms timestamps.
+ from = +from;
+ to = +to;
+
+ var millisecond = round(to - from),
+ second = round(millisecond / 1000),
+ minute = round(second / 60),
+ hour = round(minute / 60),
+ day = round(hour / 24),
+ week = round(day / 7);
+
+ var rawYears = daysToYears(day),
+ month = round(rawYears * 12),
+ year = round(rawYears);
+
+ return {
+ millisecond: millisecond,
+ second: second,
+ minute: minute,
+ hour: hour,
+ day: day,
+ week: week,
+ month: month,
+ year: year
+ };
+ }
+
+ // -----------------------------------------------------------------------------
+
+ var FIELDS = ['second', 'minute', 'hour', 'day', 'month', 'year'];
+ var STYLES = ['best fit', 'numeric'];
+
+ // -- RelativeFormat -----------------------------------------------------------
+
+ function RelativeFormat(locales, options) {
+ options = options || {};
+
+ // Make a copy of `locales` if it's an array, so that it doesn't change
+ // since it's used lazily.
+ if (isArray(locales)) {
+ locales = locales.concat();
+ }
+
+ defineProperty$2(this, '_locale', { value: this._resolveLocale(locales) });
+ defineProperty$2(this, '_options', { value: {
+ style: this._resolveStyle(options.style),
+ units: this._isValidUnits(options.units) && options.units
+ } });
+
+ defineProperty$2(this, '_locales', { value: locales });
+ defineProperty$2(this, '_fields', { value: this._findFields(this._locale) });
+ defineProperty$2(this, '_messages', { value: objCreate$2(null) });
+
+ // "Bind" `format()` method to `this` so it can be passed by reference like
+ // the other `Intl` APIs.
+ var relativeFormat = this;
+ this.format = function format(date, options) {
+ return relativeFormat._format(date, options);
+ };
+ }
+
+ // Define internal private properties for dealing with locale data.
+ defineProperty$2(RelativeFormat, '__localeData__', { value: objCreate$2(null) });
+ defineProperty$2(RelativeFormat, '__addLocaleData', { value: function value(data) {
+ if (!(data && data.locale)) {
+ throw new Error('Locale data provided to IntlRelativeFormat is missing a ' + '`locale` property value');
+ }
+
+ RelativeFormat.__localeData__[data.locale.toLowerCase()] = data;
+
+ // Add data to IntlMessageFormat.
+ MessageFormat.__addLocaleData(data);
+ } });
+
+ // Define public `defaultLocale` property which can be set by the developer, or
+ // it will be set when the first RelativeFormat instance is created by
+ // leveraging the resolved locale from `Intl`.
+ defineProperty$2(RelativeFormat, 'defaultLocale', {
+ enumerable: true,
+ writable: true,
+ value: undefined
+ });
+
+ // Define public `thresholds` property which can be set by the developer, and
+ // defaults to relative time thresholds from moment.js.
+ defineProperty$2(RelativeFormat, 'thresholds', {
+ enumerable: true,
+
+ value: {
+ second: 45, // seconds to minute
+ minute: 45, // minutes to hour
+ hour: 22, // hours to day
+ day: 26, // days to month
+ month: 11 // months to year
+ }
+ });
+
+ RelativeFormat.prototype.resolvedOptions = function () {
+ return {
+ locale: this._locale,
+ style: this._options.style,
+ units: this._options.units
+ };
+ };
+
+ RelativeFormat.prototype._compileMessage = function (units) {
+ // `this._locales` is the original set of locales the user specified to the
+ // constructor, while `this._locale` is the resolved root locale.
+ var locales = this._locales;
+ var resolvedLocale = this._locale;
+
+ var field = this._fields[units];
+ var relativeTime = field.relativeTime;
+ var future = '';
+ var past = '';
+ var i;
+
+ for (i in relativeTime.future) {
+ if (relativeTime.future.hasOwnProperty(i)) {
+ future += ' ' + i + ' {' + relativeTime.future[i].replace('{0}', '#') + '}';
+ }
+ }
+
+ for (i in relativeTime.past) {
+ if (relativeTime.past.hasOwnProperty(i)) {
+ past += ' ' + i + ' {' + relativeTime.past[i].replace('{0}', '#') + '}';
+ }
+ }
+
+ var message = '{when, select, future {{0, plural, ' + future + '}}' + 'past {{0, plural, ' + past + '}}}';
+
+ // Create the synthetic IntlMessageFormat instance using the original
+ // locales value specified by the user when constructing the the parent
+ // IntlRelativeFormat instance.
+ return new MessageFormat(message, locales);
+ };
+
+ RelativeFormat.prototype._getMessage = function (units) {
+ var messages = this._messages;
+
+ // Create a new synthetic message based on the locale data from CLDR.
+ if (!messages[units]) {
+ messages[units] = this._compileMessage(units);
+ }
+
+ return messages[units];
+ };
+
+ RelativeFormat.prototype._getRelativeUnits = function (diff, units) {
+ var field = this._fields[units];
+
+ if (field.relative) {
+ return field.relative[diff];
+ }
+ };
+
+ RelativeFormat.prototype._findFields = function (locale) {
+ var localeData = RelativeFormat.__localeData__;
+ var data = localeData[locale.toLowerCase()];
+
+ // The locale data is de-duplicated, so we have to traverse the locale's
+ // hierarchy until we find `fields` to return.
+ while (data) {
+ if (data.fields) {
+ return data.fields;
+ }
+
+ data = data.parentLocale && localeData[data.parentLocale.toLowerCase()];
+ }
+
+ throw new Error('Locale data added to IntlRelativeFormat is missing `fields` for :' + locale);
+ };
+
+ RelativeFormat.prototype._format = function (date, options) {
+ var now = options && options.now !== undefined ? options.now : dateNow();
+
+ if (date === undefined) {
+ date = now;
+ }
+
+ // Determine if the `date` and optional `now` values are valid, and throw a
+ // similar error to what `Intl.DateTimeFormat#format()` would throw.
+ if (!isFinite(now)) {
+ throw new RangeError('The `now` option provided to IntlRelativeFormat#format() is not ' + 'in valid range.');
+ }
+
+ if (!isFinite(date)) {
+ throw new RangeError('The date value provided to IntlRelativeFormat#format() is not ' + 'in valid range.');
+ }
+
+ var diffReport = diff(now, date);
+ var units = this._options.units || this._selectUnits(diffReport);
+ var diffInUnits = diffReport[units];
+
+ if (this._options.style !== 'numeric') {
+ var relativeUnits = this._getRelativeUnits(diffInUnits, units);
+ if (relativeUnits) {
+ return relativeUnits;
+ }
+ }
+
+ return this._getMessage(units).format({
+ '0': Math.abs(diffInUnits),
+ when: diffInUnits < 0 ? 'past' : 'future'
+ });
+ };
+
+ RelativeFormat.prototype._isValidUnits = function (units) {
+ if (!units || arrIndexOf.call(FIELDS, units) >= 0) {
+ return true;
+ }
+
+ if (typeof units === 'string') {
+ var suggestion = /s$/.test(units) && units.substr(0, units.length - 1);
+ if (suggestion && arrIndexOf.call(FIELDS, suggestion) >= 0) {
+ throw new Error('"' + units + '" is not a valid IntlRelativeFormat `units` ' + 'value, did you mean: ' + suggestion);
+ }
+ }
+
+ throw new Error('"' + units + '" is not a valid IntlRelativeFormat `units` value, it ' + 'must be one of: "' + FIELDS.join('", "') + '"');
+ };
+
+ RelativeFormat.prototype._resolveLocale = function (locales) {
+ if (typeof locales === 'string') {
+ locales = [locales];
+ }
+
+ // Create a copy of the array so we can push on the default locale.
+ locales = (locales || []).concat(RelativeFormat.defaultLocale);
+
+ var localeData = RelativeFormat.__localeData__;
+ var i, len, localeParts, data;
+
+ // Using the set of locales + the default locale, we look for the first one
+ // which that has been registered. When data does not exist for a locale, we
+ // traverse its ancestors to find something that's been registered within
+ // its hierarchy of locales. Since we lack the proper `parentLocale` data
+ // here, we must take a naive approach to traversal.
+ for (i = 0, len = locales.length; i < len; i += 1) {
+ localeParts = locales[i].toLowerCase().split('-');
+
+ while (localeParts.length) {
+ data = localeData[localeParts.join('-')];
+ if (data) {
+ // Return the normalized locale string; e.g., we return "en-US",
+ // instead of "en-us".
+ return data.locale;
+ }
+
+ localeParts.pop();
+ }
+ }
+
+ var defaultLocale = locales.pop();
+ throw new Error('No locale data has been added to IntlRelativeFormat for: ' + locales.join(', ') + ', or the default locale: ' + defaultLocale);
+ };
+
+ RelativeFormat.prototype._resolveStyle = function (style) {
+ // Default to "best fit" style.
+ if (!style) {
+ return STYLES[0];
+ }
+
+ if (arrIndexOf.call(STYLES, style) >= 0) {
+ return style;
+ }
+
+ throw new Error('"' + style + '" is not a valid IntlRelativeFormat `style` value, it ' + 'must be one of: "' + STYLES.join('", "') + '"');
+ };
+
+ RelativeFormat.prototype._selectUnits = function (diffReport) {
+ var i, l, units;
+
+ for (i = 0, l = FIELDS.length; i < l; i += 1) {
+ units = FIELDS[i];
+
+ if (Math.abs(diffReport[units]) < RelativeFormat.thresholds[units]) {
+ break;
+ }
+ }
+
+ return units;
+ };
+
+ RelativeFormat.__addLocaleData(defaultLocale);
+ RelativeFormat.defaultLocale = 'en';
+
+ function addLocaleData() {
+ var data = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];
+
+ var locales = Array.isArray(data) ? data : [data];
+
+ locales.forEach(function (localeData) {
+ MessageFormat.__addLocaleData(localeData);
+ RelativeFormat.__addLocaleData(localeData);
+ });
+ }
+
+ function hasLocaleData(locale) {
+ var normalizedLocale = locale && locale.toLowerCase();
+
+ return !!(MessageFormat.__localeData__[normalizedLocale] && RelativeFormat.__localeData__[normalizedLocale]);
+ }
+
+ var bool = React.PropTypes.bool;
+ var number = React.PropTypes.number;
+ var string = React.PropTypes.string;
+ var func = React.PropTypes.func;
+ var object = React.PropTypes.object;
+ var oneOf = React.PropTypes.oneOf;
+ var shape = React.PropTypes.shape;
+
+ var intlConfigPropTypes = {
+ locale: string,
+ formats: object,
+ messages: object,
+
+ defaultLocale: string,
+ defaultFormats: object
+ };
+
+ var intlFormatPropTypes = {
+ formatDate: func.isRequired,
+ formatTime: func.isRequired,
+ formatRelative: func.isRequired,
+ formatNumber: func.isRequired,
+ formatPlural: func.isRequired,
+ formatMessage: func.isRequired,
+ formatHTMLMessage: func.isRequired
+ };
+
+ var intlShape = shape(babelHelpers.extends({}, intlConfigPropTypes, intlFormatPropTypes, {
+ now: func.isRequired
+ }));
+
+ var messageDescriptorPropTypes = {
+ id: string.isRequired,
+ description: string,
+ defaultMessage: string
+ };
+
+ var dateTimeFormatPropTypes = {
+ localeMatcher: oneOf(['best fit', 'lookup']),
+ formatMatcher: oneOf(['basic', 'best fit']),
+
+ timeZone: string,
+ hour12: bool,
+
+ weekday: oneOf(['narrow', 'short', 'long']),
+ era: oneOf(['narrow', 'short', 'long']),
+ year: oneOf(['numeric', '2-digit']),
+ month: oneOf(['numeric', '2-digit', 'narrow', 'short', 'long']),
+ day: oneOf(['numeric', '2-digit']),
+ hour: oneOf(['numeric', '2-digit']),
+ minute: oneOf(['numeric', '2-digit']),
+ second: oneOf(['numeric', '2-digit']),
+ timeZoneName: oneOf(['short', 'long'])
+ };
+
+ var numberFormatPropTypes = {
+ localeMatcher: oneOf(['best fit', 'lookup']),
+
+ style: oneOf(['decimal', 'currency', 'percent']),
+ currency: string,
+ currencyDisplay: oneOf(['symbol', 'code', 'name']),
+ useGrouping: bool,
+
+ minimumIntegerDigits: number,
+ minimumFractionDigits: number,
+ maximumFractionDigits: number,
+ minimumSignificantDigits: number,
+ maximumSignificantDigits: number
+ };
+
+ var relativeFormatPropTypes = {
+ style: oneOf(['best fit', 'numeric']),
+ units: oneOf(['second', 'minute', 'hour', 'day', 'month', 'year'])
+ };
+
+ var pluralFormatPropTypes = {
+ style: oneOf(['cardinal', 'ordinal'])
+ };
+
+ var invariant = (function (module) {
+ var exports = module.exports;
+ /**
+ * Copyright 2013-2015, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree. An additional grant
+ * of patent rights can be found in the PATENTS file in the same directory.
+ */
+
+ 'use strict'
+
+ /**
+ * Use invariant() to assert state which your program assumes to be true.
+ *
+ * Provide sprintf-style format (only %s is supported) and arguments
+ * to provide information about what broke and what you were
+ * expecting.
+ *
+ * The invariant message will be stripped in production, but the invariant
+ * will remain to ensure logic does not differ in production.
+ */
+
+ ;
+ var __DEV__ = "development" !== 'production';
+
+ var invariant = function invariant(condition, format, a, b, c, d, e, f) {
+ if (__DEV__) {
+ if (format === undefined) {
+ throw new Error('invariant requires an error message argument');
+ }
+ }
+
+ if (!condition) {
+ var error;
+ if (format === undefined) {
+ error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');
+ } else {
+ var args = [a, b, c, d, e, f];
+ var argIndex = 0;
+ error = new Error(format.replace(/%s/g, function () {
+ return args[argIndex++];
+ }));
+ error.name = 'Invariant Violation';
+ }
+
+ error.framesToPop = 1; // we don't care about invariant's own frame
+ throw error;
+ }
+ };
+
+ module.exports = invariant;
+ return module.exports;
+ })({exports:{}});
+
+ var ESCAPED_CHARS = {
+ '&': '&amp;',
+ '>': '&gt;',
+ '<': '&lt;',
+ '"': '&quot;',
+ '\'': '&#x27;'
+ };
+
+ var UNSAFE_CHARS_REGEX = /[&><"']/g;
+
+ function escape(str) {
+ return ('' + str).replace(UNSAFE_CHARS_REGEX, function (match) {
+ return ESCAPED_CHARS[match];
+ });
+ }
+
+ function invariantIntlContext() {
+ var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
+
+ var intl = _ref.intl;
+
+ invariant(intl, '[React Intl] Could not find required `intl` object. ' + '<IntlProvider> needs to exist in the component ancestry.');
+ }
+
+ function shallowEquals(objA, objB) {
+ if (objA === objB) {
+ return true;
+ }
+
+ if ((typeof objA === 'undefined' ? 'undefined' : babelHelpers.typeof(objA)) !== 'object' || objA === null || (typeof objB === 'undefined' ? 'undefined' : babelHelpers.typeof(objB)) !== 'object' || objB === null) {
+ return false;
+ }
+
+ var keysA = Object.keys(objA);
+ var keysB = Object.keys(objB);
+
+ if (keysA.length !== keysB.length) {
+ return false;
+ }
+
+ // Test for A's keys different from B.
+ var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB);
+ for (var i = 0; i < keysA.length; i++) {
+ if (!bHasOwnProperty(keysA[i]) || objA[keysA[i]] !== objB[keysA[i]]) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ function shouldIntlComponentUpdate(_ref2, nextProps, nextState) {
+ var props = _ref2.props;
+ var state = _ref2.state;
+ var _ref2$context = _ref2.context;
+ var context = _ref2$context === undefined ? {} : _ref2$context;
+ var nextContext = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];
+ var _context$intl = context.intl;
+ var intl = _context$intl === undefined ? {} : _context$intl;
+ var _nextContext$intl = nextContext.intl;
+ var nextIntl = _nextContext$intl === undefined ? {} : _nextContext$intl;
+
+ return !shallowEquals(nextProps, props) || !shallowEquals(nextState, state) || !shallowEquals(nextIntl, intl);
+ }
+
+ function getDisplayName(Component) {
+ return Component.displayName || Component.name || 'Component';
+ }
+
+ function injectIntl(WrappedComponent) {
+ var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
+ var _options$intlPropName = options.intlPropName;
+ var intlPropName = _options$intlPropName === undefined ? 'intl' : _options$intlPropName;
+ var _options$withRef = options.withRef;
+ var withRef = _options$withRef === undefined ? false : _options$withRef;
+
+ var InjectIntl = (function (_Component) {
+ babelHelpers.inherits(InjectIntl, _Component);
+
+ function InjectIntl(props, context) {
+ babelHelpers.classCallCheck(this, InjectIntl);
+
+ var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(InjectIntl).call(this, props, context));
+
+ invariantIntlContext(context);
+ return _this;
+ }
+
+ babelHelpers.createClass(InjectIntl, [{
+ key: 'getWrappedInstance',
+ value: function getWrappedInstance() {
+ invariant(withRef, '[React Intl] To access the wrapped instance, ' + 'the `{withRef: true}` option must be set when calling: ' + '`injectIntl()`');
+
+ return this.refs.wrappedInstance;
+ }
+ }, {
+ key: 'render',
+ value: function render() {
+ return React__default.createElement(WrappedComponent, babelHelpers.extends({}, this.props, babelHelpers.defineProperty({}, intlPropName, this.context.intl), {
+ ref: withRef ? 'wrappedInstance' : null
+ }));
+ }
+ }]);
+ return InjectIntl;
+ })(React.Component);
+
+ InjectIntl.displayName = 'InjectIntl(' + getDisplayName(WrappedComponent) + ')';
+
+ InjectIntl.contextTypes = {
+ intl: intlShape
+ };
+
+ InjectIntl.WrappedComponent = WrappedComponent;
+
+ return InjectIntl;
+ }
+
+ var DATE_TIME_FORMAT_OPTIONS = Object.keys(dateTimeFormatPropTypes);
+ var NUMBER_FORMAT_OPTIONS = Object.keys(numberFormatPropTypes);
+ var RELATIVE_FORMAT_OPTIONS = Object.keys(relativeFormatPropTypes);
+ var PLURAL_FORMAT_OPTIONS = Object.keys(pluralFormatPropTypes);
+
+ function filterFormatOptions(whitelist, obj) {
+ var defaults = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
+
+ return whitelist.reduce(function (opts, name) {
+ if (obj.hasOwnProperty(name)) {
+ opts[name] = obj[name];
+ } else if (defaults.hasOwnProperty(name)) {
+ opts[name] = defaults[name];
+ }
+
+ return opts;
+ }, {});
+ }
+
+ function getNamedFormat(formats, type, name) {
+ var format = formats && formats[type] && formats[type][name];
+ if (format) {
+ return format;
+ }
+
+ if ("development" !== 'production') {
+ console.error('[React Intl] No ' + type + ' format named: ' + name);
+ }
+ }
+
+ function formatDate(config, state, value) {
+ var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];
+ var locale = config.locale;
+ var formats = config.formats;
+ var format = options.format;
+
+ var date = new Date(value);
+ var defaults = format && getNamedFormat(formats, 'date', format);
+
+ var filteredOptions = filterFormatOptions(DATE_TIME_FORMAT_OPTIONS, options, defaults);
+
+ return state.getDateTimeFormat(locale, filteredOptions).format(date);
+ }
+
+ function formatTime(config, state, value) {
+ var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];
+ var locale = config.locale;
+ var formats = config.formats;
+ var format = options.format;
+
+ var date = new Date(value);
+ var defaults = format && getNamedFormat(formats, 'time', format);
+
+ var filteredOptions = filterFormatOptions(DATE_TIME_FORMAT_OPTIONS, options, defaults);
+
+ return state.getDateTimeFormat(locale, filteredOptions).format(date);
+ }
+
+ function formatRelative(config, state, value) {
+ var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];
+ var locale = config.locale;
+ var formats = config.formats;
+ var format = options.format;
+
+ var date = new Date(value);
+ var now = new Date(options.now);
+ var defaults = format && getNamedFormat(formats, 'relative', format);
+
+ var filteredOptions = filterFormatOptions(RELATIVE_FORMAT_OPTIONS, options, defaults);
+
+ return state.getRelativeFormat(locale, filteredOptions).format(date, {
+ now: isFinite(now) ? now : state.now()
+ });
+ }
+
+ function formatNumber(config, state, value) {
+ var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];
+ var locale = config.locale;
+ var formats = config.formats;
+ var format = options.format;
+
+ var defaults = format && getNamedFormat(formats, 'number', format);
+
+ var filteredOptions = filterFormatOptions(NUMBER_FORMAT_OPTIONS, options, defaults);
+
+ return state.getNumberFormat(locale, filteredOptions).format(value);
+ }
+
+ function formatPlural(config, state, value) {
+ var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];
+ var locale = config.locale;
+
+ var filteredOptions = filterFormatOptions(PLURAL_FORMAT_OPTIONS, options);
+
+ return state.getPluralFormat(locale, filteredOptions).format(value);
+ }
+
+ function formatMessage(config, state) {
+ var messageDescriptor = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
+ var values = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];
+ var locale = config.locale;
+ var formats = config.formats;
+ var messages = config.messages;
+ var defaultLocale = config.defaultLocale;
+ var defaultFormats = config.defaultFormats;
+ var id = messageDescriptor.id;
+ var defaultMessage = messageDescriptor.defaultMessage;
+
+ // `id` is a required field of a Message Descriptor.
+
+ invariant(id, '[React Intl] An `id` must be provided to format a message.');
+
+ var message = messages && messages[id];
+ var hasValues = Object.keys(values).length > 0;
+
+ // Avoid expensive message formatting for simple messages without values. In
+ // development messages will always be formatted in case of missing values.
+ if (!hasValues && "development" === 'production') {
+ return message || defaultMessage || id;
+ }
+
+ var formattedMessage = undefined;
+
+ if (message) {
+ try {
+ var formatter = state.getMessageFormat(message, locale, formats);
+
+ formattedMessage = formatter.format(values);
+ } catch (e) {
+ if ("development" !== 'production') {
+ console.error('[React Intl] Error formatting message: "' + id + '" for locale: "' + locale + '"' + (defaultMessage ? ', using default message as fallback.' : '') + ('\n' + e));
+ }
+ }
+ } else {
+ if ("development" !== 'production') {
+ console.error('[React Intl] Missing message: "' + id + '" for locale: "' + locale + '"' + (defaultMessage ? ', using default message as fallback.' : ''));
+ }
+ }
+
+ if (!formattedMessage && defaultMessage) {
+ try {
+ var formatter = state.getMessageFormat(defaultMessage, defaultLocale, defaultFormats);
+
+ formattedMessage = formatter.format(values);
+ } catch (e) {
+ if ("development" !== 'production') {
+ console.error('[React Intl] Error formatting the default message for: "' + id + '"' + ('\n' + e));
+ }
+ }
+ }
+
+ if (!formattedMessage) {
+ if ("development" !== 'production') {
+ console.error('[React Intl] Cannot format message: "' + id + '", ' + ('using message ' + (message || defaultMessage ? 'source' : 'id') + ' as fallback.'));
+ }
+ }
+
+ return formattedMessage || message || defaultMessage || id;
+ }
+
+ function formatHTMLMessage(config, state, messageDescriptor) {
+ var rawValues = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];
+
+ // Process all the values before they are used when formatting the ICU
+ // Message string. Since the formatted message might be injected via
+ // `innerHTML`, all String-based values need to be HTML-escaped.
+ var escapedValues = Object.keys(rawValues).reduce(function (escaped, name) {
+ var value = rawValues[name];
+ escaped[name] = typeof value === 'string' ? escape(value) : value;
+ return escaped;
+ }, {});
+
+ return formatMessage(config, state, messageDescriptor, escapedValues);
+ }
+
+ var format = Object.freeze({
+ formatDate: formatDate,
+ formatTime: formatTime,
+ formatRelative: formatRelative,
+ formatNumber: formatNumber,
+ formatPlural: formatPlural,
+ formatMessage: formatMessage,
+ formatHTMLMessage: formatHTMLMessage
+ });
+
+ /*
+ Copyright (c) 2014, Yahoo! Inc. All rights reserved.
+ Copyrights licensed under the New BSD License.
+ See the accompanying LICENSE file for terms.
+ */
+
+ /* jslint esnext: true */
+
+ // Function.prototype.bind implementation from Mozilla Developer Network:
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Polyfill
+
+ var bind = Function.prototype.bind || function (oThis) {
+ if (typeof this !== 'function') {
+ // closest thing possible to the ECMAScript 5
+ // internal IsCallable function
+ throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
+ }
+
+ var aArgs = Array.prototype.slice.call(arguments, 1),
+ fToBind = this,
+ fNOP = function fNOP() {},
+ fBound = function fBound() {
+ return fToBind.apply(this instanceof fNOP ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments)));
+ };
+
+ if (this.prototype) {
+ // native functions don't have a prototype
+ fNOP.prototype = this.prototype;
+ }
+ fBound.prototype = new fNOP();
+
+ return fBound;
+ };
+
+ // Purposely using the same implementation as the Intl.js `Intl` polyfill.
+ // Copyright 2013 Andy Earnshaw, MIT License
+
+ var hop = Object.prototype.hasOwnProperty;
+
+ var realDefineProp = (function () {
+ try {
+ return !!Object.defineProperty({}, 'a', {});
+ } catch (e) {
+ return false;
+ }
+ })();
+
+ var es3 = !realDefineProp && !Object.prototype.__defineGetter__;
+
+ var defineProperty = realDefineProp ? Object.defineProperty : function (obj, name, desc) {
+
+ if ('get' in desc && obj.__defineGetter__) {
+ obj.__defineGetter__(name, desc.get);
+ } else if (!hop.call(obj, name) || 'value' in desc) {
+ obj[name] = desc.value;
+ }
+ };
+
+ var objCreate = Object.create || function (proto, props) {
+ var obj, k;
+
+ function F() {}
+ F.prototype = proto;
+ obj = new F();
+
+ for (k in props) {
+ if (hop.call(props, k)) {
+ defineProperty(obj, k, props[k]);
+ }
+ }
+
+ return obj;
+ };
+
+ function resolveLocale(locales) {
+ // IntlMessageFormat#_resolveLocale() does not depend on `this`.
+ return MessageFormat.prototype._resolveLocale(locales);
+ }
+
+ function findPluralFunction(locale) {
+ // IntlMessageFormat#_findPluralFunction() does not depend on `this`.
+ return MessageFormat.prototype._findPluralRuleFunction(locale);
+ }
+
+ var IntlPluralFormat = function IntlPluralFormat(locales) {
+ var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
+ babelHelpers.classCallCheck(this, IntlPluralFormat);
+
+ var useOrdinal = options.style === 'ordinal';
+ var pluralFn = findPluralFunction(resolveLocale(locales));
+
+ this.format = function (value) {
+ return pluralFn(value, useOrdinal);
+ };
+ };
+
+ // -----------------------------------------------------------------------------
+
+ function createFormatCache(FormatConstructor) {
+ var cache = objCreate(null);
+
+ return function () {
+ var args = Array.prototype.slice.call(arguments);
+ var cacheId = getCacheId(args);
+ var format = cacheId && cache[cacheId];
+
+ if (!format) {
+ format = new (bind.apply(FormatConstructor, [null].concat(args)))();
+
+ if (cacheId) {
+ cache[cacheId] = format;
+ }
+ }
+
+ return format;
+ };
+ }
+
+ // -- Utilities ----------------------------------------------------------------
+
+ function getCacheId(inputs) {
+ // When JSON is not available in the runtime, we will not create a cache id.
+ if (typeof JSON === 'undefined') {
+ return;
+ }
+
+ var cacheId = [];
+
+ var i, len, input;
+
+ for (i = 0, len = inputs.length; i < len; i += 1) {
+ input = inputs[i];
+
+ if (input && (typeof input === 'undefined' ? 'undefined' : babelHelpers.typeof(input)) === 'object') {
+ cacheId.push(orderedProps(input));
+ } else {
+ cacheId.push(input);
+ }
+ }
+
+ return JSON.stringify(cacheId);
+ }
+
+ function orderedProps(obj) {
+ var props = [],
+ keys = [];
+
+ var key, i, len, prop;
+
+ for (key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ keys.push(key);
+ }
+ }
+
+ var orderedKeys = keys.sort();
+
+ for (i = 0, len = orderedKeys.length; i < len; i += 1) {
+ key = orderedKeys[i];
+ prop = {};
+
+ prop[key] = obj[key];
+ props[i] = prop;
+ }
+
+ return props;
+ }
+
+ var intlConfigPropNames = Object.keys(intlConfigPropTypes);
+ var intlFormatPropNames = Object.keys(intlFormatPropTypes);
+
+ var IntlProvider = (function (_Component) {
+ babelHelpers.inherits(IntlProvider, _Component);
+
+ function IntlProvider(props, context) {
+ babelHelpers.classCallCheck(this, IntlProvider);
+
+ var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(IntlProvider).call(this, props, context));
+
+ invariant(Intl, '[React Intl] The `Intl` APIs must be available in the runtime, ' + 'and do not appear to be built-in. An `Intl` polyfill should be loaded.\n' + 'See: http://formatjs.io/guides/runtime-environments/');
+
+ // Used to stabilize time when performing an initial rendering so that
+ // all relative times use the same reference "now" time.
+ var initialNow = undefined;
+ if (isFinite(props.initialNow)) {
+ initialNow = Number(props.initialNow);
+ } else {
+ // When an `initialNow` isn't provided via `props`, look to see an
+ // <IntlProvider> exists in the ancestry and call its `now()`
+ // function to propagate its value for "now".
+ initialNow = context.intl ? context.intl.now() : Date.now();
+ }
+
+ _this.state = {
+ // Creating `Intl*` formatters is expensive so these format caches
+ // memoize the `Intl*` constructors and have the same lifecycle as
+ // this IntlProvider instance.
+ getDateTimeFormat: createFormatCache(Intl.DateTimeFormat),
+ getNumberFormat: createFormatCache(Intl.NumberFormat),
+ getMessageFormat: createFormatCache(MessageFormat),
+ getRelativeFormat: createFormatCache(RelativeFormat),
+ getPluralFormat: createFormatCache(IntlPluralFormat),
+
+ // Wrapper to provide stable "now" time for initial render.
+ now: function now() {
+ return _this._didDisplay ? Date.now() : initialNow;
+ }
+ };
+ return _this;
+ }
+
+ babelHelpers.createClass(IntlProvider, [{
+ key: 'getConfig',
+ value: function getConfig() {
+ var _this2 = this;
+
+ var _context$intl = this.context.intl;
+ var intlContext = _context$intl === undefined ? {} : _context$intl;
+
+ // Build a whitelisted config object from `props` and `context.intl`, if
+ // an <IntlProvider> exists in the ancestry.
+
+ var config = intlConfigPropNames.reduce(function (config, name) {
+ config[name] = _this2.props[name] || intlContext[name];
+ return config;
+ }, {});
+
+ if (!hasLocaleData(config.locale)) {
+ var _config = config;
+ var locale = _config.locale;
+ var defaultLocale = _config.defaultLocale;
+ var defaultFormats = _config.defaultFormats;
+
+ if ("development" !== 'production') {
+ console.error('[React Intl] Missing locale data for locale: "' + locale + '". ' + ('Using default locale: "' + defaultLocale + '" as fallback.'));
+ }
+
+ // Since there's no registered locale data for `locale`, this will
+ // fallback to the `defaultLocale` to make sure things can render.
+ // The `messages` are overridden to the `defaultProps` empty object
+ // to maintain referential equality across re-renders. It's assumed
+ // each <FormattedMessage> contains a `defaultMessage` prop.
+ config = babelHelpers.extends({}, config, {
+ locale: defaultLocale,
+ formats: defaultFormats,
+ messages: IntlProvider.defaultProps.messages
+ });
+ }
+
+ return config;
+ }
+ }, {
+ key: 'getBoundFormatFns',
+ value: function getBoundFormatFns(config, state) {
+ return intlFormatPropNames.reduce(function (boundFormatFns, name) {
+ boundFormatFns[name] = format[name].bind(null, config, state);
+ return boundFormatFns;
+ }, {});
+ }
+ }, {
+ key: 'getChildContext',
+ value: function getChildContext() {
+ var config = this.getConfig();
+
+ // Bind intl factories and current config to the format functions.
+ var boundFormatFns = this.getBoundFormatFns(config, this.state);
+
+ return {
+ intl: babelHelpers.extends({}, config, boundFormatFns, {
+ now: this.state.now
+ })
+ };
+ }
+ }, {
+ key: 'shouldComponentUpdate',
+ value: function shouldComponentUpdate() {
+ for (var _len = arguments.length, next = Array(_len), _key = 0; _key < _len; _key++) {
+ next[_key] = arguments[_key];
+ }
+
+ return shouldIntlComponentUpdate.apply(undefined, [this].concat(next));
+ }
+ }, {
+ key: 'componentDidMount',
+ value: function componentDidMount() {
+ this._didDisplay = true;
+ }
+ }, {
+ key: 'render',
+ value: function render() {
+ return React.Children.only(this.props.children);
+ }
+ }]);
+ return IntlProvider;
+ })(React.Component);
+
+ IntlProvider.displayName = 'IntlProvider';
+
+ IntlProvider.contextTypes = {
+ intl: intlShape
+ };
+
+ IntlProvider.childContextTypes = {
+ intl: intlShape.isRequired
+ };
+
+ IntlProvider.propTypes = babelHelpers.extends({}, intlConfigPropTypes, {
+ children: React.PropTypes.element.isRequired,
+ initialNow: React.PropTypes.any
+ });
+
+ IntlProvider.defaultProps = {
+ formats: {},
+ messages: {},
+
+ defaultLocale: 'en',
+ defaultFormats: {}
+ };
+
+ var FormattedDate = (function (_Component) {
+ babelHelpers.inherits(FormattedDate, _Component);
+
+ function FormattedDate(props, context) {
+ babelHelpers.classCallCheck(this, FormattedDate);
+
+ var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FormattedDate).call(this, props, context));
+
+ invariantIntlContext(context);
+ return _this;
+ }
+
+ babelHelpers.createClass(FormattedDate, [{
+ key: 'shouldComponentUpdate',
+ value: function shouldComponentUpdate() {
+ for (var _len = arguments.length, next = Array(_len), _key = 0; _key < _len; _key++) {
+ next[_key] = arguments[_key];
+ }
+
+ return shouldIntlComponentUpdate.apply(undefined, [this].concat(next));
+ }
+ }, {
+ key: 'render',
+ value: function render() {
+ var formatDate = this.context.intl.formatDate;
+ var _props = this.props;
+ var value = _props.value;
+ var children = _props.children;
+
+ var formattedDate = formatDate(value, this.props);
+
+ if (typeof children === 'function') {
+ return children(formattedDate);
+ }
+
+ return React__default.createElement(
+ 'span',
+ null,
+ formattedDate
+ );
+ }
+ }]);
+ return FormattedDate;
+ })(React.Component);
+
+ FormattedDate.displayName = 'FormattedDate';
+
+ FormattedDate.contextTypes = {
+ intl: intlShape
+ };
+
+ FormattedDate.propTypes = babelHelpers.extends({}, dateTimeFormatPropTypes, {
+ value: React.PropTypes.any.isRequired,
+ format: React.PropTypes.string,
+ children: React.PropTypes.func
+ });
+
+ var FormattedTime = (function (_Component) {
+ babelHelpers.inherits(FormattedTime, _Component);
+
+ function FormattedTime(props, context) {
+ babelHelpers.classCallCheck(this, FormattedTime);
+
+ var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FormattedTime).call(this, props, context));
+
+ invariantIntlContext(context);
+ return _this;
+ }
+
+ babelHelpers.createClass(FormattedTime, [{
+ key: 'shouldComponentUpdate',
+ value: function shouldComponentUpdate() {
+ for (var _len = arguments.length, next = Array(_len), _key = 0; _key < _len; _key++) {
+ next[_key] = arguments[_key];
+ }
+
+ return shouldIntlComponentUpdate.apply(undefined, [this].concat(next));
+ }
+ }, {
+ key: 'render',
+ value: function render() {
+ var formatTime = this.context.intl.formatTime;
+ var _props = this.props;
+ var value = _props.value;
+ var children = _props.children;
+
+ var formattedTime = formatTime(value, this.props);
+
+ if (typeof children === 'function') {
+ return children(formattedTime);
+ }
+
+ return React__default.createElement(
+ 'span',
+ null,
+ formattedTime
+ );
+ }
+ }]);
+ return FormattedTime;
+ })(React.Component);
+
+ FormattedTime.displayName = 'FormattedTime';
+
+ FormattedTime.contextTypes = {
+ intl: intlShape
+ };
+
+ FormattedTime.propTypes = babelHelpers.extends({}, dateTimeFormatPropTypes, {
+ value: React.PropTypes.any.isRequired,
+ format: React.PropTypes.string,
+ children: React.PropTypes.func
+ });
+
+ var SECOND = 1000;
+ var MINUTE = 1000 * 60;
+ var HOUR = 1000 * 60 * 60;
+ var DAY = 1000 * 60 * 60 * 24;
+
+ // The maximum timer delay value is a 32-bit signed integer.
+ // See: https://mdn.io/setTimeout
+ var MAX_TIMER_DELAY = 2147483647;
+
+ function selectUnits(delta) {
+ var absDelta = Math.abs(delta);
+
+ if (absDelta < MINUTE) {
+ return 'second';
+ }
+
+ if (absDelta < HOUR) {
+ return 'minute';
+ }
+
+ if (absDelta < DAY) {
+ return 'hour';
+ }
+
+ // The maximum scheduled delay will be measured in days since the maximum
+ // timer delay is less than the number of milliseconds in 25 days.
+ return 'day';
+ }
+
+ function getUnitDelay(units) {
+ switch (units) {
+ case 'second':
+ return SECOND;
+ case 'minute':
+ return MINUTE;
+ case 'hour':
+ return HOUR;
+ case 'day':
+ return DAY;
+ default:
+ return MAX_TIMER_DELAY;
+ }
+ }
+
+ var FormattedRelative = (function (_Component) {
+ babelHelpers.inherits(FormattedRelative, _Component);
+
+ function FormattedRelative(props, context) {
+ babelHelpers.classCallCheck(this, FormattedRelative);
+
+ var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FormattedRelative).call(this, props, context));
+
+ invariantIntlContext(context);
+
+ var now = isFinite(props.initialNow) ? Number(props.initialNow) : context.intl.now();
+
+ // `now` is stored as state so that `render()` remains a function of
+ // props + state, instead of accessing `Date.now()` inside `render()`.
+ _this.state = { now: now };
+ return _this;
+ }
+
+ babelHelpers.createClass(FormattedRelative, [{
+ key: 'scheduleNextUpdate',
+ value: function scheduleNextUpdate(props, state) {
+ var _this2 = this;
+
+ var updateInterval = props.updateInterval;
+
+ // If the `updateInterval` is falsy, including `0`, then auto updates
+ // have been turned off, so we bail and skip scheduling an update.
+
+ if (!updateInterval) {
+ return;
+ }
+
+ var delta = Number(props.value) - state.now;
+ var units = props.units || selectUnits(delta);
+
+ var unitDelay = getUnitDelay(units);
+ var unitRemainder = Math.abs(delta % unitDelay);
+
+ // We want the largest possible timer delay which will still display
+ // accurate information while reducing unnecessary re-renders. The delay
+ // should be until the next "interesting" moment, like a tick from
+ // "1 minute ago" to "2 minutes ago" when the delta is 120,000ms.
+ var delay = delta < 0 ? Math.max(updateInterval, unitDelay - unitRemainder) : Math.max(updateInterval, unitRemainder);
+
+ clearTimeout(this._timer);
+
+ this._timer = setTimeout(function () {
+ _this2.setState({ now: _this2.context.intl.now() });
+ }, delay);
+ }
+ }, {
+ key: 'shouldComponentUpdate',
+ value: function shouldComponentUpdate() {
+ for (var _len = arguments.length, next = Array(_len), _key = 0; _key < _len; _key++) {
+ next[_key] = arguments[_key];
+ }
+
+ return shouldIntlComponentUpdate.apply(undefined, [this].concat(next));
+ }
+ }, {
+ key: 'componentWillUpdate',
+ value: function componentWillUpdate(nextProps, nextState) {
+ this.scheduleNextUpdate(nextProps, nextState);
+ }
+ }, {
+ key: 'componentDidMount',
+ value: function componentDidMount() {
+ this.scheduleNextUpdate(this.props, this.state);
+ }
+ }, {
+ key: 'componentWillUnmount',
+ value: function componentWillUnmount() {
+ clearTimeout(this._timer);
+ }
+ }, {
+ key: 'render',
+ value: function render() {
+ var formatRelative = this.context.intl.formatRelative;
+ var _props = this.props;
+ var value = _props.value;
+ var children = _props.children;
+
+ var formattedRelative = formatRelative(value, babelHelpers.extends({}, this.props, this.state));
+
+ if (typeof children === 'function') {
+ return children(formattedRelative);
+ }
+
+ return React__default.createElement(
+ 'span',
+ null,
+ formattedRelative
+ );
+ }
+ }]);
+ return FormattedRelative;
+ })(React.Component);
+
+ FormattedRelative.displayName = 'FormattedRelative';
+
+ FormattedRelative.contextTypes = {
+ intl: intlShape
+ };
+
+ FormattedRelative.propTypes = babelHelpers.extends({}, relativeFormatPropTypes, {
+ value: React.PropTypes.any.isRequired,
+ format: React.PropTypes.string,
+ updateInterval: React.PropTypes.number,
+ initialNow: React.PropTypes.any,
+ children: React.PropTypes.func
+ });
+
+ FormattedRelative.defaultProps = {
+ updateInterval: 1000 * 10
+ };
+
+ var FormattedNumber = (function (_Component) {
+ babelHelpers.inherits(FormattedNumber, _Component);
+
+ function FormattedNumber(props, context) {
+ babelHelpers.classCallCheck(this, FormattedNumber);
+
+ var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FormattedNumber).call(this, props, context));
+
+ invariantIntlContext(context);
+ return _this;
+ }
+
+ babelHelpers.createClass(FormattedNumber, [{
+ key: 'shouldComponentUpdate',
+ value: function shouldComponentUpdate() {
+ for (var _len = arguments.length, next = Array(_len), _key = 0; _key < _len; _key++) {
+ next[_key] = arguments[_key];
+ }
+
+ return shouldIntlComponentUpdate.apply(undefined, [this].concat(next));
+ }
+ }, {
+ key: 'render',
+ value: function render() {
+ var formatNumber = this.context.intl.formatNumber;
+ var _props = this.props;
+ var value = _props.value;
+ var children = _props.children;
+
+ var formattedNumber = formatNumber(value, this.props);
+
+ if (typeof children === 'function') {
+ return children(formattedNumber);
+ }
+
+ return React__default.createElement(
+ 'span',
+ null,
+ formattedNumber
+ );
+ }
+ }]);
+ return FormattedNumber;
+ })(React.Component);
+
+ FormattedNumber.displayName = 'FormattedNumber';
+
+ FormattedNumber.contextTypes = {
+ intl: intlShape
+ };
+
+ FormattedNumber.propTypes = babelHelpers.extends({}, numberFormatPropTypes, {
+ value: React.PropTypes.any.isRequired,
+ format: React.PropTypes.string,
+ children: React.PropTypes.func
+ });
+
+ var FormattedPlural = (function (_Component) {
+ babelHelpers.inherits(FormattedPlural, _Component);
+
+ function FormattedPlural(props, context) {
+ babelHelpers.classCallCheck(this, FormattedPlural);
+
+ var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FormattedPlural).call(this, props, context));
+
+ invariantIntlContext(context);
+ return _this;
+ }
+
+ babelHelpers.createClass(FormattedPlural, [{
+ key: 'shouldComponentUpdate',
+ value: function shouldComponentUpdate() {
+ for (var _len = arguments.length, next = Array(_len), _key = 0; _key < _len; _key++) {
+ next[_key] = arguments[_key];
+ }
+
+ return shouldIntlComponentUpdate.apply(undefined, [this].concat(next));
+ }
+ }, {
+ key: 'render',
+ value: function render() {
+ var formatPlural = this.context.intl.formatPlural;
+ var _props = this.props;
+ var value = _props.value;
+ var other = _props.other;
+ var children = _props.children;
+
+ var pluralCategory = formatPlural(value, this.props);
+ var formattedPlural = this.props[pluralCategory] || other;
+
+ if (typeof children === 'function') {
+ return children(formattedPlural);
+ }
+
+ return React__default.createElement(
+ 'span',
+ null,
+ formattedPlural
+ );
+ }
+ }]);
+ return FormattedPlural;
+ })(React.Component);
+
+ FormattedPlural.displayName = 'FormattedPlural';
+
+ FormattedPlural.contextTypes = {
+ intl: intlShape
+ };
+
+ FormattedPlural.propTypes = babelHelpers.extends({}, pluralFormatPropTypes, {
+ value: React.PropTypes.any.isRequired,
+
+ other: React.PropTypes.node.isRequired,
+ zero: React.PropTypes.node,
+ one: React.PropTypes.node,
+ two: React.PropTypes.node,
+ few: React.PropTypes.node,
+ many: React.PropTypes.node,
+
+ children: React.PropTypes.func
+ });
+
+ FormattedPlural.defaultProps = {
+ style: 'cardinal'
+ };
+
+ var FormattedMessage = (function (_Component) {
+ babelHelpers.inherits(FormattedMessage, _Component);
+
+ function FormattedMessage(props, context) {
+ babelHelpers.classCallCheck(this, FormattedMessage);
+
+ var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FormattedMessage).call(this, props, context));
+
+ invariantIntlContext(context);
+ return _this;
+ }
+
+ babelHelpers.createClass(FormattedMessage, [{
+ key: 'shouldComponentUpdate',
+ value: function shouldComponentUpdate(nextProps) {
+ var values = this.props.values;
+ var nextValues = nextProps.values;
+
+ if (!shallowEquals(nextValues, values)) {
+ return true;
+ }
+
+ // Since `values` has already been checked, we know they're not
+ // different, so the current `values` are carried over so the shallow
+ // equals comparison on the other props isn't affected by the `values`.
+ var nextPropsToCheck = babelHelpers.extends({}, nextProps, {
+ values: values
+ });
+
+ for (var _len = arguments.length, next = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ next[_key - 1] = arguments[_key];
+ }
+
+ return shouldIntlComponentUpdate.apply(undefined, [this, nextPropsToCheck].concat(next));
+ }
+ }, {
+ key: 'render',
+ value: function render() {
+ var formatMessage = this.context.intl.formatMessage;
+ var _props = this.props;
+ var id = _props.id;
+ var description = _props.description;
+ var defaultMessage = _props.defaultMessage;
+ var values = _props.values;
+ var tagName = _props.tagName;
+ var children = _props.children;
+
+ // Creates a token with a random UID that should not be guessable or
+ // conflict with other parts of the `message` string.
+
+ var uid = Math.floor(Math.random() * 0x10000000000).toString(16);
+ var tokenRegexp = new RegExp('(@__ELEMENT-' + uid + '-\\d+__@)', 'g');
+
+ var generateToken = (function () {
+ var counter = 0;
+ return function () {
+ return '@__ELEMENT-' + uid + '-' + (counter += 1) + '__@';
+ };
+ })();
+
+ var tokenizedValues = {};
+ var elements = {};
+
+ // Iterates over the `props` to keep track of any React Element values
+ // so they can be represented by the `token` as a placeholder when the
+ // `message` is formatted. This allows the formatted message to then be
+ // broken-up into parts with references to the React Elements inserted
+ // back in.
+ Object.keys(values).forEach(function (name) {
+ var value = values[name];
+
+ if (React.isValidElement(value)) {
+ var token = generateToken();
+ tokenizedValues[name] = token;
+ elements[token] = value;
+ } else {
+ tokenizedValues[name] = value;
+ }
+ });
+
+ var descriptor = { id: id, description: description, defaultMessage: defaultMessage };
+ var formattedMessage = formatMessage(descriptor, tokenizedValues);
+
+ // Split the message into parts so the React Element values captured
+ // above can be inserted back into the rendered message. This approach
+ // allows messages to render with React Elements while keeping React's
+ // virtual diffing working properly.
+ var nodes = formattedMessage.split(tokenRegexp).filter(function (part) {
+ return !!part;
+ }).map(function (part) {
+ return elements[part] || part;
+ });
+
+ if (typeof children === 'function') {
+ return children.apply(undefined, babelHelpers.toConsumableArray(nodes));
+ }
+
+ return React.createElement.apply(undefined, [tagName, null].concat(babelHelpers.toConsumableArray(nodes)));
+ }
+ }]);
+ return FormattedMessage;
+ })(React.Component);
+
+ FormattedMessage.displayName = 'FormattedMessage';
+
+ FormattedMessage.contextTypes = {
+ intl: intlShape
+ };
+
+ FormattedMessage.propTypes = babelHelpers.extends({}, messageDescriptorPropTypes, {
+ values: React.PropTypes.object,
+ tagName: React.PropTypes.string,
+ children: React.PropTypes.func
+ });
+
+ FormattedMessage.defaultProps = {
+ values: {},
+ tagName: 'span'
+ };
+
+ var FormattedHTMLMessage = (function (_Component) {
+ babelHelpers.inherits(FormattedHTMLMessage, _Component);
+
+ function FormattedHTMLMessage(props, context) {
+ babelHelpers.classCallCheck(this, FormattedHTMLMessage);
+
+ var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FormattedHTMLMessage).call(this, props, context));
+
+ invariantIntlContext(context);
+ return _this;
+ }
+
+ babelHelpers.createClass(FormattedHTMLMessage, [{
+ key: 'shouldComponentUpdate',
+ value: function shouldComponentUpdate(nextProps) {
+ var values = this.props.values;
+ var nextValues = nextProps.values;
+
+ if (!shallowEquals(nextValues, values)) {
+ return true;
+ }
+
+ // Since `values` has already been checked, we know they're not
+ // different, so the current `values` are carried over so the shallow
+ // equals comparison on the other props isn't affected by the `values`.
+ var nextPropsToCheck = babelHelpers.extends({}, nextProps, {
+ values: values
+ });
+
+ for (var _len = arguments.length, next = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ next[_key - 1] = arguments[_key];
+ }
+
+ return shouldIntlComponentUpdate.apply(undefined, [this, nextPropsToCheck].concat(next));
+ }
+ }, {
+ key: 'render',
+ value: function render() {
+ var formatHTMLMessage = this.context.intl.formatHTMLMessage;
+ var _props = this.props;
+ var id = _props.id;
+ var description = _props.description;
+ var defaultMessage = _props.defaultMessage;
+ var rawValues = _props.values;
+ var tagName = _props.tagName;
+ var children = _props.children;
+
+ var descriptor = { id: id, description: description, defaultMessage: defaultMessage };
+ var formattedHTMLMessage = formatHTMLMessage(descriptor, rawValues);
+
+ if (typeof children === 'function') {
+ return children(formattedHTMLMessage);
+ }
+
+ // Since the message presumably has HTML in it, we need to set
+ // `innerHTML` in order for it to be rendered and not escaped by React.
+ // To be safe, all string prop values were escaped when formatting the
+ // message. It is assumed that the message is not UGC, and came from the
+ // developer making it more like a template.
+ //
+ // Note: There's a perf impact of using this component since there's no
+ // way for React to do its virtual DOM diffing.
+ return React.createElement(tagName, {
+ dangerouslySetInnerHTML: {
+ __html: formattedHTMLMessage
+ }
+ });
+ }
+ }]);
+ return FormattedHTMLMessage;
+ })(React.Component);
+
+ FormattedHTMLMessage.displayName = 'FormattedHTMLMessage';
+
+ FormattedHTMLMessage.contextTypes = {
+ intl: intlShape
+ };
+
+ FormattedHTMLMessage.propTypes = babelHelpers.extends({}, messageDescriptorPropTypes, {
+ values: React.PropTypes.object,
+ tagName: React.PropTypes.string,
+ children: React.PropTypes.func
+ });
+
+ FormattedHTMLMessage.defaultProps = {
+ values: {},
+ tagName: 'span'
+ };
+
+ addLocaleData(defaultLocaleData);
+
+ function defineMessages(messageDescriptors) {
+ // This simply returns what's passed-in because it's meant to be a hook for
+ // babel-plugin-react-intl.
+ return messageDescriptors;
+ }
+
+ exports.addLocaleData = addLocaleData;
+ exports.defineMessages = defineMessages;
+ exports.intlShape = intlShape;
+ exports.injectIntl = injectIntl;
+ exports.IntlProvider = IntlProvider;
+ exports.FormattedDate = FormattedDate;
+ exports.FormattedTime = FormattedTime;
+ exports.FormattedRelative = FormattedRelative;
+ exports.FormattedNumber = FormattedNumber;
+ exports.FormattedPlural = FormattedPlural;
+ exports.FormattedMessage = FormattedMessage;
+ exports.FormattedHTMLMessage = FormattedHTMLMessage;
+
+}));
+//# sourceMappingURL=react-intl.js.map \ No newline at end of file