[ Index ] |
PHP Cross Reference of WordPress |
[Summary view] [Print] [Text view]
1 /******/ (function() { // webpackBootstrap 2 /******/ "use strict"; 3 /******/ // The require scope 4 /******/ var __webpack_require__ = {}; 5 /******/ 6 /************************************************************************/ 7 /******/ /* webpack/runtime/define property getters */ 8 /******/ !function() { 9 /******/ // define getter functions for harmony exports 10 /******/ __webpack_require__.d = function(exports, definition) { 11 /******/ for(var key in definition) { 12 /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { 13 /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); 14 /******/ } 15 /******/ } 16 /******/ }; 17 /******/ }(); 18 /******/ 19 /******/ /* webpack/runtime/hasOwnProperty shorthand */ 20 /******/ !function() { 21 /******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } 22 /******/ }(); 23 /******/ 24 /******/ /* webpack/runtime/make namespace object */ 25 /******/ !function() { 26 /******/ // define __esModule on exports 27 /******/ __webpack_require__.r = function(exports) { 28 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 29 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 30 /******/ } 31 /******/ Object.defineProperty(exports, '__esModule', { value: true }); 32 /******/ }; 33 /******/ }(); 34 /******/ 35 /************************************************************************/ 36 var __webpack_exports__ = {}; 37 // ESM COMPAT FLAG 38 __webpack_require__.r(__webpack_exports__); 39 40 // EXPORTS 41 __webpack_require__.d(__webpack_exports__, { 42 "Children": function() { return /* reexport */ external_React_namespaceObject.Children; }, 43 "Component": function() { return /* reexport */ external_React_namespaceObject.Component; }, 44 "Fragment": function() { return /* reexport */ external_React_namespaceObject.Fragment; }, 45 "Platform": function() { return /* reexport */ platform; }, 46 "RawHTML": function() { return /* reexport */ RawHTML; }, 47 "StrictMode": function() { return /* reexport */ external_React_namespaceObject.StrictMode; }, 48 "Suspense": function() { return /* reexport */ external_React_namespaceObject.Suspense; }, 49 "cloneElement": function() { return /* reexport */ external_React_namespaceObject.cloneElement; }, 50 "concatChildren": function() { return /* reexport */ concatChildren; }, 51 "createContext": function() { return /* reexport */ external_React_namespaceObject.createContext; }, 52 "createElement": function() { return /* reexport */ external_React_namespaceObject.createElement; }, 53 "createInterpolateElement": function() { return /* reexport */ create_interpolate_element; }, 54 "createPortal": function() { return /* reexport */ external_ReactDOM_namespaceObject.createPortal; }, 55 "createRef": function() { return /* reexport */ external_React_namespaceObject.createRef; }, 56 "findDOMNode": function() { return /* reexport */ external_ReactDOM_namespaceObject.findDOMNode; }, 57 "forwardRef": function() { return /* reexport */ external_React_namespaceObject.forwardRef; }, 58 "isEmptyElement": function() { return /* reexport */ isEmptyElement; }, 59 "isValidElement": function() { return /* reexport */ external_React_namespaceObject.isValidElement; }, 60 "lazy": function() { return /* reexport */ external_React_namespaceObject.lazy; }, 61 "memo": function() { return /* reexport */ external_React_namespaceObject.memo; }, 62 "render": function() { return /* reexport */ external_ReactDOM_namespaceObject.render; }, 63 "renderToString": function() { return /* reexport */ serialize; }, 64 "switchChildrenNodeName": function() { return /* reexport */ switchChildrenNodeName; }, 65 "unmountComponentAtNode": function() { return /* reexport */ external_ReactDOM_namespaceObject.unmountComponentAtNode; }, 66 "useCallback": function() { return /* reexport */ external_React_namespaceObject.useCallback; }, 67 "useContext": function() { return /* reexport */ external_React_namespaceObject.useContext; }, 68 "useDebugValue": function() { return /* reexport */ external_React_namespaceObject.useDebugValue; }, 69 "useEffect": function() { return /* reexport */ external_React_namespaceObject.useEffect; }, 70 "useImperativeHandle": function() { return /* reexport */ external_React_namespaceObject.useImperativeHandle; }, 71 "useLayoutEffect": function() { return /* reexport */ external_React_namespaceObject.useLayoutEffect; }, 72 "useMemo": function() { return /* reexport */ external_React_namespaceObject.useMemo; }, 73 "useReducer": function() { return /* reexport */ external_React_namespaceObject.useReducer; }, 74 "useRef": function() { return /* reexport */ external_React_namespaceObject.useRef; }, 75 "useState": function() { return /* reexport */ external_React_namespaceObject.useState; } 76 }); 77 78 ;// CONCATENATED MODULE: external "React" 79 var external_React_namespaceObject = window["React"]; 80 ;// CONCATENATED MODULE: ./node_modules/@wordpress/element/build-module/create-interpolate-element.js 81 /** 82 * Internal dependencies 83 */ 84 85 /** @typedef {import('./react').WPElement} WPElement */ 86 87 let indoc, offset, output, stack; 88 /** 89 * Matches tags in the localized string 90 * 91 * This is used for extracting the tag pattern groups for parsing the localized 92 * string and along with the map converting it to a react element. 93 * 94 * There are four references extracted using this tokenizer: 95 * 96 * match: Full match of the tag (i.e. <strong>, </strong>, <br/>) 97 * isClosing: The closing slash, it it exists. 98 * name: The name portion of the tag (strong, br) (if ) 99 * isSelfClosed: The slash on a self closing tag, if it exists. 100 * 101 * @type {RegExp} 102 */ 103 104 const tokenizer = /<(\/)?(\w+)\s*(\/)?>/g; 105 /** 106 * The stack frame tracking parse progress. 107 * 108 * @typedef Frame 109 * 110 * @property {WPElement} element A parent element which may still have 111 * @property {number} tokenStart Offset at which parent element first 112 * appears. 113 * @property {number} tokenLength Length of string marking start of parent 114 * element. 115 * @property {number} [prevOffset] Running offset at which parsing should 116 * continue. 117 * @property {number} [leadingTextStart] Offset at which last closing element 118 * finished, used for finding text between 119 * elements. 120 * @property {WPElement[]} children Children. 121 */ 122 123 /** 124 * Tracks recursive-descent parse state. 125 * 126 * This is a Stack frame holding parent elements until all children have been 127 * parsed. 128 * 129 * @private 130 * @param {WPElement} element A parent element which may still have 131 * nested children not yet parsed. 132 * @param {number} tokenStart Offset at which parent element first 133 * appears. 134 * @param {number} tokenLength Length of string marking start of parent 135 * element. 136 * @param {number} [prevOffset] Running offset at which parsing should 137 * continue. 138 * @param {number} [leadingTextStart] Offset at which last closing element 139 * finished, used for finding text between 140 * elements. 141 * 142 * @return {Frame} The stack frame tracking parse progress. 143 */ 144 145 function createFrame(element, tokenStart, tokenLength, prevOffset, leadingTextStart) { 146 return { 147 element, 148 tokenStart, 149 tokenLength, 150 prevOffset, 151 leadingTextStart, 152 children: [] 153 }; 154 } 155 /** 156 * This function creates an interpolated element from a passed in string with 157 * specific tags matching how the string should be converted to an element via 158 * the conversion map value. 159 * 160 * @example 161 * For example, for the given string: 162 * 163 * "This is a <span>string</span> with <a>a link</a> and a self-closing 164 * <CustomComponentB/> tag" 165 * 166 * You would have something like this as the conversionMap value: 167 * 168 * ```js 169 * { 170 * span: <span />, 171 * a: <a href={ 'https://github.com' } />, 172 * CustomComponentB: <CustomComponent />, 173 * } 174 * ``` 175 * 176 * @param {string} interpolatedString The interpolation string to be parsed. 177 * @param {Object} conversionMap The map used to convert the string to 178 * a react element. 179 * @throws {TypeError} 180 * @return {WPElement} A wp element. 181 */ 182 183 184 const createInterpolateElement = (interpolatedString, conversionMap) => { 185 indoc = interpolatedString; 186 offset = 0; 187 output = []; 188 stack = []; 189 tokenizer.lastIndex = 0; 190 191 if (!isValidConversionMap(conversionMap)) { 192 throw new TypeError('The conversionMap provided is not valid. It must be an object with values that are WPElements'); 193 } 194 195 do {// twiddle our thumbs 196 } while (proceed(conversionMap)); 197 198 return (0,external_React_namespaceObject.createElement)(external_React_namespaceObject.Fragment, null, ...output); 199 }; 200 /** 201 * Validate conversion map. 202 * 203 * A map is considered valid if it's an object and every value in the object 204 * is a WPElement 205 * 206 * @private 207 * 208 * @param {Object} conversionMap The map being validated. 209 * 210 * @return {boolean} True means the map is valid. 211 */ 212 213 214 const isValidConversionMap = conversionMap => { 215 const isObject = typeof conversionMap === 'object'; 216 const values = isObject && Object.values(conversionMap); 217 return isObject && values.length && values.every(element => (0,external_React_namespaceObject.isValidElement)(element)); 218 }; 219 /** 220 * This is the iterator over the matches in the string. 221 * 222 * @private 223 * 224 * @param {Object} conversionMap The conversion map for the string. 225 * 226 * @return {boolean} true for continuing to iterate, false for finished. 227 */ 228 229 230 function proceed(conversionMap) { 231 const next = nextToken(); 232 const [tokenType, name, startOffset, tokenLength] = next; 233 const stackDepth = stack.length; 234 const leadingTextStart = startOffset > offset ? offset : null; 235 236 if (!conversionMap[name]) { 237 addText(); 238 return false; 239 } 240 241 switch (tokenType) { 242 case 'no-more-tokens': 243 if (stackDepth !== 0) { 244 const { 245 leadingTextStart: stackLeadingText, 246 tokenStart 247 } = stack.pop(); 248 output.push(indoc.substr(stackLeadingText, tokenStart)); 249 } 250 251 addText(); 252 return false; 253 254 case 'self-closed': 255 if (0 === stackDepth) { 256 if (null !== leadingTextStart) { 257 output.push(indoc.substr(leadingTextStart, startOffset - leadingTextStart)); 258 } 259 260 output.push(conversionMap[name]); 261 offset = startOffset + tokenLength; 262 return true; 263 } // Otherwise we found an inner element. 264 265 266 addChild(createFrame(conversionMap[name], startOffset, tokenLength)); 267 offset = startOffset + tokenLength; 268 return true; 269 270 case 'opener': 271 stack.push(createFrame(conversionMap[name], startOffset, tokenLength, startOffset + tokenLength, leadingTextStart)); 272 offset = startOffset + tokenLength; 273 return true; 274 275 case 'closer': 276 // If we're not nesting then this is easy - close the block. 277 if (1 === stackDepth) { 278 closeOuterElement(startOffset); 279 offset = startOffset + tokenLength; 280 return true; 281 } // Otherwise we're nested and we have to close out the current 282 // block and add it as a innerBlock to the parent. 283 284 285 const stackTop = stack.pop(); 286 const text = indoc.substr(stackTop.prevOffset, startOffset - stackTop.prevOffset); 287 stackTop.children.push(text); 288 stackTop.prevOffset = startOffset + tokenLength; 289 const frame = createFrame(stackTop.element, stackTop.tokenStart, stackTop.tokenLength, startOffset + tokenLength); 290 frame.children = stackTop.children; 291 addChild(frame); 292 offset = startOffset + tokenLength; 293 return true; 294 295 default: 296 addText(); 297 return false; 298 } 299 } 300 /** 301 * Grabs the next token match in the string and returns it's details. 302 * 303 * @private 304 * 305 * @return {Array} An array of details for the token matched. 306 */ 307 308 309 function nextToken() { 310 const matches = tokenizer.exec(indoc); // We have no more tokens. 311 312 if (null === matches) { 313 return ['no-more-tokens']; 314 } 315 316 const startedAt = matches.index; 317 const [match, isClosing, name, isSelfClosed] = matches; 318 const length = match.length; 319 320 if (isSelfClosed) { 321 return ['self-closed', name, startedAt, length]; 322 } 323 324 if (isClosing) { 325 return ['closer', name, startedAt, length]; 326 } 327 328 return ['opener', name, startedAt, length]; 329 } 330 /** 331 * Pushes text extracted from the indoc string to the output stack given the 332 * current rawLength value and offset (if rawLength is provided ) or the 333 * indoc.length and offset. 334 * 335 * @private 336 */ 337 338 339 function addText() { 340 const length = indoc.length - offset; 341 342 if (0 === length) { 343 return; 344 } 345 346 output.push(indoc.substr(offset, length)); 347 } 348 /** 349 * Pushes a child element to the associated parent element's children for the 350 * parent currently active in the stack. 351 * 352 * @private 353 * 354 * @param {Frame} frame The Frame containing the child element and it's 355 * token information. 356 */ 357 358 359 function addChild(frame) { 360 const { 361 element, 362 tokenStart, 363 tokenLength, 364 prevOffset, 365 children 366 } = frame; 367 const parent = stack[stack.length - 1]; 368 const text = indoc.substr(parent.prevOffset, tokenStart - parent.prevOffset); 369 370 if (text) { 371 parent.children.push(text); 372 } 373 374 parent.children.push((0,external_React_namespaceObject.cloneElement)(element, null, ...children)); 375 parent.prevOffset = prevOffset ? prevOffset : tokenStart + tokenLength; 376 } 377 /** 378 * This is called for closing tags. It creates the element currently active in 379 * the stack. 380 * 381 * @private 382 * 383 * @param {number} endOffset Offset at which the closing tag for the element 384 * begins in the string. If this is greater than the 385 * prevOffset attached to the element, then this 386 * helps capture any remaining nested text nodes in 387 * the element. 388 */ 389 390 391 function closeOuterElement(endOffset) { 392 const { 393 element, 394 leadingTextStart, 395 prevOffset, 396 tokenStart, 397 children 398 } = stack.pop(); 399 const text = endOffset ? indoc.substr(prevOffset, endOffset - prevOffset) : indoc.substr(prevOffset); 400 401 if (text) { 402 children.push(text); 403 } 404 405 if (null !== leadingTextStart) { 406 output.push(indoc.substr(leadingTextStart, tokenStart - leadingTextStart)); 407 } 408 409 output.push((0,external_React_namespaceObject.cloneElement)(element, null, ...children)); 410 } 411 412 /* harmony default export */ var create_interpolate_element = (createInterpolateElement); 413 414 ;// CONCATENATED MODULE: external "lodash" 415 var external_lodash_namespaceObject = window["lodash"]; 416 ;// CONCATENATED MODULE: ./node_modules/@wordpress/element/build-module/react.js 417 /** 418 * External dependencies 419 */ 420 // eslint-disable-next-line @typescript-eslint/no-restricted-imports 421 422 423 /** 424 * Object containing a React element. 425 * 426 * @typedef {import('react').ReactElement} WPElement 427 */ 428 429 /** 430 * Object containing a React component. 431 * 432 * @typedef {import('react').ComponentType} WPComponent 433 */ 434 435 /** 436 * Object containing a React synthetic event. 437 * 438 * @typedef {import('react').SyntheticEvent} WPSyntheticEvent 439 */ 440 441 /** 442 * Object that provides utilities for dealing with React children. 443 */ 444 445 446 /** 447 * Creates a copy of an element with extended props. 448 * 449 * @param {WPElement} element Element 450 * @param {?Object} props Props to apply to cloned element 451 * 452 * @return {WPElement} Cloned element. 453 */ 454 455 456 /** 457 * A base class to create WordPress Components (Refs, state and lifecycle hooks) 458 */ 459 460 461 /** 462 * Creates a context object containing two components: a provider and consumer. 463 * 464 * @param {Object} defaultValue A default data stored in the context. 465 * 466 * @return {Object} Context object. 467 */ 468 469 470 /** 471 * Returns a new element of given type. Type can be either a string tag name or 472 * another function which itself returns an element. 473 * 474 * @param {?(string|Function)} type Tag name or element creator 475 * @param {Object} props Element properties, either attribute 476 * set to apply to DOM node or values to 477 * pass through to element creator 478 * @param {...WPElement} children Descendant elements 479 * 480 * @return {WPElement} Element. 481 */ 482 483 484 /** 485 * Returns an object tracking a reference to a rendered element via its 486 * `current` property as either a DOMElement or Element, dependent upon the 487 * type of element rendered with the ref attribute. 488 * 489 * @return {Object} Ref object. 490 */ 491 492 493 /** 494 * Component enhancer used to enable passing a ref to its wrapped component. 495 * Pass a function argument which receives `props` and `ref` as its arguments, 496 * returning an element using the forwarded ref. The return value is a new 497 * component which forwards its ref. 498 * 499 * @param {Function} forwarder Function passed `props` and `ref`, expected to 500 * return an element. 501 * 502 * @return {WPComponent} Enhanced component. 503 */ 504 505 506 /** 507 * A component which renders its children without any wrapping element. 508 */ 509 510 511 /** 512 * Checks if an object is a valid WPElement. 513 * 514 * @param {Object} objectToCheck The object to be checked. 515 * 516 * @return {boolean} true if objectToTest is a valid WPElement and false otherwise. 517 */ 518 519 520 /** 521 * @see https://reactjs.org/docs/react-api.html#reactmemo 522 */ 523 524 525 /** 526 * Component that activates additional checks and warnings for its descendants. 527 */ 528 529 530 /** 531 * @see https://reactjs.org/docs/hooks-reference.html#usecallback 532 */ 533 534 535 /** 536 * @see https://reactjs.org/docs/hooks-reference.html#usecontext 537 */ 538 539 540 /** 541 * @see https://reactjs.org/docs/hooks-reference.html#usedebugvalue 542 */ 543 544 545 /** 546 * @see https://reactjs.org/docs/hooks-reference.html#useeffect 547 */ 548 549 550 /** 551 * @see https://reactjs.org/docs/hooks-reference.html#useimperativehandle 552 */ 553 554 555 /** 556 * @see https://reactjs.org/docs/hooks-reference.html#uselayouteffect 557 */ 558 559 560 /** 561 * @see https://reactjs.org/docs/hooks-reference.html#usememo 562 */ 563 564 565 /** 566 * @see https://reactjs.org/docs/hooks-reference.html#usereducer 567 */ 568 569 570 /** 571 * @see https://reactjs.org/docs/hooks-reference.html#useref 572 */ 573 574 575 /** 576 * @see https://reactjs.org/docs/hooks-reference.html#usestate 577 */ 578 579 580 /** 581 * @see https://reactjs.org/docs/react-api.html#reactlazy 582 */ 583 584 585 /** 586 * @see https://reactjs.org/docs/react-api.html#reactsuspense 587 */ 588 589 590 /** 591 * Concatenate two or more React children objects. 592 * 593 * @param {...?Object} childrenArguments Array of children arguments (array of arrays/strings/objects) to concatenate. 594 * 595 * @return {Array} The concatenated value. 596 */ 597 598 function concatChildren() { 599 for (var _len = arguments.length, childrenArguments = new Array(_len), _key = 0; _key < _len; _key++) { 600 childrenArguments[_key] = arguments[_key]; 601 } 602 603 return childrenArguments.reduce((accumulator, children, i) => { 604 external_React_namespaceObject.Children.forEach(children, (child, j) => { 605 if (child && 'string' !== typeof child) { 606 child = (0,external_React_namespaceObject.cloneElement)(child, { 607 key: [i, j].join() 608 }); 609 } 610 611 accumulator.push(child); 612 }); 613 return accumulator; 614 }, []); 615 } 616 /** 617 * Switches the nodeName of all the elements in the children object. 618 * 619 * @param {?Object} children Children object. 620 * @param {string} nodeName Node name. 621 * 622 * @return {?Object} The updated children object. 623 */ 624 625 function switchChildrenNodeName(children, nodeName) { 626 return children && external_React_namespaceObject.Children.map(children, (elt, index) => { 627 if ((0,external_lodash_namespaceObject.isString)(elt)) { 628 return (0,external_React_namespaceObject.createElement)(nodeName, { 629 key: index 630 }, elt); 631 } 632 633 const { 634 children: childrenProp, 635 ...props 636 } = elt.props; 637 return (0,external_React_namespaceObject.createElement)(nodeName, { 638 key: index, 639 ...props 640 }, childrenProp); 641 }); 642 } 643 644 ;// CONCATENATED MODULE: external "ReactDOM" 645 var external_ReactDOM_namespaceObject = window["ReactDOM"]; 646 ;// CONCATENATED MODULE: ./node_modules/@wordpress/element/build-module/react-platform.js 647 /** 648 * External dependencies 649 */ 650 651 /** 652 * Creates a portal into which a component can be rendered. 653 * 654 * @see https://github.com/facebook/react/issues/10309#issuecomment-318433235 655 * 656 * @param {import('./react').WPElement} child Any renderable child, such as an element, 657 * string, or fragment. 658 * @param {HTMLElement} container DOM node into which element should be rendered. 659 */ 660 661 662 /** 663 * Finds the dom node of a React component. 664 * 665 * @param {import('./react').WPComponent} component Component's instance. 666 */ 667 668 669 /** 670 * Renders a given element into the target DOM node. 671 * 672 * @param {import('./react').WPElement} element Element to render. 673 * @param {HTMLElement} target DOM node into which element should be rendered. 674 */ 675 676 677 /** 678 * Removes any mounted element from the target DOM node. 679 * 680 * @param {Element} target DOM node in which element is to be removed 681 */ 682 683 684 685 ;// CONCATENATED MODULE: ./node_modules/@wordpress/element/build-module/utils.js 686 /** 687 * External dependencies 688 */ 689 690 /** 691 * Checks if the provided WP element is empty. 692 * 693 * @param {*} element WP element to check. 694 * @return {boolean} True when an element is considered empty. 695 */ 696 697 const isEmptyElement = element => { 698 if ((0,external_lodash_namespaceObject.isNumber)(element)) { 699 return false; 700 } 701 702 if ((0,external_lodash_namespaceObject.isString)(element) || (0,external_lodash_namespaceObject.isArray)(element)) { 703 return !element.length; 704 } 705 706 return !element; 707 }; 708 709 ;// CONCATENATED MODULE: ./node_modules/@wordpress/element/build-module/platform.js 710 /** 711 * Parts of this source were derived and modified from react-native-web, 712 * released under the MIT license. 713 * 714 * Copyright (c) 2016-present, Nicolas Gallagher. 715 * Copyright (c) 2015-present, Facebook, Inc. 716 * 717 */ 718 const Platform = { 719 OS: 'web', 720 select: spec => 'web' in spec ? spec.web : spec.default, 721 isWeb: true 722 }; 723 /** 724 * Component used to detect the current Platform being used. 725 * Use Platform.OS === 'web' to detect if running on web enviroment. 726 * 727 * This is the same concept as the React Native implementation. 728 * 729 * @see https://facebook.github.io/react-native/docs/platform-specific-code#platform-module 730 * 731 * Here is an example of how to use the select method: 732 * @example 733 * ```js 734 * import { Platform } from '@wordpress/element'; 735 * 736 * const placeholderLabel = Platform.select( { 737 * native: __( 'Add media' ), 738 * web: __( 'Drag images, upload new ones or select files from your library.' ), 739 * } ); 740 * ``` 741 */ 742 743 /* harmony default export */ var platform = (Platform); 744 745 ;// CONCATENATED MODULE: external ["wp","escapeHtml"] 746 var external_wp_escapeHtml_namespaceObject = window["wp"]["escapeHtml"]; 747 ;// CONCATENATED MODULE: ./node_modules/@wordpress/element/build-module/raw-html.js 748 /** 749 * Internal dependencies 750 */ 751 // Disable reason: JSDoc linter doesn't seem to parse the union (`&`) correctly. 752 753 /** @typedef {{children: string} & import('react').ComponentPropsWithoutRef<'div'>} RawHTMLProps */ 754 755 /** 756 * Component used as equivalent of Fragment with unescaped HTML, in cases where 757 * it is desirable to render dangerous HTML without needing a wrapper element. 758 * To preserve additional props, a `div` wrapper _will_ be created if any props 759 * aside from `children` are passed. 760 * 761 * @param {RawHTMLProps} props Children should be a string of HTML or an array 762 * of strings. Other props will be passed through 763 * to the div wrapper. 764 * 765 * @return {JSX.Element} Dangerously-rendering component. 766 */ 767 768 function RawHTML(_ref) { 769 let { 770 children, 771 ...props 772 } = _ref; 773 let rawHtml = ''; // Cast children as an array, and concatenate each element if it is a string. 774 775 external_React_namespaceObject.Children.toArray(children).forEach(child => { 776 if (typeof child === 'string' && child.trim() !== '') { 777 rawHtml += child; 778 } 779 }); // The `div` wrapper will be stripped by the `renderElement` serializer in 780 // `./serialize.js` unless there are non-children props present. 781 782 return (0,external_React_namespaceObject.createElement)('div', { 783 dangerouslySetInnerHTML: { 784 __html: rawHtml 785 }, 786 ...props 787 }); 788 } 789 790 ;// CONCATENATED MODULE: ./node_modules/@wordpress/element/build-module/serialize.js 791 /** 792 * Parts of this source were derived and modified from fast-react-render, 793 * released under the MIT license. 794 * 795 * https://github.com/alt-j/fast-react-render 796 * 797 * Copyright (c) 2016 Andrey Morozov 798 * 799 * Permission is hereby granted, free of charge, to any person obtaining a copy 800 * of this software and associated documentation files (the "Software"), to deal 801 * in the Software without restriction, including without limitation the rights 802 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 803 * copies of the Software, and to permit persons to whom the Software is 804 * furnished to do so, subject to the following conditions: 805 * 806 * The above copyright notice and this permission notice shall be included in 807 * all copies or substantial portions of the Software. 808 * 809 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 810 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 811 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 812 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 813 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 814 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 815 * THE SOFTWARE. 816 */ 817 818 /** 819 * External dependencies 820 */ 821 822 /** 823 * WordPress dependencies 824 */ 825 826 827 /** 828 * Internal dependencies 829 */ 830 831 832 833 /** @typedef {import('./react').WPElement} WPElement */ 834 835 const { 836 Provider, 837 Consumer 838 } = (0,external_React_namespaceObject.createContext)(undefined); 839 const ForwardRef = (0,external_React_namespaceObject.forwardRef)(() => { 840 return null; 841 }); 842 /** 843 * Valid attribute types. 844 * 845 * @type {Set<string>} 846 */ 847 848 const ATTRIBUTES_TYPES = new Set(['string', 'boolean', 'number']); 849 /** 850 * Element tags which can be self-closing. 851 * 852 * @type {Set<string>} 853 */ 854 855 const SELF_CLOSING_TAGS = new Set(['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr']); 856 /** 857 * Boolean attributes are attributes whose presence as being assigned is 858 * meaningful, even if only empty. 859 * 860 * See: https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#boolean-attributes 861 * Extracted from: https://html.spec.whatwg.org/multipage/indices.html#attributes-3 862 * 863 * Object.keys( [ ...document.querySelectorAll( '#attributes-1 > tbody > tr' ) ] 864 * .filter( ( tr ) => tr.lastChild.textContent.indexOf( 'Boolean attribute' ) !== -1 ) 865 * .reduce( ( result, tr ) => Object.assign( result, { 866 * [ tr.firstChild.textContent.trim() ]: true 867 * } ), {} ) ).sort(); 868 * 869 * @type {Set<string>} 870 */ 871 872 const BOOLEAN_ATTRIBUTES = new Set(['allowfullscreen', 'allowpaymentrequest', 'allowusermedia', 'async', 'autofocus', 'autoplay', 'checked', 'controls', 'default', 'defer', 'disabled', 'download', 'formnovalidate', 'hidden', 'ismap', 'itemscope', 'loop', 'multiple', 'muted', 'nomodule', 'novalidate', 'open', 'playsinline', 'readonly', 'required', 'reversed', 'selected', 'typemustmatch']); 873 /** 874 * Enumerated attributes are attributes which must be of a specific value form. 875 * Like boolean attributes, these are meaningful if specified, even if not of a 876 * valid enumerated value. 877 * 878 * See: https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#enumerated-attribute 879 * Extracted from: https://html.spec.whatwg.org/multipage/indices.html#attributes-3 880 * 881 * Object.keys( [ ...document.querySelectorAll( '#attributes-1 > tbody > tr' ) ] 882 * .filter( ( tr ) => /^("(.+?)";?\s*)+/.test( tr.lastChild.textContent.trim() ) ) 883 * .reduce( ( result, tr ) => Object.assign( result, { 884 * [ tr.firstChild.textContent.trim() ]: true 885 * } ), {} ) ).sort(); 886 * 887 * Some notable omissions: 888 * 889 * - `alt`: https://blog.whatwg.org/omit-alt 890 * 891 * @type {Set<string>} 892 */ 893 894 const ENUMERATED_ATTRIBUTES = new Set(['autocapitalize', 'autocomplete', 'charset', 'contenteditable', 'crossorigin', 'decoding', 'dir', 'draggable', 'enctype', 'formenctype', 'formmethod', 'http-equiv', 'inputmode', 'kind', 'method', 'preload', 'scope', 'shape', 'spellcheck', 'translate', 'type', 'wrap']); 895 /** 896 * Set of CSS style properties which support assignment of unitless numbers. 897 * Used in rendering of style properties, where `px` unit is assumed unless 898 * property is included in this set or value is zero. 899 * 900 * Generated via: 901 * 902 * Object.entries( document.createElement( 'div' ).style ) 903 * .filter( ( [ key ] ) => ( 904 * ! /^(webkit|ms|moz)/.test( key ) && 905 * ( e.style[ key ] = 10 ) && 906 * e.style[ key ] === '10' 907 * ) ) 908 * .map( ( [ key ] ) => key ) 909 * .sort(); 910 * 911 * @type {Set<string>} 912 */ 913 914 const CSS_PROPERTIES_SUPPORTS_UNITLESS = new Set(['animation', 'animationIterationCount', 'baselineShift', 'borderImageOutset', 'borderImageSlice', 'borderImageWidth', 'columnCount', 'cx', 'cy', 'fillOpacity', 'flexGrow', 'flexShrink', 'floodOpacity', 'fontWeight', 'gridColumnEnd', 'gridColumnStart', 'gridRowEnd', 'gridRowStart', 'lineHeight', 'opacity', 'order', 'orphans', 'r', 'rx', 'ry', 'shapeImageThreshold', 'stopOpacity', 'strokeDasharray', 'strokeDashoffset', 'strokeMiterlimit', 'strokeOpacity', 'strokeWidth', 'tabSize', 'widows', 'x', 'y', 'zIndex', 'zoom']); 915 /** 916 * Returns true if the specified string is prefixed by one of an array of 917 * possible prefixes. 918 * 919 * @param {string} string String to check. 920 * @param {string[]} prefixes Possible prefixes. 921 * 922 * @return {boolean} Whether string has prefix. 923 */ 924 925 function hasPrefix(string, prefixes) { 926 return prefixes.some(prefix => string.indexOf(prefix) === 0); 927 } 928 /** 929 * Returns true if the given prop name should be ignored in attributes 930 * serialization, or false otherwise. 931 * 932 * @param {string} attribute Attribute to check. 933 * 934 * @return {boolean} Whether attribute should be ignored. 935 */ 936 937 function isInternalAttribute(attribute) { 938 return 'key' === attribute || 'children' === attribute; 939 } 940 /** 941 * Returns the normal form of the element's attribute value for HTML. 942 * 943 * @param {string} attribute Attribute name. 944 * @param {*} value Non-normalized attribute value. 945 * 946 * @return {*} Normalized attribute value. 947 */ 948 949 950 function getNormalAttributeValue(attribute, value) { 951 switch (attribute) { 952 case 'style': 953 return renderStyle(value); 954 } 955 956 return value; 957 } 958 /** 959 * This is a map of all SVG attributes that have dashes. Map(lower case prop => dashed lower case attribute). 960 * We need this to render e.g strokeWidth as stroke-width. 961 * 962 * List from: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute. 963 */ 964 965 966 const SVG_ATTRIBUTE_WITH_DASHES_LIST = ['accentHeight', 'alignmentBaseline', 'arabicForm', 'baselineShift', 'capHeight', 'clipPath', 'clipRule', 'colorInterpolation', 'colorInterpolationFilters', 'colorProfile', 'colorRendering', 'dominantBaseline', 'enableBackground', 'fillOpacity', 'fillRule', 'floodColor', 'floodOpacity', 'fontFamily', 'fontSize', 'fontSizeAdjust', 'fontStretch', 'fontStyle', 'fontVariant', 'fontWeight', 'glyphName', 'glyphOrientationHorizontal', 'glyphOrientationVertical', 'horizAdvX', 'horizOriginX', 'imageRendering', 'letterSpacing', 'lightingColor', 'markerEnd', 'markerMid', 'markerStart', 'overlinePosition', 'overlineThickness', 'paintOrder', 'panose1', 'pointerEvents', 'renderingIntent', 'shapeRendering', 'stopColor', 'stopOpacity', 'strikethroughPosition', 'strikethroughThickness', 'strokeDasharray', 'strokeDashoffset', 'strokeLinecap', 'strokeLinejoin', 'strokeMiterlimit', 'strokeOpacity', 'strokeWidth', 'textAnchor', 'textDecoration', 'textRendering', 'underlinePosition', 'underlineThickness', 'unicodeBidi', 'unicodeRange', 'unitsPerEm', 'vAlphabetic', 'vHanging', 'vIdeographic', 'vMathematical', 'vectorEffect', 'vertAdvY', 'vertOriginX', 'vertOriginY', 'wordSpacing', 'writingMode', 'xmlnsXlink', 'xHeight'].reduce((map, attribute) => { 967 // The keys are lower-cased for more robust lookup. 968 map[attribute.toLowerCase()] = attribute; 969 return map; 970 }, {}); 971 /** 972 * This is a map of all case-sensitive SVG attributes. Map(lowercase key => proper case attribute). 973 * The keys are lower-cased for more robust lookup. 974 * Note that this list only contains attributes that contain at least one capital letter. 975 * Lowercase attributes don't need mapping, since we lowercase all attributes by default. 976 */ 977 978 const CASE_SENSITIVE_SVG_ATTRIBUTES = ['allowReorder', 'attributeName', 'attributeType', 'autoReverse', 'baseFrequency', 'baseProfile', 'calcMode', 'clipPathUnits', 'contentScriptType', 'contentStyleType', 'diffuseConstant', 'edgeMode', 'externalResourcesRequired', 'filterRes', 'filterUnits', 'glyphRef', 'gradientTransform', 'gradientUnits', 'kernelMatrix', 'kernelUnitLength', 'keyPoints', 'keySplines', 'keyTimes', 'lengthAdjust', 'limitingConeAngle', 'markerHeight', 'markerUnits', 'markerWidth', 'maskContentUnits', 'maskUnits', 'numOctaves', 'pathLength', 'patternContentUnits', 'patternTransform', 'patternUnits', 'pointsAtX', 'pointsAtY', 'pointsAtZ', 'preserveAlpha', 'preserveAspectRatio', 'primitiveUnits', 'refX', 'refY', 'repeatCount', 'repeatDur', 'requiredExtensions', 'requiredFeatures', 'specularConstant', 'specularExponent', 'spreadMethod', 'startOffset', 'stdDeviation', 'stitchTiles', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'surfaceScale', 'systemLanguage', 'tableValues', 'targetX', 'targetY', 'textLength', 'viewBox', 'viewTarget', 'xChannelSelector', 'yChannelSelector'].reduce((map, attribute) => { 979 // The keys are lower-cased for more robust lookup. 980 map[attribute.toLowerCase()] = attribute; 981 return map; 982 }, {}); 983 /** 984 * This is a map of all SVG attributes that have colons. 985 * Keys are lower-cased and stripped of their colons for more robust lookup. 986 */ 987 988 const SVG_ATTRIBUTES_WITH_COLONS = ['xlink:actuate', 'xlink:arcrole', 'xlink:href', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type', 'xml:base', 'xml:lang', 'xml:space', 'xmlns:xlink'].reduce((map, attribute) => { 989 map[attribute.replace(':', '').toLowerCase()] = attribute; 990 return map; 991 }, {}); 992 /** 993 * Returns the normal form of the element's attribute name for HTML. 994 * 995 * @param {string} attribute Non-normalized attribute name. 996 * 997 * @return {string} Normalized attribute name. 998 */ 999 1000 function getNormalAttributeName(attribute) { 1001 switch (attribute) { 1002 case 'htmlFor': 1003 return 'for'; 1004 1005 case 'className': 1006 return 'class'; 1007 } 1008 1009 const attributeLowerCase = attribute.toLowerCase(); 1010 1011 if (CASE_SENSITIVE_SVG_ATTRIBUTES[attributeLowerCase]) { 1012 return CASE_SENSITIVE_SVG_ATTRIBUTES[attributeLowerCase]; 1013 } else if (SVG_ATTRIBUTE_WITH_DASHES_LIST[attributeLowerCase]) { 1014 return (0,external_lodash_namespaceObject.kebabCase)(SVG_ATTRIBUTE_WITH_DASHES_LIST[attributeLowerCase]); 1015 } else if (SVG_ATTRIBUTES_WITH_COLONS[attributeLowerCase]) { 1016 return SVG_ATTRIBUTES_WITH_COLONS[attributeLowerCase]; 1017 } 1018 1019 return attributeLowerCase; 1020 } 1021 /** 1022 * Returns the normal form of the style property name for HTML. 1023 * 1024 * - Converts property names to kebab-case, e.g. 'backgroundColor' → 'background-color' 1025 * - Leaves custom attributes alone, e.g. '--myBackgroundColor' → '--myBackgroundColor' 1026 * - Converts vendor-prefixed property names to -kebab-case, e.g. 'MozTransform' → '-moz-transform' 1027 * 1028 * @param {string} property Property name. 1029 * 1030 * @return {string} Normalized property name. 1031 */ 1032 1033 1034 function getNormalStylePropertyName(property) { 1035 if ((0,external_lodash_namespaceObject.startsWith)(property, '--')) { 1036 return property; 1037 } 1038 1039 if (hasPrefix(property, ['ms', 'O', 'Moz', 'Webkit'])) { 1040 return '-' + (0,external_lodash_namespaceObject.kebabCase)(property); 1041 } 1042 1043 return (0,external_lodash_namespaceObject.kebabCase)(property); 1044 } 1045 /** 1046 * Returns the normal form of the style property value for HTML. Appends a 1047 * default pixel unit if numeric, not a unitless property, and not zero. 1048 * 1049 * @param {string} property Property name. 1050 * @param {*} value Non-normalized property value. 1051 * 1052 * @return {*} Normalized property value. 1053 */ 1054 1055 1056 function getNormalStylePropertyValue(property, value) { 1057 if (typeof value === 'number' && 0 !== value && !CSS_PROPERTIES_SUPPORTS_UNITLESS.has(property)) { 1058 return value + 'px'; 1059 } 1060 1061 return value; 1062 } 1063 /** 1064 * Serializes a React element to string. 1065 * 1066 * @param {import('react').ReactNode} element Element to serialize. 1067 * @param {Object} [context] Context object. 1068 * @param {Object} [legacyContext] Legacy context object. 1069 * 1070 * @return {string} Serialized element. 1071 */ 1072 1073 1074 function renderElement(element, context) { 1075 let legacyContext = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; 1076 1077 if (null === element || undefined === element || false === element) { 1078 return ''; 1079 } 1080 1081 if (Array.isArray(element)) { 1082 return renderChildren(element, context, legacyContext); 1083 } 1084 1085 switch (typeof element) { 1086 case 'string': 1087 return (0,external_wp_escapeHtml_namespaceObject.escapeHTML)(element); 1088 1089 case 'number': 1090 return element.toString(); 1091 } 1092 1093 const { 1094 type, 1095 props 1096 } = 1097 /** @type {{type?: any, props?: any}} */ 1098 element; 1099 1100 switch (type) { 1101 case external_React_namespaceObject.StrictMode: 1102 case external_React_namespaceObject.Fragment: 1103 return renderChildren(props.children, context, legacyContext); 1104 1105 case RawHTML: 1106 const { 1107 children, 1108 ...wrapperProps 1109 } = props; 1110 return renderNativeComponent((0,external_lodash_namespaceObject.isEmpty)(wrapperProps) ? null : 'div', { ...wrapperProps, 1111 dangerouslySetInnerHTML: { 1112 __html: children 1113 } 1114 }, context, legacyContext); 1115 } 1116 1117 switch (typeof type) { 1118 case 'string': 1119 return renderNativeComponent(type, props, context, legacyContext); 1120 1121 case 'function': 1122 if (type.prototype && typeof type.prototype.render === 'function') { 1123 return renderComponent(type, props, context, legacyContext); 1124 } 1125 1126 return renderElement(type(props, legacyContext), context, legacyContext); 1127 } 1128 1129 switch (type && type.$$typeof) { 1130 case Provider.$$typeof: 1131 return renderChildren(props.children, props.value, legacyContext); 1132 1133 case Consumer.$$typeof: 1134 return renderElement(props.children(context || type._currentValue), context, legacyContext); 1135 1136 case ForwardRef.$$typeof: 1137 return renderElement(type.render(props), context, legacyContext); 1138 } 1139 1140 return ''; 1141 } 1142 /** 1143 * Serializes a native component type to string. 1144 * 1145 * @param {?string} type Native component type to serialize, or null if 1146 * rendering as fragment of children content. 1147 * @param {Object} props Props object. 1148 * @param {Object} [context] Context object. 1149 * @param {Object} [legacyContext] Legacy context object. 1150 * 1151 * @return {string} Serialized element. 1152 */ 1153 1154 function renderNativeComponent(type, props, context) { 1155 let legacyContext = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; 1156 let content = ''; 1157 1158 if (type === 'textarea' && props.hasOwnProperty('value')) { 1159 // Textarea children can be assigned as value prop. If it is, render in 1160 // place of children. Ensure to omit so it is not assigned as attribute 1161 // as well. 1162 content = renderChildren(props.value, context, legacyContext); 1163 props = (0,external_lodash_namespaceObject.omit)(props, 'value'); 1164 } else if (props.dangerouslySetInnerHTML && typeof props.dangerouslySetInnerHTML.__html === 'string') { 1165 // Dangerous content is left unescaped. 1166 content = props.dangerouslySetInnerHTML.__html; 1167 } else if (typeof props.children !== 'undefined') { 1168 content = renderChildren(props.children, context, legacyContext); 1169 } 1170 1171 if (!type) { 1172 return content; 1173 } 1174 1175 const attributes = renderAttributes(props); 1176 1177 if (SELF_CLOSING_TAGS.has(type)) { 1178 return '<' + type + attributes + '/>'; 1179 } 1180 1181 return '<' + type + attributes + '>' + content + '</' + type + '>'; 1182 } 1183 /** @typedef {import('./react').WPComponent} WPComponent */ 1184 1185 /** 1186 * Serializes a non-native component type to string. 1187 * 1188 * @param {WPComponent} Component Component type to serialize. 1189 * @param {Object} props Props object. 1190 * @param {Object} [context] Context object. 1191 * @param {Object} [legacyContext] Legacy context object. 1192 * 1193 * @return {string} Serialized element 1194 */ 1195 1196 function renderComponent(Component, props, context) { 1197 let legacyContext = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; 1198 const instance = new 1199 /** @type {import('react').ComponentClass} */ 1200 Component(props, legacyContext); 1201 1202 if (typeof // Ignore reason: Current prettier reformats parens and mangles type assertion 1203 // prettier-ignore 1204 1205 /** @type {{getChildContext?: () => unknown}} */ 1206 instance.getChildContext === 'function') { 1207 Object.assign(legacyContext, 1208 /** @type {{getChildContext?: () => unknown}} */ 1209 instance.getChildContext()); 1210 } 1211 1212 const html = renderElement(instance.render(), context, legacyContext); 1213 return html; 1214 } 1215 /** 1216 * Serializes an array of children to string. 1217 * 1218 * @param {import('react').ReactNodeArray} children Children to serialize. 1219 * @param {Object} [context] Context object. 1220 * @param {Object} [legacyContext] Legacy context object. 1221 * 1222 * @return {string} Serialized children. 1223 */ 1224 1225 function renderChildren(children, context) { 1226 let legacyContext = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; 1227 let result = ''; 1228 children = (0,external_lodash_namespaceObject.castArray)(children); 1229 1230 for (let i = 0; i < children.length; i++) { 1231 const child = children[i]; 1232 result += renderElement(child, context, legacyContext); 1233 } 1234 1235 return result; 1236 } 1237 /** 1238 * Renders a props object as a string of HTML attributes. 1239 * 1240 * @param {Object} props Props object. 1241 * 1242 * @return {string} Attributes string. 1243 */ 1244 1245 1246 function renderAttributes(props) { 1247 let result = ''; 1248 1249 for (const key in props) { 1250 const attribute = getNormalAttributeName(key); 1251 1252 if (!(0,external_wp_escapeHtml_namespaceObject.isValidAttributeName)(attribute)) { 1253 continue; 1254 } 1255 1256 let value = getNormalAttributeValue(key, props[key]); // If value is not of serializeable type, skip. 1257 1258 if (!ATTRIBUTES_TYPES.has(typeof value)) { 1259 continue; 1260 } // Don't render internal attribute names. 1261 1262 1263 if (isInternalAttribute(key)) { 1264 continue; 1265 } 1266 1267 const isBooleanAttribute = BOOLEAN_ATTRIBUTES.has(attribute); // Boolean attribute should be omitted outright if its value is false. 1268 1269 if (isBooleanAttribute && value === false) { 1270 continue; 1271 } 1272 1273 const isMeaningfulAttribute = isBooleanAttribute || hasPrefix(key, ['data-', 'aria-']) || ENUMERATED_ATTRIBUTES.has(attribute); // Only write boolean value as attribute if meaningful. 1274 1275 if (typeof value === 'boolean' && !isMeaningfulAttribute) { 1276 continue; 1277 } 1278 1279 result += ' ' + attribute; // Boolean attributes should write attribute name, but without value. 1280 // Mere presence of attribute name is effective truthiness. 1281 1282 if (isBooleanAttribute) { 1283 continue; 1284 } 1285 1286 if (typeof value === 'string') { 1287 value = (0,external_wp_escapeHtml_namespaceObject.escapeAttribute)(value); 1288 } 1289 1290 result += '="' + value + '"'; 1291 } 1292 1293 return result; 1294 } 1295 /** 1296 * Renders a style object as a string attribute value. 1297 * 1298 * @param {Object} style Style object. 1299 * 1300 * @return {string} Style attribute value. 1301 */ 1302 1303 function renderStyle(style) { 1304 // Only generate from object, e.g. tolerate string value. 1305 if (!(0,external_lodash_namespaceObject.isPlainObject)(style)) { 1306 return style; 1307 } 1308 1309 let result; 1310 1311 for (const property in style) { 1312 const value = style[property]; 1313 1314 if (null === value || undefined === value) { 1315 continue; 1316 } 1317 1318 if (result) { 1319 result += ';'; 1320 } else { 1321 result = ''; 1322 } 1323 1324 const normalName = getNormalStylePropertyName(property); 1325 const normalValue = getNormalStylePropertyValue(property, value); 1326 result += normalName + ':' + normalValue; 1327 } 1328 1329 return result; 1330 } 1331 /* harmony default export */ var serialize = (renderElement); 1332 1333 ;// CONCATENATED MODULE: ./node_modules/@wordpress/element/build-module/index.js 1334 1335 1336 1337 1338 1339 1340 1341 1342 (window.wp = window.wp || {}).element = __webpack_exports__; 1343 /******/ })() 1344 ;
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Wed Dec 25 01:00:02 2024 | Cross-referenced by PHPXref 0.7.1 |