�PNG  IHDR22?�� pHYs  �� OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*! J�!��Q�EEȠ�����Q, � ��!���������{�kּ������>���� �H3Q5� �B�������.@� $p�d!s�#�~<<+"��x� �M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH���� � 0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4���������x����6��_-��"bb���ϫp@�t~��,/��;�m��%�h^ �u��f�@����W�p�~<�5�j>{�-�]c�K'Xt����o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A��,���� �`6�B$��BB d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(�� A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=� �C��7�F� �dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8, �c˱"� ���V����cϱw�E� 6wB aAHXLXN�H� $4� 7 �Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[ �b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w ��Ljg(�gw��L�Ӌ�T071���oUX*�*|�� �J�&�*/T����ު U�U�T��^S}�FU3S� Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k ��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN �(���~���)�)�4L�1e\k����X�H�Q�G�6������E�Y��A�J'\'Gg����S�Sݧ �M=:��.�k���Dw�n��^��Lo��y���}/�T�m���G X� $� �<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��= ���Z~s�r:V:ޚΜ�?}����/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z���������ۯ�6�i�ܟ�4�)�Y3s���C�Q��? ��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�������!h�쐭!��Α�i�P~���a�a��~ '���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl������� �{�/�]py�����.,:�@L�N8��A*��%�w%� y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y- �B��TZ(�*�geWf�͉�9���+��̳�ې7�����ᒶ��KW-X潬j9�������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n �ڴ �V����E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa��n��{��4���[���>ɾ�UUM�f�e�I���?�������m]�Nmq����#�׹���=TR��+�G�����w- 6 U����#pDy��� �� :�v�{���vg/jB��F�S��[b[�O�>����z�G��499�?r����C�d�&����ˮ/~�����јѡ�򗓿m|������������x31^�V���w�w��O�| (�h���SЧ��������c3-� cHRMz%������u0�`:�o�_�F5IDATx��ytUս�?�;���fN$$��@B�!�k��� -*�gE���j�O�kQ�ʠ`U�B_ �AÐ0%�Ȕ�@r3ޛ;߳��$�@��v����^�s����������$��ߢ !�W��5�̱'-٘������4�>�Rƫ$�G��0U�H}�_ _� #��k�MJ/=�9Du *ڲ�k�PQ;0��j|�*�$�^컂脛y���>�z×� B��� ��(�:$�ʔ_�6��C!B����MVx��a��ζyY����j��ƋY2�9�F�{r��r�딟F��Q��hY6��� x��[l��RC��������nt@��;P��3��� F�w��7��:�P���ɋ'���mj���Bƪ�$�Q�L��y��߷g��\���z����v5�p�v$�v櫻�`6~K �Y�X����,�:��"�o�e0II"(��,������l_�C���/4�+f�E�!q��:����u����c��樼.UE�@� �]K�W���$-�h]�JG���Dz)�`��.�A/ ���mᏣc�3jK� �!�>���$�Q�!�_�? \�C2(E �M$Z I{�U���s�ǣ���=��@Բe ޻��W�����@ �w����}�9v,)��.}*|"�s��di���,���G�]W�AC�������|<����[��ߕ������K�*�G nߴ!��‹��J�!��6(L�a)��Am��������;adf��:�xm��nh�;֦I��(���o�C~ډa?�=��s����h��E������xp����)���_���t��W�����´;8���`dz=(��@@�+,�;�`�fhl��XȌ�3,uI�~z(J����� �ZX�A����H'�À�㜦�82|��a�n�z2��I���� ���EY�h�ε<�0�q�{��C��v�˅��?"@��χ�x�WS+��N�~�KQ�J�8ل�� _.W��� !TU{�����,��"�� �;�������HI S� ��))�o�1�H�D� ���� (� ;����"Ҕ��,���� �F=���O��&�Ph>�`���y��߲ &S��P�<��'��1s�1cĂ�N����2)����@�u��tv��<�+�-&�����h��[!FSG���' � z z0��<����8d&�����E0�,��<��"!P�b4��� �{S�����X����.�囤���T��hEF��X�q0"-<����h���]�Py*����F⩍��@v�˂�Y08�� .q��a��s����(!<̫1�3�L�H��7sYW�`��qtu�\7��?�@�Y�� %Ka�x�GZ�*W�P��y�����N0r9��Z�c�%���q,��k�����!!,��>���IB��� �x1�Xu�Y���v-���ֺ��N������JP��a�2`�e5��w��u;�6�i���̃��(K���ťa��(l51��JL��O'%���]���ٖ뿉!��{*�p+f ���i8��D�ȑ���ܩ�M��V��ӟz��x�7Z�1i}�^͜���6e����x��)u�d�ˏ�V�eG�\�X1�����=n�U'�~Y����L�\,�(d!x ,�:�TW8� M`r���@��r+v�Q0��>^;˴�VbF��('����� �*O��i��j�Ӆ����^�S3&� ���{������.ی�� N;��NU%d0�Ce\r"�C�b��&t7N�7��� �ȪD�[%l�۪�$��'m?�A9tI�9>��NVL ��� 6v~M�����ъ�B���0����9$&=ώm��W�0���L���&��E���f�f��'+�9��hv��7,���M��6�D�&�^� �����8 D֮�����o��k^z��O��hP�8q�5d*��YVq3�{��������#LX4�?��jP=3�~�؅c�ݰ�̱�ұ��8̲��2�G�����j��έ�9��w7���U�X�w�85C��?!I&���o&����L���I#�^�eV�,�^t5�k� �xs˛\��U�8��."���{���ǵ�l4��ݼ�;��r"���G�/~���gJV�N糦��ZZ^k+NN�D��I$�=OE�z����|*�*{��%k���G��>�`9��b;�s���8,�qs��c��.b��q�%�>r��n�R�Ƨ�%�,�A��le#�8���}; 21�0�b�&�QX�f���q�00����$>�h�N�'�a3��A���/�r ��L5�8�GԲ'�����w;��c#�q1���h$*��V^�k��QĽ�b:i������� ����H F#�_���,��]g����Ը����`RUU���� ��"�qD���>-��ϤI�~��3�̴�����NZ[[555�eeek7�m����YF#[��Đ��R��i��L�H�r ��@��J-�Pŝ��_|�-��6y��ks�V�U~��6���w.����(��0A� 4��f��� /���C�xŊ�ٳ����z=6�����rg���mKo��o�/����a�g���?'9%9��P��斓��~���L{�� �H��{AW��B��$����v�1b�&Mb�ر��ر#�0`�`xMBp! )Z�Nmo�mZ�g�}�eذaWTVV ���'99��C5��&�&+5�bT>|8��PUUETT����&���t��~TE%��'������b�tEGG;RSS�S�N�v��ѯ��t����u1@�ޚ"f��͈���r'L�Ph��m��ƌ�74o��`�x�q�P���NRSS�X,�����l&&&��MFFA!-��`��ҷ�n��Yuu�����x<I�LB%����KԒ50�!�3�bz�����ʸKL���;---�l6[��`��������Ȏ;�����egg4��!D�T��jWujyZ��������K����%����p�^���X,6��sV=�ܖ����6�3�X ���4ҿ��A2�&����_k�;d�� �VfOIEND�B`� 0x0x
PHP 8.1.34
Preview: class-wp-entity-fields-registry.php Size: 35.51 KB
/home2/astrociv/public_html/vaastruelogy.in/WordPress-master/wp-includes/class-wp-entity-fields-registry.php
<?php
/**
 * Entity Fields API: WP_Entity_Fields_Registry class
 *
 * @package WordPress
 * @subpackage Entity Fields API
 * @since 7.2.0
 */

/**
 * Holds the fields registered for entities.
 *
 * The registry maps an entity, identified by its kind and name, to its
 * registered field definitions keyed by id, in registration order, each
 * with the origins that registered and updated it, and to the script modules
 * registered for it, each with the ids of the fields it applies to.
 * register() adds fields, update() changes registered ones, and both
 * validate the definitions before storing them: a field that cannot be
 * stored is reported and skipped, and the rest of the call is stored.
 * register_collection() adds the fields a folder declares, see it for the
 * format.
 *
 * Fields are registered on the `wp_entity_fields_api_init` action, and only
 * there, with wp_register_entity_fields(), wp_update_entity_fields(), and
 * wp_unregister_entity_fields(): register(), update(), and unregister() refuse
 * to run while the action is not firing.
 *
 * The registry is filled lazily: the first time its fields are read, it
 * fires the `wp_entity_fields_api_init` action, on which the default fields of every
 * post type and the fields of plugins are registered. A read before `init`
 * has completed is refused, see initialize().
 *
 * Once the action has fired the registry does not change: every reader of
 * a request, the REST controller as well as the import map of the editor
 * script, sees the same fields.
 *
 * @since 7.2.0
 *
 * @access private
 */
class WP_Entity_Fields_Registry {

	/**
	 * Registered fields, as kind => name => array of field id => definition.
	 *
	 * Kept nested rather than under a joined `{$kind}/{$name}` key: both parts
	 * may contain any character, so no separator keeps two entities apart.
	 *
	 * @since 7.2.0
	 * @var array<string, array<string, array<string, array>>>
	 */
	protected $fields = array();

	/**
	 * Registered script modules, as kind => name => array of module id =>
	 * list of the ids of the fields the module applies to, in registration
	 * order.
	 *
	 * @since 7.2.0
	 * @var array<string, array<string, array<string, string[]>>>
	 */
	protected $field_modules = array();

	/**
	 * Whether the `wp_entity_fields_api_init` action has fired since the registry
	 * was created.
	 *
	 * @since 7.2.0
	 * @var bool
	 */
	protected $initialized = false;

	/**
	 * The singleton instance.
	 *
	 * @since 7.2.0
	 * @var WP_Entity_Fields_Registry|null
	 */
	protected static $instance = null;

	/**
	 * Returns the singleton instance.
	 *
	 * @since 7.2.0
	 *
	 * @return WP_Entity_Fields_Registry The registry.
	 */
	public static function get_instance() {
		if ( null === self::$instance ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Registers fields for an entity.
	 *
	 * The fields must be new: a field with the id of a registered field is
	 * reported and skipped, and so is every definition after the first of an
	 * id that appears more than once in the call. The rest of the fields of
	 * the call are registered: a field another plugin got to first does not
	 * cost a plugin the others. A definition that is not an array with a
	 * non-empty string `id` is reported and skipped the same way. To change
	 * a registered field, see update(); to replace it, unregister it first.
	 * The script module, if any, applies to every field the call registers.
	 * A field whose `type` DataViews does not provide is reported and
	 * registered anyway.
	 *
	 * The origin is stored as the `origin` property of each field, as
	 * `registeredBy`, replacing any `origin` the definition sets.
	 *
	 * @since 7.2.0
	 *
	 * @param string      $origin        Who registers the fields: `core`, or
	 *                                   the slug of the plugin or theme.
	 * @param string      $kind          The entity kind (e.g. `postType`).
	 * @param string      $name          The entity name (e.g. `page`).
	 * @param array[]     $fields        The list of field definitions, each with an `id`.
	 * @param string|null $script_module The id of the script module providing
	 *                                   the JavaScript parts of the fields, if any.
	 * @return string[] The ids of the fields registered, in the order of the
	 *                  call. Empty when none is, when called outside the
	 *                  `wp_entity_fields_api_init` action, or when an argument is
	 *                  invalid.
	 */
	public function register( $origin, $kind, $name, $fields, $script_module = null ) {
		if ( ! $this->validate_arguments( __METHOD__, $origin, $kind, $name, $fields, $script_module ) ) {
			return array();
		}
		$fields = $this->skip_invalid_definitions( __METHOD__, $kind, $name, $fields );
		if ( ! $fields ) {
			return array();
		}

		$new_fields     = array();
		$duplicated     = array();
		$registered_ids = array();
		foreach ( $fields as $field ) {
			$id = $field['id'];
			if ( isset( $this->fields[ $kind ][ $name ][ $id ] ) ) {
				$registered_ids[ $id ] = $id;
			} elseif ( isset( $new_fields[ $id ] ) ) {
				$duplicated[ $id ] = $id;
			} else {
				$new_fields[ $id ] = $field;
			}
		}

		if ( $duplicated ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					/* translators: 1: Entity kind, e.g. postType. 2: Entity name, e.g. page. 3: Comma-separated list of field ids. */
					__( 'A field can only be registered once. These fields of %1$s "%2$s" appear more than once in the same call: %3$s. Only their first definition is registered.' ),
					$kind,
					$name,
					implode( ', ', $duplicated )
				),
				'7.2.0'
			);
		}

		if ( $registered_ids ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					/* translators: 1: Entity kind, e.g. postType. 2: Entity name, e.g. page. 3: Comma-separated list of field ids. 4: update() */
					__( 'A field can only be registered once. These fields of %1$s "%2$s" are skipped because they are already registered: %3$s. Use %4$s to change a registered field, or unregister it first to replace it.' ),
					$kind,
					$name,
					implode( ', ', $registered_ids ),
					'<code>update()</code>'
				),
				'7.2.0'
			);
		}

		if ( ! $new_fields ) {
			return array();
		}
		$this->report_unknown_types( __METHOD__, $kind, $name, $new_fields );

		foreach ( $new_fields as $field ) {
			$this->fields[ $kind ][ $name ][ $field['id'] ] = array_merge(
				$field,
				array(
					'origin' => array(
						'registeredBy' => $origin,
						'updatedBy'    => array(),
					),
				)
			);
		}
		$ids = array_column( $new_fields, 'id' );
		$this->add_field_module( $kind, $name, $ids, $script_module );

		return $ids;
	}

	/**
	 * Updates registered fields of an entity.
	 *
	 * Each definition is merged into the registered field with its id,
	 * property by property; the field keeps its position. The fields must be
	 * registered: a field that is not is reported and skipped, and so is a
	 * definition that is not an array with a non-empty string `id`; the rest
	 * of the fields of the call are updated. The script module, if any,
	 * applies to every field the call updates, on top of the modules the
	 * fields have. A field whose `type` DataViews does not provide is
	 * reported and updated anyway.
	 *
	 * The origin is appended to the `updatedBy` list of the `origin` property
	 * of each field, once; the rest of the `origin` property cannot be
	 * updated, and any `origin` the definition sets is ignored.
	 *
	 * Like register(), it only runs on the `wp_entity_fields_api_init` action.
	 *
	 * @since 7.2.0
	 *
	 * @param string      $origin        Who updates the fields: `core`, or
	 *                                   the slug of the plugin or theme.
	 * @param string      $kind          The entity kind (e.g. `postType`).
	 * @param string      $name          The entity name (e.g. `page`).
	 * @param array[]     $fields        The list of partial field definitions,
	 *                                   each with the `id` of a registered field.
	 * @param string|null $script_module The id of the script module providing
	 *                                   the JavaScript parts of the fields, if any.
	 * @return string[] The ids of the fields updated, in the order of the
	 *                  call. Empty when none is, when called outside the
	 *                  `wp_entity_fields_api_init` action, or when an argument is
	 *                  invalid.
	 */
	public function update( $origin, $kind, $name, $fields, $script_module = null ) {
		if ( ! $this->validate_arguments( __METHOD__, $origin, $kind, $name, $fields, $script_module ) ) {
			return array();
		}
		$fields = $this->skip_invalid_definitions( __METHOD__, $kind, $name, $fields );
		if ( ! $fields ) {
			return array();
		}
		$this->report_unknown_types( __METHOD__, $kind, $name, $fields );

		$ids              = array();
		$unregistered_ids = array();
		foreach ( $fields as $field ) {
			$id = $field['id'];
			if ( ! isset( $this->fields[ $kind ][ $name ][ $id ] ) ) {
				$unregistered_ids[ $id ] = $id;
				continue;
			}

			$registered   = $this->fields[ $kind ][ $name ][ $id ];
			$field_origin = $registered['origin'];
			if ( ! in_array( $origin, $field_origin['updatedBy'], true ) ) {
				$field_origin['updatedBy'][] = $origin;
			}

			$this->fields[ $kind ][ $name ][ $id ] = array_merge( $registered, $field, array( 'origin' => $field_origin ) );
			if ( ! in_array( $id, $ids, true ) ) {
				$ids[] = $id;
			}
		}

		if ( $unregistered_ids ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					/* translators: 1: Entity kind, e.g. postType. 2: Entity name, e.g. page. 3: Comma-separated list of field ids. 4: register() */
					__( 'Only registered fields can be updated. These fields of %1$s "%2$s" are skipped because they are not registered: %3$s. Use %4$s to add a field.' ),
					$kind,
					$name,
					implode( ', ', $unregistered_ids ),
					'<code>register()</code>'
				),
				'7.2.0'
			);
		}

		if ( $ids ) {
			$this->add_field_module( $kind, $name, $ids, $script_module );
		}

		return $ids;
	}

	/**
	 * Unregisters fields of an entity.
	 *
	 * Unregistering a field removes its registered definition and
	 * drops it from the script modules that applied to it (a module left with
	 * no field is forgotten). Unregistering every field forgets the entity:
	 * its registered fields and script modules.
	 *
	 * Like register(), it only runs on the `wp_entity_fields_api_init` action, and an
	 * invalid entity is reported and unregisters nothing. An id that is not a
	 * non-empty string is reported and skipped, like a definition register()
	 * cannot store.
	 *
	 * @since 7.2.0
	 *
	 * @param string        $kind The entity kind (e.g. `postType`).
	 * @param string        $name The entity name (e.g. `page`).
	 * @param string[]|null $ids  The ids of the fields to unregister. Default
	 *                            null, every field of the entity.
	 * @return array[] The list of the definitions unregistered, in
	 *                 registration order, as get_registered() returns them.
	 *                 Empty when none of the fields is registered, when
	 *                 called outside the `wp_entity_fields_api_init` action, or when
	 *                 the entity is invalid.
	 */
	public function unregister( $kind, $name, $ids = null ) {
		if ( ! $this->doing_entity_fields_api_init( __METHOD__ ) || ! $this->validate_entity( __METHOD__, $kind, $name ) ) {
			return array();
		}

		if ( null === $ids ) {
			$unregistered = array_values( $this->fields[ $kind ][ $name ] ?? array() );
			unset( $this->fields[ $kind ][ $name ], $this->field_modules[ $kind ][ $name ] );
			$this->forget_empty_entity( $kind, $name );
			return $unregistered;
		}

		$ids = $this->skip_invalid_ids( __METHOD__, $kind, $name, (array) $ids );
		if ( ! $ids ) {
			return array();
		}

		$unregistered = array_intersect_key( $this->fields[ $kind ][ $name ] ?? array(), array_flip( $ids ) );
		if ( empty( $unregistered ) ) {
			return array();
		}

		// A script module only ever applies to registered fields: register()
		// and update() add it for fields they store, and fields leave both
		// lists together here. So the fields removed are all the registry
		// loses, and the modules are not returned: the ones that applied to
		// them are listed by get_registered_field_modules(), read beforehand.
		$ids = array_keys( $unregistered );
		foreach ( $ids as $id ) {
			unset( $this->fields[ $kind ][ $name ][ $id ] );
		}
		foreach ( $this->field_modules[ $kind ][ $name ] ?? array() as $module => $module_ids ) {
			$remaining = array_values( array_diff( $module_ids, $ids ) );
			if ( empty( $remaining ) ) {
				unset( $this->field_modules[ $kind ][ $name ][ $module ] );
			} else {
				$this->field_modules[ $kind ][ $name ][ $module ] = $remaining;
			}
		}
		$this->forget_empty_entity( $kind, $name );

		return array_values( $unregistered );
	}

	/**
	 * Registers the fields of a field collection.
	 *
	 * A collection is a folder whose `index.php` returns its configuration, with
	 * a folder per field whose `field.php` returns the serializable part of the
	 * field (see get_collection_fields()). Each file is required without
	 * sharing the variables of the caller, see require_file(). The JavaScript
	 * parts of the fields, if any, ship in the script module of the
	 * collection. The configuration is an array with these keys:
	 *
	 * - `origin` (required): who registers the fields: `core`, or the slug of
	 *   the plugin or theme. See register().
	 * - `kind` (required): the entity kind, e.g. `postType`.
	 * - `name` (required): the entity name, e.g. `wp_template`.
	 * - `module` (optional): the id of the script module providing the
	 *   JavaScript parts of the fields. Every field of the collection is
	 *   registered with it.
	 *
	 * The collection registers its fields on the entity, after the fields
	 * registered on it before, in the alphabetical order of their folders.
	 * register() skips a field already registered for the entity, and
	 * registers the rest of the collection. Like register(), it does not check
	 * that the entity exists: the `/wp/v2/entity-fields` route only serves the fields
	 * of the entities the REST API exposes.
	 *
	 * Fields that apply to several entities, such as the defaults every post
	 * type derives from its supports, are registered in code: a
	 * `wp_entity_fields_api_init` callback can read their definitions from files with
	 * get_collection_fields() and register them on each entity with
	 * register().
	 *
	 * Like register(), it only runs on the `wp_entity_fields_api_init` action. An
	 * invalid configuration is reported with _doing_it_wrong() and skipped. So
	 * is an invalid `field.php`, see get_collection_fields(): the rest of the
	 * fields of the collection are registered.
	 *
	 * @since 7.2.0
	 *
	 * @param string $directory The directory of the collection.
	 * @return bool Whether the collection is valid and all of its fields are
	 *              registered. True as well when it has no fields; false when
	 *              a `field.php` is skipped, or when called outside the
	 *              `wp_entity_fields_api_init` action.
	 */
	public function register_collection( $directory ) {
		if ( ! $this->doing_entity_fields_api_init( __METHOD__ ) ) {
			return false;
		}

		$collection = $this->get_collection( __METHOD__, $directory );
		if ( null === $collection ) {
			return false;
		}

		if ( empty( $collection['fields'] ) ) {
			return ! $collection['skipped'];
		}
		$registered = $this->register( $collection['origin'], $collection['kind'], $collection['name'], $collection['fields'], $collection['module'] );

		return ! $collection['skipped'] && count( $registered ) === count( $collection['fields'] );
	}

	/**
	 * Returns the fields of a field collection.
	 *
	 * A collection holds a folder per field, whose `field.php` returns the
	 * serializable part of the field, see register_collection().
	 *
	 * @since 7.2.0
	 *
	 * @param string $directory The directory of the collection.
	 * @return array<string, array> The fields of the collection, keyed by id, in
	 *                              the alphabetical order of their folders. The
	 *                              id of a field is the name of its folder,
	 *                              unless its `field.php` sets an `id`, and it
	 *                              comes first in the field. A `field.php`
	 *                              that does not return an array with a
	 *                              non-empty string id, or whose id an earlier
	 *                              folder took, is reported and skipped.
	 */
	public function get_collection_fields( $directory ) {
		return $this->read_collection_fields( __METHOD__, $directory )['fields'];
	}

	/**
	 * Returns the fields registered for an entity.
	 *
	 * @since 7.2.0
	 *
	 * @param string $kind The entity kind (e.g. `postType`).
	 * @param string $name The entity name (e.g. `page`).
	 * @return array[] The list of field definitions, in registration order.
	 */
	public function get_registered( $kind, $name ) {
		$this->initialize();
		return array_values( $this->fields[ $kind ][ $name ] ?? array() );
	}

	/**
	 * Returns the fields registered for every entity.
	 *
	 * @since 7.2.0
	 *
	 * @return array<string, array<string, array[]>> The lists of field
	 *                                               definitions, keyed by
	 *                                               kind, then by name.
	 */
	public function get_all_registered() {
		$this->initialize();
		return array_map(
			static function ( $entities ) {
				return array_map( 'array_values', $entities );
			},
			$this->fields
		);
	}

	/**
	 * Returns the script modules registered for an entity.
	 *
	 * @since 7.2.0
	 *
	 * @param string $kind The entity kind (e.g. `postType`).
	 * @param string $name The entity name (e.g. `page`).
	 * @return array[] {
	 *     The script modules, in registration order.
	 *
	 *     @type array ...$0 {
	 *         @type string   $id     The id of the script module.
	 *         @type string[] $fields The ids of the fields the module applies
	 *                                to, in registration order.
	 *     }
	 * }
	 */
	public function get_registered_field_modules( $kind, $name ) {
		$this->initialize();
		$modules = array();
		foreach ( $this->field_modules[ $kind ][ $name ] ?? array() as $module => $field_ids ) {
			$modules[] = array(
				// A numeric module id is an integer as an array key.
				'id'     => (string) $module,
				'fields' => $field_ids,
			);
		}
		return $modules;
	}

	/**
	 * Returns the ids of the script modules registered for every entity.
	 *
	 * @since 7.2.0
	 *
	 * @return array<string, array<string, string[]>> The lists of module ids,
	 *                                                keyed by kind, then by
	 *                                                name.
	 */
	public function get_all_registered_field_modules() {
		$this->initialize();
		/*
		 * Keeps the module ids and drops the field ids they apply to, e.g.:
		 *
		 *     array(
		 *         'postType' => array(
		 *             'page' => array( 'my-plugin/fields', '123' ),
		 *             'post' => array( 'my-plugin/fields' ),
		 *         ),
		 *     )
		 */
		return array_map(
			static function ( $entities ) {
				return array_map(
					static function ( $modules ) {
						// A numeric module id is an integer as an array key.
						return array_map( 'strval', array_keys( $modules ) );
					},
					$entities
				);
			},
			$this->field_modules
		);
	}

	/**
	 * Fires the `wp_entity_fields_api_init` action the first time the registry
	 * is read.
	 *
	 * The read is refused until `init` has completed. The registry holds the
	 * fields of post types, and post types are not known until then: core
	 * registers its own on `init` at priority 0, plugins theirs at the default
	 * priority, and supports are added and removed on `init` too. The default
	 * fields of a post type derive from its supports, and the action fires
	 * once, so a read before or during `init` would fix the defaults from the
	 * post types registered so far for the rest of the request.
	 *
	 * did_action() is true from the first `init` callback on, hence the
	 * doing_action() check for the reads made while it runs.
	 *
	 * @since 7.2.0
	 */
	protected function initialize() {
		if ( $this->initialized ) {
			return;
		}

		if ( ! did_action( 'init' ) || doing_action( 'init' ) ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					/* translators: 1: init, 2: wp_entity_fields_api_init */
					__( 'The registered fields cannot be read until the %1$s action has completed: the post types and supports they derive from are registered on %1$s. Read them once %1$s has completed, or hook %2$s.' ),
					'<code>init</code>',
					'<code>wp_entity_fields_api_init</code>'
				),
				'7.2.0'
			);
			return;
		}

		// Set before firing, so a callback reading the registry to inspect
		// the fields it updates does not fire the action again.
		$this->initialized = true;

		/**
		 * Fires the first time the registered fields are read, after `init`.
		 *
		 * Register or adjust fields here, with wp_register_entity_fields(),
		 * wp_update_entity_fields(), and wp_unregister_entity_fields(): it is the only
		 * time they run.
		 *
		 * The first read happens wherever the fields are needed: while
		 * handling a REST request as well as on `admin_footer` of the pages
		 * that load the editor script. A callback should register fields and
		 * nothing else; script modules, styles, and their enqueue hooks
		 * belong on `init`.
		 *
		 * @since 7.2.0
		 */
		do_action( 'wp_entity_fields_api_init' );
	}

	/**
	 * Checks that the `wp_entity_fields_api_init` action is firing, as register(),
	 * update(), and unregister() require.
	 *
	 * Outside the action a registration would either come before the
	 * defaults, which could then not be registered, or after the fields have been read
	 * and the import map of the editor script built from them. Refusing
	 * keeps the registry immutable once read.
	 *
	 * @since 7.2.0
	 *
	 * @param string $method The calling method, for the notice.
	 * @return bool Whether the action is firing.
	 */
	protected function doing_entity_fields_api_init( $method ) {
		if ( doing_action( 'wp_entity_fields_api_init' ) ) {
			return true;
		}

		_doing_it_wrong(
			$method,
			sprintf(
				/* translators: %s: wp_entity_fields_api_init */
				__( 'Fields can only be registered, updated, and unregistered on the %s action.' ),
				'<code>wp_entity_fields_api_init</code>'
			),
			'7.2.0'
		);
		return false;
	}

	/**
	 * Reports the fields whose `type` is not one the REST schema of the
	 * fields lists, with _doing_it_wrong(). Those are the types DataViews
	 * provides a control for: a misspelt type is otherwise silent, the field
	 * renders without a control. A missing `type` is fine.
	 *
	 * @since 7.2.0
	 *
	 * @param string  $method The calling method, for the notice.
	 * @param string  $kind   The entity kind.
	 * @param string  $name   The entity name.
	 * @param array[] $fields The field definitions.
	 */
	protected function report_unknown_types( $method, $kind, $name, $fields ) {
		$type_schema = ( new WP_REST_Entity_Fields_Controller() )->get_item_schema()['properties']['fields']['items']['properties']['type'];
		$unknown     = array();
		foreach ( $fields as $field ) {
			if ( ! isset( $field['type'] ) ) {
				continue;
			}
			$valid = rest_validate_value_from_schema( $field['type'], $type_schema, 'type' );
			if ( is_wp_error( $valid ) ) {
				$unknown[] = sprintf( '%s (%s)', $field['id'], $valid->get_error_message() );
			}
		}
		if ( ! $unknown ) {
			return;
		}
		_doing_it_wrong(
			$method,
			sprintf(
				/* translators: 1: Entity kind, e.g. postType. 2: Entity name, e.g. page. 3: Comma-separated list of field ids, each with the error of its type. */
				__( 'These fields of %1$s "%2$s" have a type DataViews does not provide, so they render without a control: %3$s' ),
				$kind,
				$name,
				implode( ', ', $unknown )
			),
			'7.2.0'
		);
	}

	/**
	 * Validates the arguments of register() and update().
	 *
	 * @since 7.2.0
	 *
	 * @param string $method        The calling method, for the notice.
	 * @param mixed  $origin        The origin.
	 * @param mixed  $kind          The entity kind.
	 * @param mixed  $name          The entity name.
	 * @param mixed  $fields        The field definitions.
	 * @param mixed  $script_module The script module id, if any.
	 * @return bool Whether the call may proceed: the `wp_entity_fields_api_init` action
	 *              is firing and the arguments are valid.
	 */
	protected function validate_arguments( $method, $origin, $kind, $name, $fields, $script_module ) {
		if ( ! $this->doing_entity_fields_api_init( $method ) ) {
			return false;
		}

		if ( ! is_string( $origin ) || '' === $origin ) {
			_doing_it_wrong(
				$method,
				__( 'The origin must be a non-empty string.' ),
				'7.2.0'
			);
			return false;
		}

		if ( ! $this->validate_entity( $method, $kind, $name ) ) {
			return false;
		}

		if ( ! is_array( $fields ) || empty( $fields ) || ! array_is_list( $fields ) ) {
			_doing_it_wrong(
				$method,
				__( 'The fields must be a list of non-empty field definitions.' ),
				'7.2.0'
			);
			return false;
		}

		if ( null !== $script_module && ( ! is_string( $script_module ) || '' === $script_module ) ) {
			_doing_it_wrong(
				$method,
				__( 'The script module must be the id of a script module.' ),
				'7.2.0'
			);
			return false;
		}

		return true;
	}

	/**
	 * Checks that the entity kind and name are non-empty strings, reporting
	 * them with _doing_it_wrong() otherwise.
	 *
	 * @since 7.2.0
	 *
	 * @param string $method The calling method, for the notice.
	 * @param mixed  $kind   The entity kind.
	 * @param mixed  $name   The entity name.
	 * @return bool Whether both are valid.
	 */
	protected function validate_entity( $method, $kind, $name ) {
		foreach ( array( $kind, $name ) as $argument ) {
			if ( ! is_string( $argument ) || '' === $argument ) {
				_doing_it_wrong(
					$method,
					__( 'The entity kind and the entity name must be non-empty strings.' ),
					'7.2.0'
				);
				return false;
			}
		}
		return true;
	}

	/**
	 * Drops the definitions that are not an array with a non-empty string
	 * `id`, reporting their positions in the call with _doing_it_wrong():
	 * like a duplicated field, an invalid definition does not cost the call
	 * its other fields.
	 *
	 * @since 7.2.0
	 *
	 * @param string  $method The calling method, for the notice.
	 * @param string  $kind   The entity kind.
	 * @param string  $name   The entity name.
	 * @param array[] $fields The list of field definitions.
	 * @return array[] The valid definitions, in the order of the call.
	 */
	protected function skip_invalid_definitions( $method, $kind, $name, $fields ) {
		$valid   = array();
		$invalid = array();
		foreach ( $fields as $position => $field ) {
			if ( is_array( $field ) && isset( $field['id'] ) && is_string( $field['id'] ) && '' !== $field['id'] ) {
				$valid[] = $field;
			} else {
				$invalid[] = '#' . ( $position + 1 );
			}
		}

		if ( $invalid ) {
			_doing_it_wrong(
				$method,
				sprintf(
					/* translators: 1: Entity kind, e.g. postType. 2: Entity name, e.g. page. 3: Comma-separated list of positions, e.g. #2, #4. 4: id */
					__( 'Every field definition must be an array with a non-empty string %4$s. These definitions of %1$s "%2$s" are skipped: %3$s. The rest of the fields of the call are stored.' ),
					$kind,
					$name,
					implode( ', ', $invalid ),
					'<code>id</code>'
				),
				'7.2.0'
			);
		}

		return $valid;
	}

	/**
	 * Drops the ids that are not a non-empty string, reporting their
	 * positions in the call with _doing_it_wrong(): like an invalid
	 * definition, an invalid id does not cost the call its other ids.
	 *
	 * @since 7.2.0
	 *
	 * @param string $method The calling method, for the notice.
	 * @param string $kind   The entity kind.
	 * @param string $name   The entity name.
	 * @param array  $ids    The ids of the fields.
	 * @return string[] The valid ids, in the order of the call.
	 */
	protected function skip_invalid_ids( $method, $kind, $name, $ids ) {
		$valid   = array();
		$invalid = array();
		foreach ( array_values( $ids ) as $position => $id ) {
			if ( is_string( $id ) && '' !== $id ) {
				$valid[] = $id;
			} else {
				$invalid[] = '#' . ( $position + 1 );
			}
		}

		if ( $invalid ) {
			_doing_it_wrong(
				$method,
				sprintf(
					/* translators: 1: Entity kind, e.g. postType. 2: Entity name, e.g. page. 3: Comma-separated list of positions, e.g. #2, #4. */
					__( 'Every field id must be a non-empty string. These ids of %1$s "%2$s" are skipped: %3$s. The rest of the fields of the call are unregistered.' ),
					$kind,
					$name,
					implode( ', ', $invalid )
				),
				'7.2.0'
			);
		}

		return $valid;
	}

	/**
	 * Reads and validates a field collection, see register_collection() for
	 * its format.
	 *
	 * An invalid configuration is reported with _doing_it_wrong(): the
	 * collection is skipped.
	 *
	 * @since 7.2.0
	 *
	 * @param string $method    The calling method, for the notice.
	 * @param string $directory The directory of the collection.
	 * @return array|null The configuration of the collection, with the `module`
	 *                    key set, its valid `fields` as a list, and `skipped`
	 *                    telling whether a `field.php` was skipped, see
	 *                    read_collection_fields(); or null when the
	 *                    configuration is invalid.
	 */
	protected function get_collection( $method, $directory ) {
		$slug   = basename( $directory );
		$file   = $directory . '/index.php';
		$config = is_file( $file ) ? self::require_file( $file ) : null;
		$error  = null;

		if ( ! is_array( $config ) ) {
			$error = sprintf(
				/* translators: %s: index.php */
				__( 'The %s of a field collection must return an array.' ),
				'<code>index.php</code>'
			);
		} elseif ( ! isset( $config['origin'] ) || ! is_string( $config['origin'] ) || '' === $config['origin'] ) {
			$error = sprintf(
				/* translators: %s: origin */
				__( 'The %s of a field collection must be a non-empty string.' ),
				'<code>origin</code>'
			);
		} elseif ( ! isset( $config['kind'] ) || ! is_string( $config['kind'] ) || '' === $config['kind'] ) {
			$error = sprintf(
				/* translators: %s: kind */
				__( 'The %s of a field collection must be a non-empty string.' ),
				'<code>kind</code>'
			);
		} elseif ( ! isset( $config['name'] ) || ! is_string( $config['name'] ) || '' === $config['name'] ) {
			$error = sprintf(
				/* translators: %s: name */
				__( 'The %s of a field collection must be a non-empty string.' ),
				'<code>name</code>'
			);
		} elseif ( isset( $config['module'] ) && ( ! is_string( $config['module'] ) || '' === $config['module'] ) ) {
			$error = sprintf(
				/* translators: %s: module */
				__( 'The %s of a field collection must be the id of a script module.' ),
				'<code>module</code>'
			);
		}

		if ( null !== $error ) {
			_doing_it_wrong(
				$method,
				/* translators: 1: The name of a field collection. 2: The error. */
				sprintf( __( 'The field collection "%1$s" is skipped. %2$s' ), $slug, $error ),
				'7.2.0'
			);
			return null;
		}

		$read = $this->read_collection_fields( $method, $directory );

		return array_merge(
			$config,
			array(
				'module'  => $config['module'] ?? null,
				'fields'  => array_values( $read['fields'] ),
				'skipped' => $read['skipped'],
			)
		);
	}

	/**
	 * Reads the fields of a field collection, see get_collection_fields().
	 *
	 * The id of a field is used as a key, so it is checked before: a
	 * `field.php` that does not return an array with a non-empty string id
	 * is reported with _doing_it_wrong() and skipped, and so is one whose
	 * id an earlier folder of the collection took. The rest of the fields
	 * are read.
	 *
	 * @since 7.2.0
	 *
	 * @param string $method    The calling method, for the notice.
	 * @param string $directory The directory of the collection.
	 * @return array {
	 *     The fields of the collection.
	 *
	 *     @type array<string, array> $fields  The valid fields, keyed by id,
	 *                                         in the alphabetical order of
	 *                                         their folders.
	 *     @type bool                 $skipped Whether a `field.php` was skipped.
	 * }
	 */
	protected function read_collection_fields( $method, $directory ) {
		$files = glob( $directory . '/*/field.php' );
		if ( empty( $files ) ) {
			return array(
				'fields'  => array(),
				'skipped' => false,
			);
		}
		sort( $files, SORT_STRING );

		$fields     = array();
		$invalid    = array();
		$duplicated = array();
		foreach ( $files as $file ) {
			$folder = basename( dirname( $file ) );
			$field  = self::require_file( $file );
			if ( ! is_array( $field ) ) {
				$invalid[] = $folder;
				continue;
			}

			// The id comes first, like in the fields registered directly.
			$field = array_merge( array( 'id' => $folder ), $field );
			$id    = $field['id'];
			if ( ! is_string( $id ) || '' === $id ) {
				$invalid[] = $folder;
			} elseif ( isset( $fields[ $id ] ) ) {
				$duplicated[] = $folder;
			} else {
				$fields[ $id ] = $field;
			}
		}

		$collection = basename( $directory );
		if ( $invalid ) {
			_doing_it_wrong(
				$method,
				sprintf(
					/* translators: 1: The name of a field collection. 2: Comma-separated list of folder names. 3: field.php 4: id */
					__( 'The %3$s of a field must return an array, with a non-empty string %4$s if it sets one. These fields of the field collection "%1$s" are skipped: %2$s.' ),
					$collection,
					implode( ', ', $invalid ),
					'<code>field.php</code>',
					'<code>id</code>'
				),
				'7.2.0'
			);
		}

		if ( $duplicated ) {
			_doing_it_wrong(
				$method,
				sprintf(
					/* translators: 1: The name of a field collection. 2: Comma-separated list of folder names. */
					__( 'A field can only be defined once in a field collection. These fields of the field collection "%1$s" are skipped because an earlier folder defines their id: %2$s.' ),
					$collection,
					implode( ', ', $duplicated )
				),
				'7.2.0'
			);
		}

		return array(
			'fields'  => $fields,
			'skipped' => $invalid || $duplicated,
		);
	}

	/**
	 * Requires a file without sharing the variables of the caller: this is
	 * about variable scope.
	 *
	 * @since 7.2.0
	 *
	 * @param string $file The path of the file.
	 * @return mixed The return value of the file.
	 */
	protected static function require_file( $file ) {
		return require $file;
	}

	/**
	 * Applies a script module to fields of an entity, after the fields it
	 * already applies to.
	 *
	 * @since 7.2.0
	 *
	 * @param string      $kind          The entity kind.
	 * @param string      $name          The entity name.
	 * @param string[]    $ids           The ids of the fields.
	 * @param string|null $script_module The id of the script module, if any.
	 */
	protected function add_field_module( $kind, $name, $ids, $script_module ) {
		if ( null === $script_module ) {
			return;
		}

		$module_ids = $this->field_modules[ $kind ][ $name ][ $script_module ] ?? array();
		foreach ( $ids as $id ) {
			if ( ! in_array( $id, $module_ids, true ) ) {
				$module_ids[] = $id;
			}
		}
		$this->field_modules[ $kind ][ $name ][ $script_module ] = $module_ids;
	}

	/**
	 * Forgets an entity left without fields or script modules, and its kind
	 * once no entity of the kind is left, so the registry only lists
	 * entities that have some.
	 *
	 * @since 7.2.0
	 *
	 * @param string $kind The entity kind.
	 * @param string $name The entity name.
	 */
	protected function forget_empty_entity( $kind, $name ) {
		if ( empty( $this->fields[ $kind ][ $name ] ) ) {
			unset( $this->fields[ $kind ][ $name ] );
		}
		if ( empty( $this->fields[ $kind ] ) ) {
			unset( $this->fields[ $kind ] );
		}
		if ( empty( $this->field_modules[ $kind ][ $name ] ) ) {
			unset( $this->field_modules[ $kind ][ $name ] );
		}
		if ( empty( $this->field_modules[ $kind ] ) ) {
			unset( $this->field_modules[ $kind ] );
		}
	}
}

