aboutsummaryrefslogtreecommitdiffstats
path: root/kubernetes/portal/Chart.yaml
blob: 0f7b8466076b07f1cd66de44e84eeb8c9628c217 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# Copyright © 2017 Amdocs, Bell Canada
# Modifications Copyright © 2018 AT&T
# Modifications Copyright © 2021 Orange
# Modifications Copyright © 2021 Nordix Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

apiVersion: v2
description: ONAP Web Portal
name: portal
version: 11.0.0

dependencies:
  - name: common
    version: ~11.x-0
    repository: '@local'
  - name: portal-app
    version: ~11.x-0
    repository: 'file://components/portal-app'
  - name: portal-cassandra
    version: ~11.x-0
    repository: 'file://components/portal-cassandra'
  - name: portal-mariadb
    version: ~11.x-0
    repository: 'file://components/portal-mariadb'
  - name: portal-sdk
    version: ~11.x-0
    repository: 'file://components/portal-sdk'
  - name: portal-widget
    version: ~11.x-0
    repository: 'file://components/portal-widget'
ht .s1 { color: #e6db74 } /* Literal.String.Single */ .highlight .ss { color: #e6db74 } /* Literal.String.Symbol */ .highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #a6e22e } /* Name.Function.Magic */ .highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */ .highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */ .highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */ .highlight .vm { color: #f8f8f2 } /* Name.Variable.Magic */ .highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */ } @media (prefers-color-scheme: light) { .highlight .hll { background-color: #ffffcc } .highlight .c { color: #888888 } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .k { color: #008800; font-weight: bold } /* Keyword */ .highlight .ch { color: #888888 } /* Comment.Hashbang */ .highlight .cm { color: #888888 } /* Comment.Multiline */ .highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */ }
/*!
 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */

import React from 'react';
import {mount} from 'enzyme';
import {mapStateToProps} from 'sdc-app/onboarding/softwareProduct/dependencies/SoftwareProductDependencies.js';
import {
	SoftwareProductDependenciesResponseFactory,
	SoftwareProductDependenciesStoreFactory} from 'test-utils/factories/softwareProduct/SoftwareProductDependenciesFactories.js';
import {VSPComponentsFactory} from 'test-utils/factories/softwareProduct/SoftwareProductComponentsFactories.js';
import VersionFactory from 'test-utils/factories/common/VersionFactory.js';
import {storeCreator} from 'sdc-app/AppStore.js';
import {cloneAndSet} from 'test-utils/Util.js';
import mockRest from 'test-utils/MockRest.js';

import SoftwareProductComponentsActionHelper from 'sdc-app/onboarding/softwareProduct/components/SoftwareProductComponentsActionHelper.js';
import {relationTypes, NEW_RULE_TEMP_ID}  from 'sdc-app/onboarding/softwareProduct/dependencies/SoftwareProductDependenciesConstants.js';
import SoftwareProductDependenciesActionHelper from 'sdc-app/onboarding/softwareProduct/dependencies/SoftwareProductDependenciesActionHelper.js';
import SoftwareProductDependenciesView from 'sdc-app/onboarding/softwareProduct/dependencies/SoftwareProductDependenciesView.jsx';
import {VSPEditorFactory} from 'test-utils/factories/softwareProduct/SoftwareProductEditorFactories.js';

function addNewRowElement(arr, data) {
	if (data === undefined) {
		arr.push({id: NEW_RULE_TEMP_ID, targetId: null, sourceId: null, relationType: relationTypes.DEPENDS_ON});
	} else {
		arr.push(data);
	}
}

describe('Software Product Dependencies Module Tests', function () {
	const softwareProductId = '555';
	const version = VersionFactory.build();


	it('mapStateToProps mapper exists', () => {
		expect(mapStateToProps).toBeTruthy();
	});

	it('Get Software Product Dependencies List', () => {
		const store = storeCreator();
		const dispatch = store.dispatch;

		let DependenciesListResponse = SoftwareProductDependenciesResponseFactory.buildList(2);
		let DependenciesListStore = DependenciesListResponse.map(dependency => SoftwareProductDependenciesStoreFactory.build(dependency));
		addNewRowElement(DependenciesListStore);
		const expectedStore = cloneAndSet(store.getState(), 'softwareProduct.softwareProductDependencies', DependenciesListStore);

		mockRest.addHandler('fetch', ({data, options, baseUrl}) => {
			expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies`);
			expect(data).toEqual(undefined);
			expect(options).toEqual(undefined);
			return {results: DependenciesListResponse};
		});

		return SoftwareProductDependenciesActionHelper.fetchDependencies(dispatch, {softwareProductId, version}).then(() => {
			const state = store.getState();
			const depndenciesWithGeneratedId = state.softwareProduct.softwareProductDependencies;
			const currentDependencies = expectedStore.softwareProduct.softwareProductDependencies;
			let expectedStoreDependencies = currentDependencies.map((dependency, index) => ({...dependency, id: depndenciesWithGeneratedId[index].id}));
			const newExpectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductDependencies', expectedStoreDependencies);
			expect(state).toEqual(newExpectedStore);
		});
	});

	/*
	Test update:
	- fetch initial item
	- update existing item
	- auto fetch again
	 */
	it('Update Software Product Dependency', () => {
		const store = storeCreator();
		const dispatch = store.dispatch;

		let DependenciesListResponse = SoftwareProductDependenciesResponseFactory.buildList(1);
		let DependenciesListStore = DependenciesListResponse.map(dependency => SoftwareProductDependenciesStoreFactory.build(dependency));
		addNewRowElement(DependenciesListStore);
		const expectedStore = cloneAndSet(store.getState(), 'softwareProduct.softwareProductDependencies', DependenciesListStore);

		mockRest.addHandler('fetch', ({data, options, baseUrl}) => {
			expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies`);
			expect(data).toEqual(undefined);
			expect(options).toEqual(undefined);
			return {results: DependenciesListResponse};
		});
		return SoftwareProductDependenciesActionHelper.fetchDependencies(dispatch, {softwareProductId, version}).then(() => {

			const state = store.getState();
			const depndenciesWithGeneratedId = state.softwareProduct.softwareProductDependencies;
			const currentDependencies = expectedStore.softwareProduct.softwareProductDependencies;
			let expectedStoreDependencies = currentDependencies.map((dependency, index) => ({...dependency, id: depndenciesWithGeneratedId[index].id}));
			let item = expectedStoreDependencies.find((dep) => dep.id !== NEW_RULE_TEMP_ID);
			item.targetId = 'testChangeTarget';
			item.sourceId = 'testChangesource';
			// removing 'new row' from response
			expectedStoreDependencies = expectedStoreDependencies.slice(0, expectedStoreDependencies.length - 1);
			let expDependenciesListStore = expectedStoreDependencies.map(dependency => SoftwareProductDependenciesStoreFactory.build(dependency));

			mockRest.addHandler('put', ({data, options, baseUrl}) => {
				expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies/${item.id}`);
				expect(data.targetId).toEqual('testChangeTarget');
				expect(data.sourceId).toEqual('testChangesource');
				expect(options).toEqual(undefined);
				return {results: null};
			});
			mockRest.addHandler('fetch', ({data, options, baseUrl}) => {
				expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies`);
				expect(data).toEqual(undefined);
				expect(options).toEqual(undefined);
				return {results: expDependenciesListStore};
			});

			addNewRowElement(expectedStoreDependencies);
			const newExpectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductDependencies', expectedStoreDependencies);
			return SoftwareProductDependenciesActionHelper.updateDependency(dispatch, {softwareProductId, version, item}).then(() => {
				const newState = store.getState();
				expect(newState).toEqual(newExpectedStore);

			});
		});
	});

	/*
	- Fetch item list
	- Delete item from list
	- Fetch again
	 */
	it('Delete Software Product Dependency', () => {
		const store = storeCreator();
		const dispatch = store.dispatch;
		let DependenciesListResponse = SoftwareProductDependenciesResponseFactory.buildList(1);
		let DependenciesListStore = DependenciesListResponse.map(dependency => SoftwareProductDependenciesStoreFactory.build(dependency));
		addNewRowElement(DependenciesListStore);
		const expectedStore = cloneAndSet(store.getState(), 'softwareProduct.softwareProductDependencies', DependenciesListStore);

		let deleteItem = DependenciesListStore.find((dep) => dep.id !== NEW_RULE_TEMP_ID);

		mockRest.addHandler('fetch', ({data, options, baseUrl}) => {
			expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies`);
			expect(data).toEqual(undefined);
			expect(options).toEqual(undefined);
			return {results: DependenciesListResponse};
		});
		mockRest.addHandler('destroy', ({data, options, baseUrl}) => {
			expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies/${deleteItem.id}`);
			expect(data).toEqual(undefined);
			expect(options).toEqual(undefined);
			return {results: null};
		});
		return SoftwareProductDependenciesActionHelper.fetchDependencies(dispatch, {softwareProductId, version}).then(() => {
			const state = store.getState();
			const depndenciesWithGeneratedId = state.softwareProduct.softwareProductDependencies;
			const currentDependencies = expectedStore.softwareProduct.softwareProductDependencies;
			let expectedStoreDependencies = currentDependencies.map((dependency, index) => ({...dependency, id: depndenciesWithGeneratedId[index].id}))

			const newExpectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductDependencies', expectedStoreDependencies);
			expect(state).toEqual(newExpectedStore);

			expectedStoreDependencies = expectedStoreDependencies.filter((dep) => dep.id !== deleteItem.id);
			const postDeleteExpectedStore = cloneAndSet(expectedStore, 'softwareProduct.softwareProductDependencies', expectedStoreDependencies);

			mockRest.addHandler('fetch', ({data, options, baseUrl}) => {
				expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies`);
				expect(data).toEqual(undefined);
				expect(options).toEqual(undefined);
				return {results: []};
			});

			return SoftwareProductDependenciesActionHelper.removeDependency(dispatch, {softwareProductId, version, item: deleteItem}).then(() => {
				const state = store.getState();
				const depndenciesWithGeneratedId = state.softwareProduct.softwareProductDependencies;
				const currentDependencies = postDeleteExpectedStore.softwareProduct.softwareProductDependencies;
				expect(depndenciesWithGeneratedId).toEqual(currentDependencies);
			});
		});
	});

	/*
	- Create initial list
	- Update the new row and make sure there is no API call
	- Submit the new row
	- Getch data with reset new row and new entity with info from the new item
	 */

	it('Create Software Product Dependency', () => {
		const store = storeCreator();
		const dispatch = store.dispatch;

		let DependenciesListResponse = SoftwareProductDependenciesResponseFactory.buildList(1);
		let DependenciesListStore = DependenciesListResponse.map(dependency => SoftwareProductDependenciesStoreFactory.build(dependency));
		addNewRowElement(DependenciesListStore);
		const expectedStore = cloneAndSet(store.getState(), 'softwareProduct.softwareProductDependencies', DependenciesListStore);

		mockRest.addHandler('fetch', ({data, options, baseUrl}) => {
			expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies`);
			expect(data).toEqual(undefined);
			expect(options).toEqual(undefined);
			return {results: DependenciesListResponse};
		});
		return SoftwareProductDependenciesActionHelper.fetchDependencies(dispatch, {softwareProductId, version}).then(() => {
			// setting properties on the 'new role' should not call an API
			let addItem = {id: NEW_RULE_TEMP_ID, sourceId: 'sId', targetId : 'tId',relationType: relationTypes.DEPENDS_ON};
			try {
				SoftwareProductDependenciesActionHelper.updateDependency(dispatch, {softwareProductId, version, item: addItem}).then(()=> {
					//go to error that fetch was not defined
				});
			} catch (error) {
				if(error.name === 'TypeError') {
					// Expected error because we expected there is no promise
				} else {
					fail('Error:' + error);
				}
			}

			const state = store.getState();
			const depndenciesWithGeneratedId = state.softwareProduct.softwareProductDependencies;
			const currentDependencies = expectedStore.softwareProduct.softwareProductDependencies;
			let expectedStoreDependencies = currentDependencies.map((dependency, index) => ({...dependency, id: depndenciesWithGeneratedId[index].id}));
			// creating the new item
			let item = SoftwareProductDependenciesResponseFactory.buildList(1,
				{sourceId: 'sId', targetId : 'tId',relationType: relationTypes.DEPENDS_ON})[0];
			addNewRowElement(expectedStoreDependencies, item);
			expectedStoreDependencies = expectedStoreDependencies.filter((dep) => dep.id !== NEW_RULE_TEMP_ID);

			mockRest.addHandler('post', ({data, options, baseUrl}) => {
				expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies`);
				expect(data.targetId).toEqual('tId');
				expect(data.sourceId).toEqual('sId');
				expect(data.id).toEqual(undefined);
				expect(options).toEqual(undefined);
				return {results: item.id};
			});
			mockRest.addHandler('fetch', ({data, options, baseUrl}) => {
				expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies`);
				expect(data).toEqual(undefined);
				expect(options).toEqual(undefined);
				return {results: expectedStoreDependencies};
			});

			let PostCreateItemListStore = expectedStoreDependencies.map(dependency => SoftwareProductDependenciesStoreFactory.build(dependency));
			addNewRowElement(PostCreateItemListStore);
			const newExpectedStore = cloneAndSet(store.getState(), 'softwareProduct.softwareProductDependencies', PostCreateItemListStore);

			return SoftwareProductDependenciesActionHelper.createDependency(dispatch, {softwareProductId, version, item: addItem}).then(() => {
				const newState = store.getState();
				expect(newState.softwareProduct.softwareProductDependencies.length).toEqual(3);
				expect(newState).toEqual(newExpectedStore);
			});

		});

	});


	it('Get Software Product Dependencies List with loop, and render to JSX', () => {
		const store = storeCreator();
		const dispatch = store.dispatch;

		let components = VSPComponentsFactory.buildList(2);
		let vspEditor = VSPEditorFactory.build({id: softwareProductId, version});

		let DependenciesListResponse = SoftwareProductDependenciesResponseFactory.buildList(2);
		let firstDependecy = DependenciesListResponse[0];
		let secondDependency = DependenciesListResponse[1];
		firstDependecy.sourceId = components[0].id;
		secondDependency.sourceId = components[1].id;
		firstDependecy.targetId = secondDependency.sourceId;
		secondDependency.targetId = firstDependecy.sourceId;

		let DependenciesListStore = DependenciesListResponse.map(dependency => SoftwareProductDependenciesStoreFactory.build({...dependency, hasCycle: true}));
		addNewRowElement(DependenciesListStore);
		const expectedStore = cloneAndSet(store.getState(), 'softwareProduct.softwareProductDependencies', DependenciesListStore);

		mockRest.addHandler('fetch', ({data, options, baseUrl}) => {
			expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/component-dependencies`);
			expect(data).toEqual(undefined);
			expect(options).toEqual(undefined);
			return {results: DependenciesListResponse};
		});

		mockRest.addHandler('fetch', ({options, data, baseUrl}) => {
			expect(baseUrl).toEqual(`/onboarding-api/v1.0/vendor-software-products/${softwareProductId}/versions/${version.id}/components`);
			expect(data).toEqual(undefined);
			expect(options).toEqual(undefined);
			return {results: components};
		});

		return SoftwareProductDependenciesActionHelper.fetchDependencies(dispatch, {softwareProductId, version}).then(() => {
			return SoftwareProductComponentsActionHelper.fetchSoftwareProductComponents(dispatch, {softwareProductId, version});
		}).then(() => {

			const state = store.getState();
			state.softwareProduct.softwareProductEditor = {data: vspEditor};
			const depndenciesWithGeneratedId = state.softwareProduct.softwareProductDependencies;
			const currentDependencies = expectedStore.softwareProduct.softwareProductDependencies;
			let expectedStoreDependencies = currentDependencies.map((dependency, index) => ({...dependency, id: depndenciesWithGeneratedId[index].id}));

			const newExpectedStore = {
				...expectedStore,
				softwareProduct: {
					...expectedStore.softwareProduct,
					softwareProductDependencies: expectedStoreDependencies,
					softwareProductEditor: {data: vspEditor},
					softwareProductComponents: {
						...expectedStore.softwareProduct.softwareProductComponents,
						componentsList: components
					}
				}
			};

			expect(state).toEqual(newExpectedStore);

			const props = mapStateToProps(state);
			expect(props.softwareProductDependencies).toEqual(expectedStoreDependencies);
/*
Fails on some weird react error about 2 react's loaded - may be some dependency
			const wrapper = mount(<SoftwareProductDependenciesView {...props}/>);
			expect(wrapper).toBeTruthy();
*/
		});
	});

});