TSTP Solution File: SWC213+1 by Zenon---0.7.1

View Problem - Process Solution

%------------------------------------------------------------------------------
% File     : Zenon---0.7.1
% Problem  : SWC213+1 : TPTP v8.1.0. Released v2.4.0.
% Transfm  : none
% Format   : tptp:raw
% Command  : run_zenon %s %d

% Computer : n010.cluster.edu
% Model    : x86_64 x86_64
% CPU      : Intel(R) Xeon(R) CPU E5-2620 v4 2.10GHz
% Memory   : 8042.1875MB
% OS       : Linux 3.10.0-693.el7.x86_64
% CPULimit : 300s
% WCLimit  : 600s
% DateTime : Tue Jul 19 22:29:53 EDT 2022

% Result   : Theorem 30.05s 30.22s
% Output   : Proof 30.05s
% Verified : 
% SZS Type : -

% Comments : 
%------------------------------------------------------------------------------
%----WARNING: Could not form TPTP format derivation
%------------------------------------------------------------------------------
%----ORIGINAL SYSTEM OUTPUT
% 0.03/0.12  % Problem  : SWC213+1 : TPTP v8.1.0. Released v2.4.0.
% 0.03/0.13  % Command  : run_zenon %s %d
% 0.12/0.34  % Computer : n010.cluster.edu
% 0.12/0.34  % Model    : x86_64 x86_64
% 0.12/0.34  % CPU      : Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz
% 0.12/0.34  % Memory   : 8042.1875MB
% 0.12/0.34  % OS       : Linux 3.10.0-693.el7.x86_64
% 0.12/0.34  % CPULimit : 300
% 0.12/0.34  % WCLimit  : 600
% 0.12/0.34  % DateTime : Sun Jun 12 09:55:40 EDT 2022
% 0.12/0.34  % CPUTime  : 
% 30.05/30.22  (* PROOF-FOUND *)
% 30.05/30.22  % SZS status Theorem
% 30.05/30.22  (* BEGIN-PROOF *)
% 30.05/30.22  % SZS output start Proof
% 30.05/30.22  Theorem co1 : (forall U : zenon_U, ((ssList U)->(forall V : zenon_U, ((ssList V)->(forall W : zenon_U, ((ssList W)->(forall X : zenon_U, ((ssList X)->((~(V = X))\/((~(U = W))\/((~(neq V (nil)))\/((forall Y : zenon_U, ((ssList Y)->(forall Z : zenon_U, ((ssList Z)->((~((app (app Y W) Z) = X))\/((~(equalelemsP W))\/((exists X1 : zenon_U, ((ssItem X1)/\(exists X2 : zenon_U, ((ssList X2)/\(((app X2 (cons X1 (nil))) = Y)/\(exists X3 : zenon_U, ((ssList X3)/\((app (cons X1 (nil)) X3) = W))))))))\/(exists X4 : zenon_U, ((ssItem X4)/\(exists X5 : zenon_U, ((ssList X5)/\(((app (cons X4 (nil)) X5) = Z)/\(exists X6 : zenon_U, ((ssList X6)/\((app X6 (cons X4 (nil))) = W)))))))))))))))\/((neq U (nil))\/((~((nil) = X))/\((nil) = W))))))))))))))).
% 30.05/30.22  Proof.
% 30.05/30.22  assert (zenon_L1_ : forall (zenon_TU_du : zenon_U), (ssList zenon_TU_du) -> (~(frontsegP zenon_TU_du (nil))) -> False).
% 30.05/30.22  do 1 intro. intros zenon_H60 zenon_H61.
% 30.05/30.22  generalize (ax45 zenon_TU_du). zenon_intro zenon_H63.
% 30.05/30.22  apply (zenon_imply_s _ _ zenon_H63); [ zenon_intro zenon_H65 | zenon_intro zenon_H64 ].
% 30.05/30.22  exact (zenon_H65 zenon_H60).
% 30.05/30.22  exact (zenon_H61 zenon_H64).
% 30.05/30.22  (* end of lemma zenon_L1_ *)
% 30.05/30.22  assert (zenon_L2_ : forall (zenon_TU_du : zenon_U), ((neq zenon_TU_du (nil))<->(~(zenon_TU_du = (nil)))) -> (~(neq zenon_TU_du (nil))) -> (~((nil) = zenon_TU_du)) -> False).
% 30.05/30.22  do 1 intro. intros zenon_H66 zenon_H67 zenon_H68.
% 30.05/30.22  apply (zenon_equiv_s _ _ zenon_H66); [ zenon_intro zenon_H67; zenon_intro zenon_H6b | zenon_intro zenon_H6a; zenon_intro zenon_H69 ].
% 30.05/30.22  apply zenon_H6b. zenon_intro zenon_H6c.
% 30.05/30.22  apply zenon_H68. apply sym_equal. exact zenon_H6c.
% 30.05/30.22  exact (zenon_H67 zenon_H6a).
% 30.05/30.22  (* end of lemma zenon_L2_ *)
% 30.05/30.22  assert (zenon_L3_ : forall (zenon_TU_du : zenon_U), (forall V : zenon_U, ((ssList V)->((neq zenon_TU_du V)<->(~(zenon_TU_du = V))))) -> (~(neq zenon_TU_du (nil))) -> (~((nil) = zenon_TU_du)) -> False).
% 30.05/30.22  do 1 intro. intros zenon_H6d zenon_H67 zenon_H68.
% 30.05/30.22  generalize (zenon_H6d (nil)). zenon_intro zenon_H6e.
% 30.05/30.22  apply (zenon_imply_s _ _ zenon_H6e); [ zenon_intro zenon_H6f | zenon_intro zenon_H66 ].
% 30.05/30.22  exact (zenon_H6f ax17).
% 30.05/30.22  apply (zenon_L2_ zenon_TU_du); trivial.
% 30.05/30.22  (* end of lemma zenon_L3_ *)
% 30.05/30.22  assert (zenon_L4_ : forall (zenon_TU_du : zenon_U), (ssList zenon_TU_du) -> (~(frontsegP (nil) zenon_TU_du)) -> (~(neq zenon_TU_du (nil))) -> False).
% 30.05/30.22  do 1 intro. intros zenon_H60 zenon_H70 zenon_H67.
% 30.05/30.22  generalize (ax15 zenon_TU_du). zenon_intro zenon_H71.
% 30.05/30.22  apply (zenon_imply_s _ _ zenon_H71); [ zenon_intro zenon_H65 | zenon_intro zenon_H6d ].
% 30.05/30.22  exact (zenon_H65 zenon_H60).
% 30.05/30.22  generalize (ax46 zenon_TU_du). zenon_intro zenon_H72.
% 30.05/30.22  apply (zenon_imply_s _ _ zenon_H72); [ zenon_intro zenon_H65 | zenon_intro zenon_H73 ].
% 30.05/30.22  exact (zenon_H65 zenon_H60).
% 30.05/30.22  apply (zenon_equiv_s _ _ zenon_H73); [ zenon_intro zenon_H70; zenon_intro zenon_H68 | zenon_intro zenon_H75; zenon_intro zenon_H74 ].
% 30.05/30.22  apply (zenon_L3_ zenon_TU_du); trivial.
% 30.05/30.22  exact (zenon_H70 zenon_H75).
% 30.05/30.22  (* end of lemma zenon_L4_ *)
% 30.05/30.22  assert (zenon_L5_ : forall (zenon_TU_du : zenon_U) (zenon_TX_er : zenon_U), ((neq zenon_TX_er zenon_TX_er)<->(~(zenon_TX_er = zenon_TX_er))) -> (zenon_TU_du = (nil)) -> ((nil) = zenon_TX_er) -> (~(zenon_TX_er = zenon_TU_du)) -> False).
% 30.05/30.22  do 2 intro. intros zenon_H76 zenon_H6c zenon_H77 zenon_H78.
% 30.05/30.22  apply (zenon_equiv_s _ _ zenon_H76); [ zenon_intro zenon_H7d; zenon_intro zenon_H7c | zenon_intro zenon_H7b; zenon_intro zenon_H7a ].
% 30.05/30.22  elim (classic (zenon_TU_du = zenon_TU_du)); [ zenon_intro zenon_H7e | zenon_intro zenon_H7f ].
% 30.05/30.22  cut ((zenon_TU_du = zenon_TU_du) = (zenon_TX_er = zenon_TU_du)).
% 30.05/30.22  intro zenon_D_pnotp.
% 30.05/30.22  apply zenon_H78.
% 30.05/30.22  rewrite <- zenon_D_pnotp.
% 30.05/30.22  exact zenon_H7e.
% 30.05/30.22  cut ((zenon_TU_du = zenon_TU_du)); [idtac | apply NNPP; zenon_intro zenon_H7f].
% 30.05/30.22  cut ((zenon_TU_du = zenon_TX_er)); [idtac | apply NNPP; zenon_intro zenon_H80].
% 30.05/30.22  congruence.
% 30.05/30.22  cut (((nil) = zenon_TX_er) = (zenon_TU_du = zenon_TX_er)).
% 30.05/30.22  intro zenon_D_pnotp.
% 30.05/30.22  apply zenon_H80.
% 30.05/30.22  rewrite <- zenon_D_pnotp.
% 30.05/30.22  exact zenon_H77.
% 30.05/30.22  cut ((zenon_TX_er = zenon_TX_er)); [idtac | apply NNPP; zenon_intro zenon_H7a].
% 30.05/30.22  cut (((nil) = zenon_TU_du)); [idtac | apply NNPP; zenon_intro zenon_H68].
% 30.05/30.22  congruence.
% 30.05/30.22  elim (classic (zenon_TU_du = zenon_TU_du)); [ zenon_intro zenon_H7e | zenon_intro zenon_H7f ].
% 30.05/30.22  cut ((zenon_TU_du = zenon_TU_du) = ((nil) = zenon_TU_du)).
% 30.05/30.22  intro zenon_D_pnotp.
% 30.05/30.22  apply zenon_H68.
% 30.05/30.22  rewrite <- zenon_D_pnotp.
% 30.05/30.22  exact zenon_H7e.
% 30.05/30.22  cut ((zenon_TU_du = zenon_TU_du)); [idtac | apply NNPP; zenon_intro zenon_H7f].
% 30.05/30.22  cut ((zenon_TU_du = (nil))); [idtac | apply NNPP; zenon_intro zenon_H69].
% 30.05/30.22  congruence.
% 30.05/30.22  exact (zenon_H69 zenon_H6c).
% 30.05/30.22  apply zenon_H7f. apply refl_equal.
% 30.05/30.22  apply zenon_H7f. apply refl_equal.
% 30.05/30.22  exact (zenon_H7c zenon_H7a).
% 30.05/30.22  apply zenon_H7f. apply refl_equal.
% 30.05/30.22  apply zenon_H7f. apply refl_equal.
% 30.05/30.22  apply zenon_H7a. apply refl_equal.
% 30.05/30.22  (* end of lemma zenon_L5_ *)
% 30.05/30.22  assert (zenon_L6_ : forall (zenon_TU_du : zenon_U) (zenon_TX_er : zenon_U), (ssList zenon_TX_er) -> (zenon_TU_du = (nil)) -> ((nil) = zenon_TX_er) -> (~(zenon_TX_er = zenon_TU_du)) -> False).
% 30.05/30.22  do 2 intro. intros zenon_H81 zenon_H6c zenon_H77 zenon_H78.
% 30.05/30.22  generalize (ax15 zenon_TX_er). zenon_intro zenon_H82.
% 30.05/30.22  apply (zenon_imply_s _ _ zenon_H82); [ zenon_intro zenon_H84 | zenon_intro zenon_H83 ].
% 30.05/30.22  exact (zenon_H84 zenon_H81).
% 30.05/30.22  generalize (zenon_H83 zenon_TX_er). zenon_intro zenon_H85.
% 30.05/30.22  apply (zenon_imply_s _ _ zenon_H85); [ zenon_intro zenon_H84 | zenon_intro zenon_H76 ].
% 30.05/30.22  exact (zenon_H84 zenon_H81).
% 30.05/30.22  apply (zenon_L5_ zenon_TU_du zenon_TX_er); trivial.
% 30.05/30.22  (* end of lemma zenon_L6_ *)
% 30.05/30.22  assert (zenon_L7_ : (~((nil) = (nil))) -> False).
% 30.05/30.22  do 0 intro. intros zenon_H86.
% 30.05/30.22  apply zenon_H86. apply refl_equal.
% 30.05/30.22  (* end of lemma zenon_L7_ *)
% 30.05/30.22  apply NNPP. intro zenon_G.
% 30.05/30.22  apply (zenon_notallex_s (fun U : zenon_U => ((ssList U)->(forall V : zenon_U, ((ssList V)->(forall W : zenon_U, ((ssList W)->(forall X : zenon_U, ((ssList X)->((~(V = X))\/((~(U = W))\/((~(neq V (nil)))\/((forall Y : zenon_U, ((ssList Y)->(forall Z : zenon_U, ((ssList Z)->((~((app (app Y W) Z) = X))\/((~(equalelemsP W))\/((exists X1 : zenon_U, ((ssItem X1)/\(exists X2 : zenon_U, ((ssList X2)/\(((app X2 (cons X1 (nil))) = Y)/\(exists X3 : zenon_U, ((ssList X3)/\((app (cons X1 (nil)) X3) = W))))))))\/(exists X4 : zenon_U, ((ssItem X4)/\(exists X5 : zenon_U, ((ssList X5)/\(((app (cons X4 (nil)) X5) = Z)/\(exists X6 : zenon_U, ((ssList X6)/\((app X6 (cons X4 (nil))) = W)))))))))))))))\/((neq U (nil))\/((~((nil) = X))/\((nil) = W))))))))))))))) zenon_G); [ zenon_intro zenon_H87; idtac ].
% 30.05/30.22  elim zenon_H87. zenon_intro zenon_TU_du. zenon_intro zenon_H88.
% 30.05/30.22  apply (zenon_notimply_s _ _ zenon_H88). zenon_intro zenon_H60. zenon_intro zenon_H89.
% 30.05/30.22  apply (zenon_notallex_s (fun V : zenon_U => ((ssList V)->(forall W : zenon_U, ((ssList W)->(forall X : zenon_U, ((ssList X)->((~(V = X))\/((~(zenon_TU_du = W))\/((~(neq V (nil)))\/((forall Y : zenon_U, ((ssList Y)->(forall Z : zenon_U, ((ssList Z)->((~((app (app Y W) Z) = X))\/((~(equalelemsP W))\/((exists X1 : zenon_U, ((ssItem X1)/\(exists X2 : zenon_U, ((ssList X2)/\(((app X2 (cons X1 (nil))) = Y)/\(exists X3 : zenon_U, ((ssList X3)/\((app (cons X1 (nil)) X3) = W))))))))\/(exists X4 : zenon_U, ((ssItem X4)/\(exists X5 : zenon_U, ((ssList X5)/\(((app (cons X4 (nil)) X5) = Z)/\(exists X6 : zenon_U, ((ssList X6)/\((app X6 (cons X4 (nil))) = W)))))))))))))))\/((neq zenon_TU_du (nil))\/((~((nil) = X))/\((nil) = W))))))))))))) zenon_H89); [ zenon_intro zenon_H8a; idtac ].
% 30.05/30.22  elim zenon_H8a. zenon_intro zenon_TV_fj. zenon_intro zenon_H8c.
% 30.05/30.22  apply (zenon_notimply_s _ _ zenon_H8c). zenon_intro zenon_H8e. zenon_intro zenon_H8d.
% 30.05/30.22  apply (zenon_notallex_s (fun W : zenon_U => ((ssList W)->(forall X : zenon_U, ((ssList X)->((~(zenon_TV_fj = X))\/((~(zenon_TU_du = W))\/((~(neq zenon_TV_fj (nil)))\/((forall Y : zenon_U, ((ssList Y)->(forall Z : zenon_U, ((ssList Z)->((~((app (app Y W) Z) = X))\/((~(equalelemsP W))\/((exists X1 : zenon_U, ((ssItem X1)/\(exists X2 : zenon_U, ((ssList X2)/\(((app X2 (cons X1 (nil))) = Y)/\(exists X3 : zenon_U, ((ssList X3)/\((app (cons X1 (nil)) X3) = W))))))))\/(exists X4 : zenon_U, ((ssItem X4)/\(exists X5 : zenon_U, ((ssList X5)/\(((app (cons X4 (nil)) X5) = Z)/\(exists X6 : zenon_U, ((ssList X6)/\((app X6 (cons X4 (nil))) = W)))))))))))))))\/((neq zenon_TU_du (nil))\/((~((nil) = X))/\((nil) = W))))))))))) zenon_H8d); [ zenon_intro zenon_H8f; idtac ].
% 30.05/30.22  elim zenon_H8f. zenon_intro zenon_TW_fo. zenon_intro zenon_H91.
% 30.05/30.22  apply (zenon_notimply_s _ _ zenon_H91). zenon_intro zenon_H93. zenon_intro zenon_H92.
% 30.05/30.22  apply (zenon_notallex_s (fun X : zenon_U => ((ssList X)->((~(zenon_TV_fj = X))\/((~(zenon_TU_du = zenon_TW_fo))\/((~(neq zenon_TV_fj (nil)))\/((forall Y : zenon_U, ((ssList Y)->(forall Z : zenon_U, ((ssList Z)->((~((app (app Y zenon_TW_fo) Z) = X))\/((~(equalelemsP zenon_TW_fo))\/((exists X1 : zenon_U, ((ssItem X1)/\(exists X2 : zenon_U, ((ssList X2)/\(((app X2 (cons X1 (nil))) = Y)/\(exists X3 : zenon_U, ((ssList X3)/\((app (cons X1 (nil)) X3) = zenon_TW_fo))))))))\/(exists X4 : zenon_U, ((ssItem X4)/\(exists X5 : zenon_U, ((ssList X5)/\(((app (cons X4 (nil)) X5) = Z)/\(exists X6 : zenon_U, ((ssList X6)/\((app X6 (cons X4 (nil))) = zenon_TW_fo)))))))))))))))\/((neq zenon_TU_du (nil))\/((~((nil) = X))/\((nil) = zenon_TW_fo))))))))) zenon_H92); [ zenon_intro zenon_H94; idtac ].
% 30.05/30.22  elim zenon_H94. zenon_intro zenon_TX_er. zenon_intro zenon_H95.
% 30.05/30.22  apply (zenon_notimply_s _ _ zenon_H95). zenon_intro zenon_H81. zenon_intro zenon_H96.
% 30.05/30.22  apply (zenon_notor_s _ _ zenon_H96). zenon_intro zenon_H98. zenon_intro zenon_H97.
% 30.05/30.22  apply (zenon_notor_s _ _ zenon_H97). zenon_intro zenon_H9a. zenon_intro zenon_H99.
% 30.05/30.22  apply (zenon_notor_s _ _ zenon_H99). zenon_intro zenon_H9c. zenon_intro zenon_H9b.
% 30.05/30.22  apply (zenon_notor_s _ _ zenon_H9b). zenon_intro zenon_H9e. zenon_intro zenon_H9d.
% 30.05/30.22  apply (zenon_notor_s _ _ zenon_H9d). zenon_intro zenon_H67. zenon_intro zenon_H9f.
% 30.05/30.22  apply zenon_H9c. zenon_intro zenon_Ha0.
% 30.05/30.22  apply zenon_H9a. zenon_intro zenon_Ha1.
% 30.05/30.22  apply zenon_H98. zenon_intro zenon_Ha2.
% 30.05/30.22  apply (zenon_notand_s _ _ zenon_H9f); [ zenon_intro zenon_Ha4 | zenon_intro zenon_Ha3 ].
% 30.05/30.22  apply zenon_Ha4. zenon_intro zenon_H77.
% 30.05/30.22  cut ((neq zenon_TV_fj (nil)) = (neq zenon_TU_du (nil))).
% 30.05/30.22  intro zenon_D_pnotp.
% 30.05/30.22  apply zenon_H67.
% 30.05/30.22  rewrite <- zenon_D_pnotp.
% 30.05/30.22  exact zenon_Ha0.
% 30.05/30.22  cut (((nil) = (nil))); [idtac | apply NNPP; zenon_intro zenon_H86].
% 30.05/30.22  cut ((zenon_TV_fj = zenon_TU_du)); [idtac | apply NNPP; zenon_intro zenon_Ha5].
% 30.05/30.22  congruence.
% 30.05/30.22  generalize (ax41 zenon_TU_du). zenon_intro zenon_Ha6.
% 30.05/30.22  apply (zenon_imply_s _ _ zenon_Ha6); [ zenon_intro zenon_H65 | zenon_intro zenon_Ha7 ].
% 30.05/30.22  exact (zenon_H65 zenon_H60).
% 30.05/30.22  generalize (zenon_Ha7 (nil)). zenon_intro zenon_Ha8.
% 30.05/30.22  apply (zenon_imply_s _ _ zenon_Ha8); [ zenon_intro zenon_H6f | zenon_intro zenon_Ha9 ].
% 30.05/30.22  exact (zenon_H6f ax17).
% 30.05/30.22  apply (zenon_imply_s _ _ zenon_Ha9); [ zenon_intro zenon_Haa | zenon_intro zenon_H6c ].
% 30.05/30.22  apply (zenon_notand_s _ _ zenon_Haa); [ zenon_intro zenon_H61 | zenon_intro zenon_H70 ].
% 30.05/30.22  apply (zenon_L1_ zenon_TU_du); trivial.
% 30.05/30.22  apply (zenon_L4_ zenon_TU_du); trivial.
% 30.05/30.22  cut ((zenon_TV_fj = zenon_TX_er) = (zenon_TV_fj = zenon_TU_du)).
% 30.05/30.22  intro zenon_D_pnotp.
% 30.05/30.22  apply zenon_Ha5.
% 30.05/30.22  rewrite <- zenon_D_pnotp.
% 30.05/30.22  exact zenon_Ha2.
% 30.05/30.22  cut ((zenon_TX_er = zenon_TU_du)); [idtac | apply NNPP; zenon_intro zenon_H78].
% 30.05/30.22  cut ((zenon_TV_fj = zenon_TV_fj)); [idtac | apply NNPP; zenon_intro zenon_Hab].
% 30.05/30.22  congruence.
% 30.05/30.22  apply zenon_Hab. apply refl_equal.
% 30.05/30.22  apply (zenon_L6_ zenon_TU_du zenon_TX_er); trivial.
% 30.05/30.22  apply zenon_H86. apply refl_equal.
% 30.05/30.22  cut ((zenon_TU_du = zenon_TW_fo) = ((nil) = zenon_TW_fo)).
% 30.05/30.22  intro zenon_D_pnotp.
% 30.05/30.22  apply zenon_Ha3.
% 30.05/30.22  rewrite <- zenon_D_pnotp.
% 30.05/30.22  exact zenon_Ha1.
% 30.05/30.22  cut ((zenon_TW_fo = zenon_TW_fo)); [idtac | apply NNPP; zenon_intro zenon_Hac].
% 30.05/30.22  cut ((zenon_TU_du = (nil))); [idtac | apply NNPP; zenon_intro zenon_H69].
% 30.05/30.22  congruence.
% 30.05/30.22  elim (classic ((nil) = (nil))); [ zenon_intro zenon_Had | zenon_intro zenon_H86 ].
% 30.05/30.22  cut (((nil) = (nil)) = (zenon_TU_du = (nil))).
% 30.05/30.22  intro zenon_D_pnotp.
% 30.05/30.22  apply zenon_H69.
% 30.05/30.22  rewrite <- zenon_D_pnotp.
% 30.05/30.22  exact zenon_Had.
% 30.05/30.22  cut (((nil) = (nil))); [idtac | apply NNPP; zenon_intro zenon_H86].
% 30.05/30.22  cut (((nil) = zenon_TU_du)); [idtac | apply NNPP; zenon_intro zenon_H68].
% 30.05/30.22  congruence.
% 30.05/30.22  generalize (ax15 zenon_TU_du). zenon_intro zenon_H71.
% 30.05/30.22  apply (zenon_imply_s _ _ zenon_H71); [ zenon_intro zenon_H65 | zenon_intro zenon_H6d ].
% 30.05/30.22  exact (zenon_H65 zenon_H60).
% 30.05/30.22  apply (zenon_L3_ zenon_TU_du); trivial.
% 30.05/30.22  apply zenon_H86. apply refl_equal.
% 30.05/30.23  apply zenon_H86. apply refl_equal.
% 30.05/30.23  apply zenon_Hac. apply refl_equal.
% 30.05/30.23  Qed.
% 30.05/30.23  % SZS output end Proof
% 30.05/30.23  (* END-PROOF *)
% 30.05/30.23  nodes searched: 259546
% 30.05/30.23  max branch formulas: 14009
% 30.05/30.23  proof nodes created: 20838
% 30.05/30.23  formulas created: 1420011
% 30.05/30.23  
%------------------------------------------------------------------------------