Directory Contents

Dirs: 34 × Files: 266
Name Size Perms Modified Actions
abilities DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
ai-client DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
assets DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
blocks DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
build DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
css DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
customize DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
fonts DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
html-api DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
ID3 DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
images DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
IXR DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
js DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
l10n DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
PHPMailer DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
pomo DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
Requests DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
rest-api DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
secrets DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
SimplePie DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
sitemaps DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
Text DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
widgets DIR
- drwxr-xr-x 2026-10-28 14:44:54
Edit Download
38.89 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
12.77 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
40.76 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
4.38 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
11.90 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
19.71 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
7.62 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
29.07 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
316 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
15.28 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
62.33 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
17.89 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
121.84 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
12.61 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
15.45 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
10.76 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
13.17 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
35.62 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
42.64 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
56.33 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
14.47 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
29.30 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
539 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
367 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
2.55 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
42.65 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
401 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
6.61 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
664 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
20.61 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
2.18 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
453 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
457 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
36.81 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
2.41 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
8.28 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
13.89 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
11.76 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
2.65 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
7.44 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
21.30 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
5.26 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
16.70 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
8.10 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
2.92 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
1.32 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
4.72 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
11.57 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
2.50 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
1.95 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
10.97 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
4.24 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
9.99 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
69.58 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
7.50 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
7.87 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
2.06 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
6.95 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
5.22 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
16.92 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
27.57 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
3.93 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
48.31 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
17.34 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
14.88 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
25.50 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
198.41 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
56.67 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
10.45 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
10.95 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
29.30 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
70.91 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
34.55 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
17.01 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
2.59 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
39.88 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
70.53 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
15.54 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
24.18 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
35.51 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
7.34 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
253 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
7.96 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
3.35 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
969 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
760 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
17.83 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
7.16 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
12.95 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
6.53 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
3.58 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
5.84 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
1.99 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
4.14 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
3.15 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
16.37 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
41.50 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
6.40 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
14.93 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
20.12 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
42.44 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
17.05 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
7.27 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
6.64 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
16.54 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
1.79 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
29.79 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
6.53 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
8.96 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
19.84 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
12.57 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
17.27 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
6.74 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
33.05 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
4.95 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
4.25 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
24.62 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
30.52 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
8.90 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
161.08 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
6.72 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
10.90 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
4.80 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
3.44 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
11.37 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
70.26 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
2.49 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
9.11 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
39.79 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
35.81 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
7.15 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
3.47 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
1.87 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
30.92 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
8.09 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
7.70 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
16.91 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
19.00 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
18.35 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
40.95 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
5.56 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
979 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
18.48 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
10.54 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
1.76 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
35.92 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
7.19 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
232.13 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
65.75 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
28.38 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
4.69 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
2.88 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
43.24 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
2.29 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
22.78 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
28.71 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
12.97 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
4.02 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
18.17 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
214.92 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
28.15 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
120.91 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
373 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
343 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
338 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
101.45 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
151.46 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
18.93 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
21.95 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
32.45 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
45.52 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
400 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
11.14 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
40.46 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
2.23 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
194.51 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
338 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
38.31 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
6.49 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
9.20 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
5.43 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
4.00 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
5.49 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
3.14 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
2.50 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
1.16 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
4.00 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
3.56 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
29.76 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
9.56 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
351.83 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
298.90 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
20.02 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
8.45 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
182.98 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
19.14 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
28.35 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
5.72 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
4.63 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
8.38 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
13.02 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
123.42 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
74.33 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
157.91 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
59.10 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
162 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
62.17 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
241.95 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
68.41 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
25.91 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
4.81 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
6.48 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
21.26 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
2.79 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
90.46 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
19.58 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
3.89 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
4.10 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
42.18 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
25.42 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
43.23 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
107.16 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
6.18 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
125.19 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
37.41 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
6.90 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
68.38 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
10.62 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
314.27 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
47.63 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
200 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
200 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
106.11 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
30.62 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
19.98 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
5.06 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
277 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
22.66 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
177.92 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
12.02 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
25.38 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
258 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
23.82 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
3.19 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
11.60 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
441 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
7.87 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
180.39 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
544 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
4.17 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
37.92 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
2.01 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
2.82 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
3.96 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
9.58 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
132.79 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
37.37 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
177.83 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
6.82 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
6.45 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
1.09 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
21.18 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
2.87 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
69.47 KB lrw-r--r-- 2026-10-28 14:44:54
Edit Download
445 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
792 B lrw-r--r-- 2026-10-28 14:44:54
Edit Download
If ZipArchive is unavailable, a .tar will be created (no compression).
© 2026 0xNothings — Secure File Manager. All rights reserved. Built with ❤️ & Tailwind x Dark UI